Funkcie Modbus
Funkcie Modbus v skripte TapHome — MODBUSR, MODBUSW, MODBUSWNE a blokové funkcie MODBUSRBLOCK, MODBUSWBLOCK, MODBUSWBLOCKNE — a typy Modbus registrov C, D, H a A.
Funkcie Modbus čítajú a zapisujú coily a registre Modbus zariadenia, ktorému skript patrí. Fungujú iba v skriptoch Modbus modulu alebo zariadenia; kdekoľvek inde sa skript zastaví chybou ModbusFunction - unknown modbus device to work with. Názvy dátových typov (Uint16, BigEndianFloat, …) sú na stránke Dátové typy Modbus. Nastavenie modulu a šablón opisuje stránka Integrácia Modbus.
Typy registrov
Prvým argumentom každej funkcie Modbus je typ registra.
| Typ | Modbus objekt | Funkčné kódy | Prístup |
|---|---|---|---|
C | Coil | FC01 čítanie, FC05 / FC15 zápis | čítanie aj zápis |
D | Discrete input | FC02 | iba čítanie |
H | Holding register | FC03 čítanie, FC06 / FC16 zápis | čítanie aj zápis |
A | Input register | FC04 | iba čítanie |
SC a SH sú staršie hodnoty, ktoré skripty stále prijímajú. Adresujú tie isté coily a holding registre ako C a H, ale modul ich pri každom volaní číta zo zariadenia namiesto z vyrovnávacej pamäte a zapisuje ich po jednom registri na požiadavku (FC05 / FC06). V nových skriptoch používajte C a H. Toto správanie vychádza zo zdrojového kódu a na zariadení nebolo overené.
MODBUSR
MODBUSR prečíta jednu hodnotu z coilu, z discrete inputu alebo z jedného či viacerých registrov a prevedie ju na zadaný dátový typ.
| |
| Názov | Typ | Popis |
|---|---|---|
registerType | C, D, H, A | Pozrite Typy registrov. |
register | číslo | Adresa registra 0 – 65535, desiatkovo alebo hexadecimálne (0x14). |
dataType | dátový typ Modbus | Určuje, koľko registrov sa prečíta: 1, 2 alebo 4. |
numberOfRegisters | číslo | Povinné pre String, 0 – 123. Jeden register obsahuje 2 znaky. |
Návratová hodnota — číslo pre 16- a 32-bitové typy, Float a Double; bool pre Bool; int64 alebo uint64 pre Int64 a UInt64; reťazec pre String, ktorý končí na prvom nulovom bajte.
Poznámky — Viacregistrová hodnota sa číta jednou požiadavkou, takže všetky jej registre pochádzajú z toho istého okamihu.
Príklad
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 charactersChyby — Invalid register number: X; String data type must have specified length - number of registers to read.
MODBUSW
MODBUSW zapíše jednu hodnotu alebo až 101 hodnôt do nasledujúcich registrov a vráti TRUE.
| |
Poznámky
- Pri viacerých hodnotách sa adresa registra posúva o veľkosť dátového typu — o 1, 2 alebo 4 registre na hodnotu.
- Coil (
C) prijíma iba dátový typBool; doDaAsa zapisovať nedá. - Ako sa hodnoty zaokrúhľujú a kontrolujú, opisuje časť Zápis hodnôt.
Príklad
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);Chyby — WriteInt16: Cannot write Int16 to coils (a podobne pre ďalšie typy); Invalid register number: X.
MODBUSWNE
MODBUSWNE („write if not equal“ — zapíš, ak sa líši) zapíše jednu hodnotu ako MODBUSW, ale iba keď sa líši od hodnoty v registri, čo šetrí komunikáciu na zbernici aj zápisové cykly EEPROM zariadenia.
| |
Poznámky
- Hodnota sa porovnáva s vyrovnávacou pamäťou registrov modulu. Pri zapnutom prefetchi je to hodnota z posledného prefetchu (register sa do prefetchu pridá); register, ktorý ešte nebol prečítaný, sa najprv prečíta. Pri No prefetch sa register prečíta zo zariadenia tesne pred porovnaním.
- Nikdy sa neporovnáva s naposledy zapísanou hodnotou: zápis nezmení hodnotu vo vyrovnávacej pamäti, kým sa register znova neprečíta.
- Viacregistrová hodnota sa porovnáva aj zapisuje ako celok.
Príklad — konfigurácia v inicializačnom skripte
MODBUSWNE(H, 27, Uint16, 0);MODBUSRBLOCK
MODBUSRBLOCK prečíta blok súvislých registrov alebo coilov jednou Modbus transakciou a vráti ich ako kolekciu.
| |
| Typ registra | Návratová hodnota | Najväčší count |
|---|---|---|
H, A | collection<uint16> | 123 (FC03 / FC04) |
C, D | collection<bool> | 2000 (FC01 / FC02) |
Poznámky — Pri zapnutom prefetchi sa registre, ktoré už sú vo vyrovnávacej pamäti, znova nečítajú; chýbajúce sa prečítajú jednou požiadavkou. Typované hodnoty z bloku čítajte funkciou UNPACKVALUE. Jedno blokové čítanie nahradí mnoho jednotlivých čítaní.
Príklad
collection<uint16> data := MODBUSRBLOCK(H, 100, 4);
UNPACKVALUE(data, 0, BigEndianFloat);
# Result: the float in registers 100 and 101Chyby — MODBUSRBLOCK: count must be between 1 and 123 for 16-bit registers (H); MODBUSRBLOCK: invalid register range X..Y.
Dostupnosť — Core 2026.1, build 39001 alebo novší (aplikácia s buildom 39016 alebo novším). To isté platí pre MODBUSWBLOCK a MODBUSWBLOCKNE.
MODBUSWBLOCK
MODBUSWBLOCK zapíše celú kolekciu do súvislých holding registrov alebo coilov jednou Modbus transakciou a vráti TRUE. Blok dlhší než veľkosť skupiny prefetch modulu (predvolene 100) sa rozdelí na viac po sebe idúcich požiadaviek.
| |
| Typ registra | Kolekcia | Najväčšia dĺžka |
|---|---|---|
H | collection<uint16> | 123 (FC16) |
C | collection<bool> | 1968 (FC15) |
Príklad — nastavenie coilov 0 a 3, vynulovanie coilov 1, 2 a 4 až 7
collection<bool> coils := BOOLCOLLECTION(8);
SETAT(coils, 0, TRUE);
SETAT(coils, 3, TRUE);
MODBUSWBLOCK(C, 0, coils);Chyby — MODBUSWBLOCK: cannot write to read-only registers (D); MODBUSWBLOCK: register type C expects Collection<Bool>, got Collection<UInt16>.
MODBUSWBLOCKNE
MODBUSWBLOCKNE zapíše kolekciu ako MODBUSWBLOCK, ale iba keď sa aspoň jedna hodnota líši od aktuálneho obsahu registrov; zmenený blok sa zapíše rovnako, rozdelený podľa tej istej veľkosti skupiny.
| |
Poznámky — Aktuálny obsah sa číta rovnako ako pri MODBUSWNE.
Príklad — zmena jedného registra bloku s čo najmenšou komunikáciou na zbernici
collection<uint16> c := MODBUSRBLOCK(H, 100, 4);
PACKVALUE(c, 1, Uint16, 9);
MODBUSWBLOCKNE(H, 100, c);Pozrite aj — Skripty Modbus a prefetch, Binárne dáta, Bitové operácie.