Modbus è un protocollo di comunicazione diventato uno standard de facto nella comunicazione industriale. E’ un protocollo di tipo richiesta/risposta ed offre dei servizi specificati da function codes. I nostri sistemi SlimLine/Netsyst supportano il protocollo modbus Ascii o RTU sulle porte seriali (115200, e, 8, 1), Modbus Over IP su connessione ethernet porta 502, l’indirizzo di nodo è 1. E’ possibile istanziare i FB ModbusMaster e ModbusSlave per gestirlo da programma PLC.

Accesso variabili da Modbus
Le funzioni del protocollo accedono tutte alla memoria utente DB100, le funzioni supportate sono:
Code | Function | Object | Address | Access |
---|---|---|---|---|
16#01 | Read coil status | Array di bit | 40000-44095 (1) | Read |
16#02 | Read input status | Array di bit | 40000-44095 (1) | Read |
16#03 | Read holding registers | Array di word (16 Bit) | 40000-42047 (2) | Read |
16#04 | Read input registers | Array di word (16 Bit) | 40000-42047 (2) | Read |
16#05 | Force single coil | Bit singolo | 40000-44095 (1) | Write |
16#06 | Preset single register | Word singola (16 Bit) | 40000-42047 (1) | Write |
16#08 | Loopback diagnostic test | |||
16#0F | Force multiple coils | Array di bit | 40000-44095 (1) | Write |
16#10 | Preset multiple registers | Array di word (16 Bit) | 40000-42047 (2) | Write |
- Nelle funzioni che accedono al bit singolo (In realtà ogni bit equivale ad un byte di memoria) si utilizza nel comando l’indirizzo della variabile, quindi dovendo accedere alla locazione DB100.50 utilizzeremo come indirizzo il valore 40050.
- Nelle funzioni che accedono ai registri (16 Bits) occorre considerare l’indirizzo della variabile diviso per 2, quindi dovendo raggiungere da modbus la locazione DB100.50 utilizzeremo come indirizzo il valore 40025.
Esempi messaggi Modbus
Lettura variabili
Per la lettura delle variabili si utilizza il comando Read holding registers (Codice 0x03). Ipotizzando di dover accedere in lettura ad una variabile DWORD allocata in memoria all’indirizzo MX100.64 calcoleremo l’indirizzo di lettura nel modo:
((Indirizzo variabile/2)+Offset)-1 → ((64/2)+40000)-1=40031 → 0x9C5F
Essendo una variabile DWORD dovremo leggere 2 registri consecutivi a partire dal suo indirizzo di allocazione, ipotizzando che il valore della variabile sia 0x12345678 avremo.
Frames modbus RTU Stringa di comando: 01 03 9C 5F 00 02 DA 49 Stringa di risposta: 01 03 04 56 78 12 34 66 D5 Frames modbus TCP/IP Stringa di comando: 00 00 00 00 00 06 01 03 9C 5F 00 02 Stringa di risposta: 00 00 00 00 00 07 01 03 04 56 78 12 34
La rappresentazione dei dati è nel formato Little-Endian, la numerazione inizia dal byte meno significativo per finire col più significativo, quindi come si nota dalla stringa di risposta il valore della variabile a 32 bits 0x12345678 viene ritornato suddiviso in due registri a 16 bits con i valori 0x5678, 0x1234.
Scrittura variabili
Per la scrittura delle variabili si utilizza il comando Preset multiple registers (Codice 0x10). Ipotizzando di dover accedere in scrittura ad una variabile DWORD allocata in memoria all’indirizzo MX100.64 calcoleremo l’indirizzo di scrittura nel modo:
((Indirizzo variabile/2)+Offset)-1 → ((64/2)+40000)-1=40031 → 0x9C5F
Essendo una variabile DWORD dovremo scrivere 2 registri consecutivi a partire dal suo indirizzo di allocazione, ipotizzando di dover scrivere nella variabile il valore 0x12345678 avremo.
Frames modbus RTU Stringa di comando: 01 10 9C 5F 00 02 04 56 78 12 34 D3 33 Stringa di risposta: 01 10 9C 5F 00 02 5F 8A Frames modbus TCP/IP Stringa di comando: 00 00 00 00 00 0B 01 10 9C 5F 00 02 04 56 78 12 34 Stringa di risposta: 00 00 00 00 00 06 01 10 9C 5F 00 02
La rappresentazione dei dati in SlimLine è nel formato Little-Endian, la numerazione inizia dal byte meno significativo per finire col più significativo, quindi come si nota dalla stringa di comando il valore da scrivere a 32 bits 0x12345678 viene definito suddiviso in due registri a 16 bits con i valori 0x5678, 0x1234.
Accesso I/O logici ed analogici
Come visto il supporto al protocollo Modbus dei nostri sistemi permette di accedere solo a variabili mappate nel DB100. Per accedere agli I/O digitali e/o analogici occorre realizzare un programma che ne esegua l’appoggio in variabili allocate nella DB100. Il progetto ModbusRemoteIO traccia le linee guida su come realizzare l’appoggio degli I/O per gestirne l’acceso da Modbus.
DIOToModbus
(Da eseguire in task Slow) Viene eseguito l’appoggio degli I/O digitali su variabili WORD, siccome gli I/O digitali sono gestiti in immagine di processo nella task Slow il programma và eseguito nella stessa task. La funzione VBitSet appoggia gli ingressi reali in WORD, la funzione VBitTest trasferisce una WORD sulle uscite reali, le WORD di appoggio sono allocate in DB100 per essere accessibili da Modbus.
AIOToModbus
(Da eseguire in task Back) Viene eseguito l’appoggio degli ingressi analogici su variabili REAL, siccome l’acquisizione dei valori analogici dalle schede di estensione richiede un tempo di accesso al bus (Vedi SysGetAnInp) viene sequenziata.