Funkcije Modbus
Funkcije Modbus u skripti TapHome — MODBUSR, MODBUSW, MODBUSWNE i blokovske funkcije MODBUSRBLOCK, MODBUSWBLOCK, MODBUSWBLOCKNE — te tipovi registara Modbus C, D, H i A.
Funkcije Modbus čitaju i zapisuju coilove i registre uređaja Modbus kojemu skripta pripada. Rade samo u skriptama modula ili uređaja Modbus; bilo gdje drugdje skripta se zaustavlja pogreškom ModbusFunction - unknown modbus device to work with. Nazivi tipova podataka (Uint16, BigEndianFloat, …) nalaze se na stranici Tipovi podataka Modbus. Postavljanje modula i predložaka opisano je na stranici Integracija Modbus.
Tipovi registara
Prvi argument svake funkcije Modbus je tip registra.
| Tip | Objekt Modbus | Kodovi funkcija | Pristup |
|---|---|---|---|
C | Coil | FC01 čitanje, FC05 / FC15 zapis | čitanje i zapis |
D | Discrete input | FC02 | samo čitanje |
H | Holding register | FC03 čitanje, FC06 / FC16 zapis | čitanje i zapis |
A | Input register | FC04 | samo čitanje |
SC i SH su starije vrijednosti koje skripte još prihvaćaju. Adresiraju iste coilove i holding registre kao C i H, ali ih modul pri svakom pozivu čita iz uređaja umjesto iz međuspremnika i zapisuje jedan registar po zahtjevu (FC05 / FC06). U novim skriptama koristite C i H. Ovo ponašanje preuzeto je iz koda enginea i nije provjereno na uređaju.
MODBUSR
MODBUSR čita jednu vrijednost iz coila, discrete inputa ili jednog ili više registara i pretvara je u zadani tip podataka.
| |
| Naziv | Tip | Opis |
|---|---|---|
registerType | C, D, H, A | Vidi Tipovi registara. |
register | broj | Adresa registra 0 – 65535, dekadski ili heksadecimalno (0x14). |
dataType | tip podataka Modbus | Određuje koliko se registara čita: 1, 2 ili 4. |
numberOfRegisters | broj | Obavezno za String, 0 – 123. Jedan registar sadrži 2 znaka. |
Vraća — broj za 16- i 32-bitne tipove, Float i Double; bool za Bool; int64 ili uint64 za Int64 i UInt64; string za String, koji završava na prvom nultom bajtu.
Napomene — Vrijednost u više registara čita se jednim zahtjevom, pa svi njezini registri potječu iz istog trenutka.
Primjer
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 charactersPogreške — Invalid register number: X; String data type must have specified length - number of registers to read.
MODBUSW
MODBUSW upisuje jednu vrijednost ili do 101 vrijednosti u uzastopne registre i vraća TRUE.
| |
Napomene
- S više vrijednosti adresa registra pomiče se za veličinu tipa podataka — 1, 2 ili 4 registra po vrijednosti.
- Coil (
C) prihvaća samo tip podatakaBool; uDiAne može se pisati. - Kako se vrijednosti zaokružuju i provjeravaju, opisano je u odjeljku Zapis vrijednosti.
Primjer
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);Pogreške — WriteInt16: Cannot write Int16 to coils (i isto za druge tipove); Invalid register number: X.
MODBUSWNE
MODBUSWNE („write if not equal”, zapis samo kod razlike) upisuje jednu vrijednost kao MODBUSW, ali samo kada se razlikuje od vrijednosti u registru, čime se štedi promet na sabirnici i ciklusi zapisa u EEPROM uređaja.
| |
Napomene
- Vrijednost se uspoređuje s međuspremnikom registara modula. Kada je uključen prefetch, to je vrijednost pročitana posljednjim prefetchom (registar se dodaje u prefetch); registar koji još nije pročitan najprije se pročita. S postavkom No prefetch registar se čita iz uređaja neposredno prije usporedbe.
- Nikada se ne uspoređuje s vrijednošću upisanom prošli put: zapis ne mijenja vrijednost u međuspremniku dok se registar ponovno ne pročita.
- Vrijednost u više registara uspoređuje se i zapisuje kao cjelina.
Primjer — konfiguracija u inicijalizacijskoj skripti
MODBUSWNE(H, 27, Uint16, 0);MODBUSRBLOCK
MODBUSRBLOCK čita blok uzastopnih registara ili coilova u jednoj transakciji Modbus i vraća ih kao zbirku.
| |
| Tip registra | Vraća | Najveći count |
|---|---|---|
H, A | collection<uint16> | 123 (FC03 / FC04) |
C, D | collection<bool> | 2000 (FC01 / FC02) |
Napomene — Kada je prefetch uključen, registri koji su već u međuspremniku ne čitaju se ponovno; oni koji nedostaju čitaju se jednim zahtjevom. Vrijednosti s tipom iz bloka čitajte funkcijom UNPACKVALUE. Jedno čitanje bloka zamjenjuje mnogo pojedinačnih čitanja.
Primjer
collection<uint16> data := MODBUSRBLOCK(H, 100, 4);
UNPACKVALUE(data, 0, BigEndianFloat);
# Result: the float in registers 100 and 101Pogreške — MODBUSRBLOCK: count must be between 1 and 123 for 16-bit registers (H); MODBUSRBLOCK: invalid register range X..Y.
Dostupno — Core 2026.1, build 39001 ili noviji (aplikacija s buildom 39016 ili novijim). Isto vrijedi za MODBUSWBLOCK i MODBUSWBLOCKNE.
MODBUSWBLOCK
MODBUSWBLOCK upisuje cijelu zbirku u uzastopne holding registre ili coilove u jednoj transakciji Modbus i vraća TRUE. Blok dulji od veličine grupe prefetcha modula (zadano 100) dijeli se na nekoliko uzastopnih zahtjeva.
| |
| Tip registra | Zbirka | Najveća duljina |
|---|---|---|
H | collection<uint16> | 123 (FC16) |
C | collection<bool> | 1968 (FC15) |
Primjer — postavljanje coilova 0 i 3, brisanje coilova 1, 2 i 4 do 7
collection<bool> coils := BOOLCOLLECTION(8);
SETAT(coils, 0, TRUE);
SETAT(coils, 3, TRUE);
MODBUSWBLOCK(C, 0, coils);Pogreške — MODBUSWBLOCK: cannot write to read-only registers (D); MODBUSWBLOCK: register type C expects Collection<Bool>, got Collection<UInt16>.
MODBUSWBLOCKNE
MODBUSWBLOCKNE upisuje zbirku kao MODBUSWBLOCK, ali samo kada se barem jedna vrijednost razlikuje od trenutnog sadržaja registara; promijenjeni blok zapisuje se na isti način i dijeli prema istoj veličini grupe.
| |
Napomene — Trenutni sadržaj čita se na isti način kao kod MODBUSWNE.
Primjer — promjena jednog registra bloka uz najmanji promet na sabirnici
collection<uint16> c := MODBUSRBLOCK(H, 100, 4);
PACKVALUE(c, 1, Uint16, 9);
MODBUSWBLOCKNE(H, 100, c);Vidi također — Skripte Modbus i prefetch, Binarni podaci, Operacije s bitovima.