MODBUS RTU
Konzept
Wie MODBUS TCP, jedoch über eine serielle Schnittstelle (RS485), direkt oder über einen IO-Node. Spalten, Funktionscodes und Datentypen sind identisch. PROTOCOL beginnt mit MODBUS RTU. Andere MODBUS…-Werte ergeben MODBUS ASCII.
Parameter
| Key | Default | Beschreibung |
|---|---|---|
CONNECTION |
– | SERIALPORT (1), SERIALPORT+ (2), IPADDRESS (3, z. B. Gateway) |
SERIALPORT / SERIALPORT_NODE / IPADDRESS_NODE |
– | Schnittstelle bzw. IO-Node |
BAUDRATE |
9600 | |
DATABITS |
8 | |
STOPBITS |
1 | |
PARITY |
– | NONE, ODD, EVEN |
FLOWCONTROL |
– | NO, SW, HW |
SLAVE |
– | Slave-Adresse(n) |
TIMEOUT, WAIT_AFTER_CONNECT, MIN_PAUSE, WORDORDER, BYTEORDER, ERROR_HANDLING |
wie TCP |
Unterstützte Port-Codes
Der Port-Code 8888 (IO-Node) wird unterstützt. Die Codes 9999 und Werte ≥ 1000 werden für MODBUS nicht unterstützt.
Mehrere Slaves auf einem Bus
Mit SLAVESMAX > 0 und einer SLAVE-Liste entsteht je Adresse eine Instanz. Alle Instanzen teilen sich die serielle Verbindung von Instanz 1. Mit FUNCTION(slave,method,getset,master,start,len); bzw. $.SYS.FUNCTION… lassen sich Register zwischen Slave und Master kopieren.
Realer Auszug: DEMO_DDF.csv (SenTec SEM9000 Wetterstation)
*GENERAL
;DEVICE;SEM9000 weather station
;MANUFACTURER;SenTec
;TYPE;Weather station
;PROTOCOL;MODBUS RTU (DDF)
;VERSION_NR;1
;MODEL_NR;1
;ID;0x0B00008300010100
;SLAVE;1
;CONNECTION;SERIALPORT;0:SERIALPORT,1:SERIALPORT+,2:IPADDRESS,3:DOMAIN
;BAUDRATE;9600
;DATABITS;8
;STOPBITS;1
;PARITY;EVEN;NONE,ODD,EVEN
;FLOWCONTROL;NO;NO,SW,HW
;TIMEOUT;5000;ms
;WAIT_AFTER_CONNECT;2;s
;MIN_PAUSE;50;ms
;WORDORDER;LITTLE_ENDIAN
;BYTEORDER;BIG_ENDIAN
;ERROR_HANDLING;FLUSH_OR_RECONNECT_ON_ERROR;FLUSH_OR_RECONNECT_ON_ERROR;NOP_ON_ERROR; FLUSH_OR_CLOSE_ON_ERROR
*READ;ALIAS;FUNCTION;ADDRESS;COUNT;POLLING;FORMULA
;DATA;FC3;0;51;1000;"""
IF DATA.Q THEN
ITEM.0.WIND_DIRECTION:=DATA.1.WORD;
ITEM.0.WIND:=DATA.2.FLOAT;
ITEM.0.TEMPERATURE:=DATA.4.FLOAT;
ITEM.0.HUMIDITY:=DATA.6.FLOAT;
ITEM.1.POSITION_QUALITY:=DATA.17.WORD;
IF ITEM.1.POSITION_QUALITY == 0 THEN
ITEM.1.POSITION_ALTITUDE:=DATA.37.FLOAT;
ELSE
ITEM.1.POSITION_ALTITUDE:=0;
ENDIF;
ITEM.0.BRIGHTNESS_SOUTH:=DATA.29.FLOAT/1000;
ITEM.0.UV_INDEX:=DATA.16.WORD/10;
ENDIF;
"""
(gekürzt) Erläuterungen:
- Ein Block liest 51 Holding-Register ab Adresse 0, jede Sekunde.
DATA.4.FLOATbelegt die Register 4 und 5. WegenWORDORDER;LITTLE_ENDIANsteht das niederwertige Wort zuerst."""…"""am Feldrand liefert literale Anführungszeichen. Der Parser entfernt sie am Rand wieder, der Formelinhalt bleibt unverändert.ITEM.0./ITEM.1.adressieren die Items über ihre Gruppe.- In
*GENERALdienen die zusätzlichen Spalten (0:SERIALPORT,…,NONE,ODD,EVEN) als Optionslisten für den Editor.
Fallstricke
- Parität, Baudrate und Stoppbits müssen exakt zum Gerät passen. Sonst bleiben alle
.Qauf 0. - Am RS485-Bus darf jede Slave-Adresse nur einmal vorkommen.
- Bei vielen Slaves bestimmen
MIN_PAUSEundPOLLINGdie Buslast. - Eine Funktion mit eigener
SLAVE-Spalte überschreibt die Geräteadresse.
Checkliste
- [ ]
PROTOCOLbeginnt mitMODBUS RTU - [ ] serielle Parameter vollständig (
BAUDRATE,DATABITS,STOPBITS,PARITY,FLOWCONTROL) - [ ]
CONNECTIONkorrekt, kein nicht unterstützter Port-Code - [ ]
SLAVEbzw.SLAVESMAXgesetzt - [ ] alle Punkte der MODBUS-TCP-Checkliste