TapHome

Funkcije Modbus

Funkcije Modbus u skripti TapHome — MODBUSR, MODBUSW, MODBUSWNE i blokovske funkcije MODBUSRBLOCK, MODBUSWBLOCK, MODBUSWBLOCKNE — te tipovi registara Modbus C, D, H i A.

Funkcije Modbus čitaju i zapisuju coilove i registre uređaja Modbus kojemu skripta pripada. Rade samo u skriptama modula ili uređaja Modbus; bilo gdje drugdje skripta se zaustavlja pogreškom ModbusFunction - unknown modbus device to work with. Nazivi tipova podataka (Uint16, BigEndianFloat, …) nalaze se na stranici Tipovi podataka Modbus. Postavljanje modula i predložaka opisano je na stranici Integracija Modbus.

Tipovi registara

Prvi argument svake funkcije Modbus je tip registra.

TipObjekt ModbusKodovi funkcijaPristup
CCoilFC01 čitanje, FC05 / FC15 zapisčitanje i zapis
DDiscrete inputFC02samo čitanje
HHolding registerFC03 čitanje, FC06 / FC16 zapisčitanje i zapis
AInput registerFC04samo čitanje

SC i SH su starije vrijednosti koje skripte još prihvaćaju. Adresiraju iste coilove i holding registre kao C i H, ali ih modul pri svakom pozivu čita iz uređaja umjesto iz međuspremnika i zapisuje jedan registar po zahtjevu (FC05 / FC06). U novim skriptama koristite C i H. Ovo ponašanje preuzeto je iz koda enginea i nije provjereno na uređaju.

MODBUSR

MODBUSR čita jednu vrijednost iz coila, discrete inputa ili jednog ili više registara i pretvara je u zadani tip podataka.

1
2
MODBUSR(registerType, register, dataType)
MODBUSR(registerType, register, String, numberOfRegisters)
NazivTipOpis
registerTypeC, D, H, AVidi Tipovi registara.
registerbrojAdresa registra 0 – 65535, dekadski ili heksadecimalno (0x14).
dataTypetip podataka ModbusOdređuje koliko se registara čita: 1, 2 ili 4.
numberOfRegistersbrojObavezno za String, 0 – 123. Jedan registar sadrži 2 znaka.

Vraća — broj za 16- i 32-bitne tipove, Float i Double; bool za Bool; int64 ili uint64 za Int64 i UInt64; string za String, koji završava na prvom nultom bajtu.

Napomene — Vrijednost u više registara čita se jednim zahtjevom, pa svi njezini registri potječu iz istog trenutka.

Primjer

MODBUSR(H, 20, Int16) / 100;
# Result: the register as a signed number, divided by 100
MODBUSR(A, 0x0040, Uint32);
MODBUSR(H, 14, String, 4);
# Result: text of up to 8 characters

Pogreške — Invalid register number: X; String data type must have specified length - number of registers to read.

MODBUSW

MODBUSW upisuje jednu vrijednost ili do 101 vrijednosti u uzastopne registre i vraća TRUE.

1
MODBUSW(registerType, register, dataType, value [, value2, …])

Napomene

  • S više vrijednosti adresa registra pomiče se za veličinu tipa podataka — 1, 2 ili 4 registra po vrijednosti.
  • Coil (C) prihvaća samo tip podataka Bool; u D i A ne može se pisati.
  • Kako se vrijednosti zaokružuju i provjeravaju, opisano je u odjeljku Zapis vrijednosti.

Primjer

MODBUSW(H, 20, Int16, Te * 100);
MODBUSW(H, 100, Uint16, 1, 2, 3);
# Result: TRUE — registers 100, 101 and 102 are written
MODBUSW(C, 5, Bool, St);

Pogreške — WriteInt16: Cannot write Int16 to coils (i isto za druge tipove); Invalid register number: X.

MODBUSWNE

MODBUSWNE („write if not equal”, zapis samo kod razlike) upisuje jednu vrijednost kao MODBUSW, ali samo kada se razlikuje od vrijednosti u registru, čime se štedi promet na sabirnici i ciklusi zapisa u EEPROM uređaja.

1
MODBUSWNE(registerType, register, dataType, value)

Napomene

  • Vrijednost se uspoređuje s međuspremnikom registara modula. Kada je uključen prefetch, to je vrijednost pročitana posljednjim prefetchom (registar se dodaje u prefetch); registar koji još nije pročitan najprije se pročita. S postavkom No prefetch registar se čita iz uređaja neposredno prije usporedbe.
  • Nikada se ne uspoređuje s vrijednošću upisanom prošli put: zapis ne mijenja vrijednost u međuspremniku dok se registar ponovno ne pročita.
  • Vrijednost u više registara uspoređuje se i zapisuje kao cjelina.

Primjer — konfiguracija u inicijalizacijskoj skripti

MODBUSWNE(H, 27, Uint16, 0);

MODBUSRBLOCK

MODBUSRBLOCK čita blok uzastopnih registara ili coilova u jednoj transakciji Modbus i vraća ih kao zbirku.

1
MODBUSRBLOCK(registerType, register, count)
Tip registraVraćaNajveći count
H, Acollection<uint16>123 (FC03 / FC04)
C, Dcollection<bool>2000 (FC01 / FC02)

Napomene — Kada je prefetch uključen, registri koji su već u međuspremniku ne čitaju se ponovno; oni koji nedostaju čitaju se jednim zahtjevom. Vrijednosti s tipom iz bloka čitajte funkcijom UNPACKVALUE. Jedno čitanje bloka zamjenjuje mnogo pojedinačnih čitanja.

Primjer

collection<uint16> data := MODBUSRBLOCK(H, 100, 4);
UNPACKVALUE(data, 0, BigEndianFloat);
# Result: the float in registers 100 and 101

Pogreške — MODBUSRBLOCK: count must be between 1 and 123 for 16-bit registers (H); MODBUSRBLOCK: invalid register range X..Y.

Dostupno — Core 2026.1, build 39001 ili noviji (aplikacija s buildom 39016 ili novijim). Isto vrijedi za MODBUSWBLOCK i MODBUSWBLOCKNE.

MODBUSWBLOCK

MODBUSWBLOCK upisuje cijelu zbirku u uzastopne holding registre ili coilove u jednoj transakciji Modbus i vraća TRUE. Blok dulji od veličine grupe prefetcha modula (zadano 100) dijeli se na nekoliko uzastopnih zahtjeva.

1
MODBUSWBLOCK(registerType, register, collection)
Tip registraZbirkaNajveća duljina
Hcollection<uint16>123 (FC16)
Ccollection<bool>1968 (FC15)

Primjer — postavljanje coilova 0 i 3, brisanje coilova 1, 2 i 4 do 7

collection<bool> coils := BOOLCOLLECTION(8);
SETAT(coils, 0, TRUE);
SETAT(coils, 3, TRUE);
MODBUSWBLOCK(C, 0, coils);

Pogreške — MODBUSWBLOCK: cannot write to read-only registers (D); MODBUSWBLOCK: register type C expects Collection<Bool>, got Collection<UInt16>.

MODBUSWBLOCKNE

MODBUSWBLOCKNE upisuje zbirku kao MODBUSWBLOCK, ali samo kada se barem jedna vrijednost razlikuje od trenutnog sadržaja registara; promijenjeni blok zapisuje se na isti način i dijeli prema istoj veličini grupe.

1
MODBUSWBLOCKNE(registerType, register, collection)

Napomene — Trenutni sadržaj čita se na isti način kao kod MODBUSWNE.

Primjer — promjena jednog registra bloka uz najmanji promet na sabirnici

collection<uint16> c := MODBUSRBLOCK(H, 100, 4);
PACKVALUE(c, 1, Uint16, 9);
MODBUSWBLOCKNE(H, 100, c);

Vidi također — Skripte Modbus i prefetch, Binarni podaci, Operacije s bitovima.