Funkce Modbus
Funkce Modbus ve skriptu TapHome — MODBUSR, MODBUSW, MODBUSWNE a blokové funkce MODBUSRBLOCK, MODBUSWBLOCK, MODBUSWBLOCKNE — a typy registrů Modbus C, D, H a A.
Funkce Modbus čtou a zapisují coily a registry zařízení Modbus, ke kterému skript patří. Fungují jen ve skriptech modulu nebo zařízení Modbus; kdekoli jinde se skript zastaví chybou ModbusFunction - unknown modbus device to work with. Názvy datových typů (Uint16, BigEndianFloat, …) jsou na stránce Datové typy Modbus. Nastavení modulu a šablon popisuje Integrace Modbus.
Typy registrů
Prvním argumentem každé funkce Modbus je typ registru.
| Typ | Objekt Modbus | Kódy funkcí | Přístup |
|---|---|---|---|
C | Coil | FC01 čtení, FC05 / FC15 zápis | čtení i zápis |
D | Discrete input | FC02 | jen čtení |
H | Holding register | FC03 čtení, FC06 / FC16 zápis | čtení i zápis |
A | Input register | FC04 | jen čtení |
SC a SH jsou starší hodnoty, které skripty stále přijímají. Adresují tytéž coily a holding registry jako C a H, ale modul je při každém volání čte ze zařízení místo z vyrovnávací paměti a zapisuje je po jednom registru na požadavek (FC05 / FC06). V nových skriptech používejte C a H. Toto chování je převzato z kódu a na zařízení ověřeno nebylo.
MODBUSR
MODBUSR přečte jednu hodnotu z coilu, discrete inputu nebo z jednoho či více registrů a převede ji na zadaný datový typ.
| |
| Název | Typ | Popis |
|---|---|---|
registerType | C, D, H, A | Viz Typy registrů. |
register | číslo | Adresa registru 0 – 65535, desítkově nebo šestnáctkově (0x14). |
dataType | datový typ Modbus | Určuje, kolik registrů se přečte: 1, 2 nebo 4. |
numberOfRegisters | číslo | Povinný pro String, 0 – 123. Jeden registr obsahuje 2 znaky. |
Vrací — číslo pro 16bitové a 32bitové typy, Float a Double; bool pro Bool; int64 nebo uint64 pro Int64 a UInt64; řetězec pro String, který končí u prvního nulového bajtu.
Poznámky — Hodnota přes více registrů se čte jedním požadavkem, takže všechny její registry pocházejí ze stejného okamžiku.
Pří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, nebo až 101 hodnot do po sobě jdoucích registrů, a vrátí TRUE.
| |
Poznámky
- Při více hodnotách se adresa registru posouvá o velikost datového typu — 1, 2 nebo 4 registry na hodnotu.
- Coil (
C) přijímá jen datový typBool; doDaAzapisovat nelze. - Jak se hodnoty zaokrouhlují a kontrolují, popisuje Zápis hodnot.
Pří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 totéž pro ostatní typy); Invalid register number: X.
MODBUSWNE
MODBUSWNE („zapiš, pokud se neshoduje“) zapíše jednu hodnotu jako MODBUSW, ale jen tehdy, když se liší od hodnoty v registru. Šetří tím provoz na sběrnici i zápisové cykly paměti EEPROM zařízení.
| |
Poznámky
- Hodnota se porovnává s vyrovnávací pamětí registrů modulu. Se zapnutým prefetch je to hodnota přečtená posledním prefetch (registr se do prefetch přidá); registr, který ještě nebyl přečten, se nejprve přečte. S No prefetch se registr přečte ze zařízení těsně před porovnáním.
- Nikdy se neporovnává s naposledy zapsanou hodnotou: zápis nezmění hodnotu ve vyrovnávací paměti, dokud se registr znovu nepřečte.
- Hodnota přes více registrů se porovnává a zapisuje jako celek.
Příklad — konfigurace ve skriptu inicializace
MODBUSWNE(H, 27, Uint16, 0);MODBUSRBLOCK
MODBUSRBLOCK přečte blok po sobě jdoucích registrů nebo coilů jednou transakcí Modbus a vrátí je jako kolekci.
| |
| Typ registru | Vrací | Maximální count |
|---|---|---|
H, A | collection<uint16> | 123 (FC03 / FC04) |
C, D | collection<bool> | 2000 (FC01 / FC02) |
Poznámky — Se zapnutým prefetch se registry, které už jsou ve vyrovnávací paměti, znovu nečtou; chybějící se přečtou jedním požadavkem. Typové hodnoty z bloku čtěte přes UNPACKVALUE. Jedno čtení bloku nahradí mnoho jednotlivých čtení.
Pří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.
Dostupnost — Core 2026.1, build 39001 nebo novější (aplikace s buildem 39016 nebo novějším). Totéž platí pro MODBUSWBLOCK a MODBUSWBLOCKNE.
MODBUSWBLOCK
MODBUSWBLOCK zapíše celou kolekci do po sobě jdoucích holding registrů nebo coilů jednou transakcí Modbus a vrátí TRUE. Blok delší než velikost skupiny prefetch modulu (výchozí 100) se rozdělí na několik po sobě jdoucích požadavků.
| |
| Typ registru | Kolekce | Maximální délka |
|---|---|---|
H | collection<uint16> | 123 (FC16) |
C | collection<bool> | 1968 (FC15) |
Příklad — nastavení coilů 0 a 3, vynulování coilů 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 kolekci jako MODBUSWBLOCK, ale jen tehdy, když se alespoň jedna hodnota liší od současného obsahu registrů; změněný blok se zapíše stejně a rozdělí podle stejné velikosti skupiny.
| |
Poznámky — Současný obsah se čte stejně jako u MODBUSWNE.
Příklad — změna jednoho registru bloku s minimálním provozem na sběrnici
collection<uint16> c := MODBUSRBLOCK(H, 100, 4);
PACKVALUE(c, 1, Uint16, 9);
MODBUSWBLOCKNE(H, 100, c);Viz také — Skripty Modbus a prefetch, Binární data, Bitové operace.