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ípus | Modbus objektum | Funkciókódok | Hozzáférés |
|---|---|---|---|
C | Coil | FC01 olvasás, FC05 / FC15 írás | olvasás és írás |
D | Diszkrét bemenet (discrete input) | FC02 | csak olvasás |
H | Holding regiszter | FC03 olvasás, FC06 / FC16 írás | olvasás és írás |
A | Input regiszter | FC04 | csak 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.
| |
| Név | Típus | Leírás |
|---|---|---|
registerType | C, D, H, A | Lásd: Regisztertípusok. |
register | szám | Regisztercím 0 – 65535, decimálisan vagy hexadecimálisan (0x14). |
dataType | Modbus adattípus | Ez határozza meg, hány regiszter olvasódik ki: 1, 2 vagy 4. |
numberOfRegisters | szám | String 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 charactersHibá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.
| |
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 aBooladattípust fogadja el; aDés azAnem í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.
| |
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.
| |
| Regisztertípus | Visszatérési érték | Legnagyobb count |
|---|---|---|
H, A | collection<uint16> | 123 (FC03 / FC04) |
C, D | collection<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 101Hibá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.
| |
| Regisztertípus | Gyűjtemény | Legnagyobb hossz |
|---|---|---|
H | collection<uint16> | 123 (FC16) |
C | collection<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.
| |
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.