TapHome

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.

TypModbus objektFunkčné kódyPrístup
CCoilFC01 čítanie, FC05 / FC15 zápisčítanie aj zápis
DDiscrete inputFC02iba čítanie
HHolding registerFC03 čítanie, FC06 / FC16 zápisčítanie aj zápis
AInput registerFC04iba čí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.

1
2
MODBUSR(registerType, register, dataType)
MODBUSR(registerType, register, String, numberOfRegisters)
NázovTypPopis
registerTypeC, D, H, APozrite Typy registrov.
registerčísloAdresa registra 0 – 65535, desiatkovo alebo hexadecimálne (0x14).
dataTypedátový typ ModbusUrčuje, koľko registrov sa prečíta: 1, 2 alebo 4.
numberOfRegistersčísloPovinné 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 characters

Chyby — 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.

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

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ý typ Bool; do D a A sa 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.

1
MODBUSWNE(registerType, register, dataType, value)

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.

1
MODBUSRBLOCK(registerType, register, count)
Typ registraNávratová hodnotaNajväčší count
H, Acollection<uint16>123 (FC03 / FC04)
C, Dcollection<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 101

Chyby — 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.

1
MODBUSWBLOCK(registerType, register, collection)
Typ registraKolekciaNajväčšia dĺžka
Hcollection<uint16>123 (FC16)
Ccollection<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.

1
MODBUSWBLOCKNE(registerType, register, collection)

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.