TapHome

Modbus függvények

TapHome szkript Modbus függvények — MODBUSR, MODBUSW, MODBUSWNE és a MODBUSRBLOCK, MODBUSWBLOCK, MODBUSWBLOCKNE blokkfüggvények —, valamint a C, D, H és A Modbus regisztertípusok.

A Modbus függvények annak a Modbus eszköznek a coiljait és regisztereit olvassák és írják, amelyhez a szkript tartozik. Csak Modbus modul vagy eszköz szkriptjeiben működnek; máshol a szkript a ModbusFunction - unknown modbus device to work with hibával leáll. Az adattípusnevek (Uint16, BigEndianFloat, …) a Modbus adattípusok oldalon találhatók. A modul és a sablonok beállítását a Modbus integráció írja le.

Regisztertípusok

Minden Modbus függvény első argumentuma a regisztertípus.

TípusModbus objektumFunkciókódokHozzáférés
CCoilFC01 olvasás, FC05 / FC15 írásolvasás és írás
DDiszkrét bemenet (discrete input)FC02csak olvasás
HHolding regiszterFC03 olvasás, FC06 / FC16 írásolvasás és írás
AInput regiszterFC04csak olvasás

Az SC és az SH régebbi értékek, amelyeket a szkriptek még elfogadnak. Ugyanazokat a coilokat és holding regisztereket címzik, mint a C és a H, de a modul minden hívásnál az eszközből olvassa őket a gyorsítótár helyett, és kérésenként egy regisztert ír (FC05 / FC06). Új szkriptekben a C és a H típust használd. Ez a viselkedés a motor kódjából származik, eszközön nem ellenőriztük.

MODBUSR

A MODBUSR egy értéket olvas ki egy coilból, egy diszkrét bemenetből vagy egy vagy több regiszterből, és a megadott adattípusra alakítja.

1
2
MODBUSR(registerType, register, dataType)
MODBUSR(registerType, register, String, numberOfRegisters)
NévTípusLeírás
registerTypeC, D, H, ALásd: Regisztertípusok.
registerszámRegisztercím 0 – 65535, decimálisan vagy hexadecimálisan (0x14).
dataTypeModbus adattípusEz határozza meg, hány regiszter olvasódik ki: 1, 2 vagy 4.
numberOfRegistersszámString esetén kötelező, 0 – 123. Egy regiszter 2 karaktert tárol.

Visszatérési érték — szám a 16 és 32 bites típusoknál, a Float és a Double esetén; Bool esetén bool; Int64 és UInt64 esetén int64 vagy uint64; String esetén szöveg, amely az első nulla bájtnál ér véget.

Megjegyzések — A több regiszterből álló érték egyetlen kéréssel olvasódik ki, így minden regisztere ugyanabból a pillanatból származik.

Példa

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

Hibák — Invalid register number: X; String data type must have specified length - number of registers to read.

MODBUSW

A MODBUSW egy értéket, vagy legfeljebb 101 értéket egymást követő regiszterekbe ír, és TRUE értéket ad vissza.

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

Megjegyzések

  • Több érték esetén a regisztercím az adattípus méretével lép tovább — értékenként 1, 2 vagy 4 regiszterrel.
  • A coil (C) csak a Bool adattípust fogadja el; a D és az A nem írható.
  • Az értékek kerekítését és ellenőrzését az Értékek írása rész írja le.

Példa

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);

Hibák — WriteInt16: Cannot write Int16 to coils (és ugyanez a többi típusra); Invalid register number: X.

MODBUSWNE

A MODBUSWNE („write if not equal”, azaz írás csak eltérő érték esetén) a MODBUSW függvényhez hasonlóan egy értéket ír, de csak akkor, ha az eltér a regiszterben lévő értéktől — így kíméli a buszforgalmat és az eszköz EEPROM-jának írási ciklusait.

1
MODBUSWNE(registerType, register, dataType, value)

Megjegyzések

  • Az érték a modul regiszter-gyorsítótárával hasonlítódik össze. Bekapcsolt prefetch esetén ez az utolsó prefetch által kiolvasott érték (a regiszter bekerül a prefetchbe); a még ki nem olvasott regiszter előbb kiolvasódik. No prefetch beállítás esetén a regiszter közvetlenül az összehasonlítás előtt olvasódik ki az eszközből.
  • Soha nem a legutóbb írt értékkel hasonlít össze: az írás nem változtatja meg a gyorsítótárban lévő értéket, amíg a regisztert újra ki nem olvassa.
  • A több regiszterből álló érték egészként hasonlítódik össze és íródik.

Példa — konfiguráció az inicializáló szkriptben

MODBUSWNE(H, 27, Uint16, 0);

MODBUSRBLOCK

A MODBUSRBLOCK egymást követő regiszterek vagy coilok blokkját olvassa ki egyetlen Modbus tranzakcióban, és gyűjteményként adja vissza.

1
MODBUSRBLOCK(registerType, register, count)
RegisztertípusVisszatérési értékLegnagyobb count
H, Acollection<uint16>123 (FC03 / FC04)
C, Dcollection<bool>2000 (FC01 / FC02)

Megjegyzések — Bekapcsolt prefetch esetén a gyorsítótárban már meglévő regiszterek nem olvasódnak ki újra; a hiányzók egyetlen kéréssel olvasódnak ki. A blokkból az UNPACKVALUE függvénnyel olvashatsz ki típusos értékeket. Egyetlen blokkolvasás sok egyedi olvasást vált ki.

Példa

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

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

Elérhetőség — Core 2026.1, build 39001 vagy újabb (alkalmazás build 39016 vagy újabb). Ugyanez érvényes a MODBUSWBLOCK és a MODBUSWBLOCKNE függvényre.

MODBUSWBLOCK

A MODBUSWBLOCK egy teljes gyűjteményt ír egymást követő holding regiszterekbe vagy coilokba egyetlen Modbus tranzakcióban, és TRUE értéket ad vissza. A modul prefetch csoportméreténél (alapértelmezés szerint 100) hosszabb blokk több egymást követő kérésre bomlik.

1
MODBUSWBLOCK(registerType, register, collection)
RegisztertípusGyűjteményLegnagyobb hossz
Hcollection<uint16>123 (FC16)
Ccollection<bool>1968 (FC15)

Példa — a 0. és 3. coil bekapcsolása, az 1., 2. és a 4–7. coil kikapcsolása

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

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

MODBUSWBLOCKNE

A MODBUSWBLOCKNE a MODBUSWBLOCK függvényhez hasonlóan ír egy gyűjteményt, de csak akkor, ha legalább egy érték eltér a regiszterek aktuális tartalmától; a megváltozott blokk ugyanúgy íródik, ugyanazzal a csoportmérettel felosztva.

1
MODBUSWBLOCKNE(registerType, register, collection)

Megjegyzések — Az aktuális tartalom ugyanúgy olvasódik ki, mint a MODBUSWNE esetén.

Példa — egy blokk egyetlen regiszterének módosítása minimális buszforgalommal

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

Lásd még — Modbus szkriptek és prefetch, Bináris adatok, Bitműveletek.