TapHome

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.

TypObjekt ModbusKódy funkcíPřístup
CCoilFC01 čtení, FC05 / FC15 zápisčtení i zápis
DDiscrete inputFC02jen čtení
HHolding registerFC03 čtení, FC06 / FC16 zápisčtení i zápis
AInput registerFC04jen č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.

1
2
MODBUSR(registerType, register, dataType)
MODBUSR(registerType, register, String, numberOfRegisters)
NázevTypPopis
registerTypeC, D, H, AViz Typy registrů.
registerčísloAdresa registru 0 – 65535, desítkově nebo šestnáctkově (0x14).
dataTypedatový typ ModbusUrčuje, kolik registrů se přečte: 1, 2 nebo 4.
numberOfRegistersčísloPovinný 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 characters

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

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

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

1
MODBUSWNE(registerType, register, dataType, value)

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.

1
MODBUSRBLOCK(registerType, register, count)
Typ registruVracíMaximální count
H, Acollection<uint16>123 (FC03 / FC04)
C, Dcollection<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 101

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

1
MODBUSWBLOCK(registerType, register, collection)
Typ registruKolekceMaximální délka
Hcollection<uint16>123 (FC16)
Ccollection<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.

1
MODBUSWBLOCKNE(registerType, register, collection)

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.