Connettore Modbus
Panoramica
Sezione intitolata “Panoramica”Il connettore Modbus abilita la comunicazione con PLC e dispositivi industriali utilizzando il protocollo Modbus, supportando connessioni sia seriali (RTU) che TCP/IP.
Tipi Connettore:
ModbusReader- Leggi dati da dispositivi ModbusModbusWriter- Scrivi dati su dispositivi Modbus
Caratteristiche
Sezione intitolata “Caratteristiche”- ✅ Protocolli di trasporto multipli (TCP, RTU, UDP, TLS)
- ✅ Tutti i tipi di registro (Holding, Input, Coil, Discrete Input)
- ✅ Tipi di dati multipli (Int16/32/64, UInt16/32/64, Float32/64, ASCII)
- ✅ Ordine byte e word configurabile
- ✅ Supporto Unit ID per reti multi-dispositivo
Protocolli di Trasporto
Sezione intitolata “Protocolli di Trasporto”Meddle supporta i seguenti trasporti Modbus:
TCP- Modbus TCP su EthernetTCPWithTLS- Modbus TCP con crittografia TLSUDP- Modbus su UDPRTU- Modbus RTU su serialeRTUOverTCP- Modbus RTU incapsulato in TCPRTUOverUDP- Modbus RTU incapsulato in UDP
Configurazione Base
Sezione intitolata “Configurazione Base”Modbus TCP Reader
Sezione intitolata “Modbus TCP Reader”{ "type": "ModbusReader", "config": { "endpoint": "192.168.1.100:502", "transport": "TCP", "pollingRate": 1000, "defaultUnitId": 1, "defaultBitOrder": "BigEndian", "defaultWordOrder": "HighFirst" }, "variables": [ { "key": "temperature", "address": 0, "registerType": "HoldingRegister", "dataType": "Float64" }, { "key": "pressure", "address": 4, "registerType": "HoldingRegister", "dataType": "Int32" } ]}Modbus RTU Reader
Sezione intitolata “Modbus RTU Reader”{ "type": "ModbusReader", "config": { "endpoint": "/dev/ttyUSB0", "transport": "RTU", "pollingRate": 1000, "defaultUnitId": 1, "baudRate": 9600, "dataBits": 8, "parity": "None", "stopBits": 1 }, "variables": [ { "key": "sensor_value", "address": 0, "registerType": "InputRegister", "dataType": "UInt16" } ]}Modbus Writer
Sezione intitolata “Modbus Writer”{ "type": "ModbusWriter", "config": { "endpoint": "192.168.1.100:502", "transport": "TCP", "defaultUnitId": 1 }, "variables": [ { "key": "setpoint", "address": 100, "registerType": "HoldingRegister", "dataType": "Float32" }, { "key": "enable", "address": 0, "registerType": "Coil" } ]}Tipi di Registro
Sezione intitolata “Tipi di Registro”Holding Registers (Lettura/Scrittura)
Sezione intitolata “Holding Registers (Lettura/Scrittura)”Registri general-purpose che possono essere letti e scritti.
{ "key": "temperature", "address": 0, "registerType": "HoldingRegister", "dataType": "Float64"}Codici Funzione: Read (03), Write Single (06), Write Multiple (16)
Input Registers (Solo Lettura)
Sezione intitolata “Input Registers (Solo Lettura)”Registri di sola lettura tipicamente usati per dati sensori.
{ "key": "sensor_reading", "address": 0, "registerType": "InputRegister", "dataType": "Int16"}Codice Funzione: Read (04)
Coils (Lettura/Scrittura Booleano)
Sezione intitolata “Coils (Lettura/Scrittura Booleano)”Registri a singolo bit per uscite digitali.
{ "key": "motor_enable", "address": 0, "registerType": "Coil"}Codici Funzione: Read (01), Write Single (05), Write Multiple (15)
Discrete Inputs (Solo Lettura Booleano)
Sezione intitolata “Discrete Inputs (Solo Lettura Booleano)”Registri a singolo bit di sola lettura per ingressi digitali.
{ "key": "limit_switch", "address": 0, "registerType": "DiscreteInput"}Codice Funzione: Read (02)
Tipi di Dati
Sezione intitolata “Tipi di Dati”Tipi Integer
Sezione intitolata “Tipi Integer”// Intero con segno 16-bit (-32768 a 32767){"dataType": "Int16"} // 1 registro
// Intero senza segno 16-bit (0 a 65535){"dataType": "UInt16"} // 1 registro// Intero con segno 32-bit{"dataType": "Int32"} // 2 registri
// Intero senza segno 32-bit{"dataType": "UInt32"} // 2 registri// Intero con segno 64-bit{"dataType": "Int64"} // 4 registri
// Intero senza segno 64-bit{"dataType": "UInt64"} // 4 registriTipi Floating Point
Sezione intitolata “Tipi Floating Point”// Float 32-bit (4 byte){"dataType": "Float32"} // 2 registri
// Float 64-bit (8 byte){"dataType": "Float64"} // 4 registriTipi String
Sezione intitolata “Tipi String”// Carattere ASCII (1 byte per registro){"dataType": "AsciiChar"} // 1 registroOrdine Byte e Word
Sezione intitolata “Ordine Byte e Word”I dispositivi Modbus possono usare diversi ordinamenti byte e word. Configurali per corrispondere al tuo dispositivo:
Ordine Bit (Ordine Byte)
Sezione intitolata “Ordine Bit (Ordine Byte)”{ "defaultBitOrder": "BigEndian" // o "LittleEndian"}- BigEndian: Byte più significativo prima (default, più comune)
- LittleEndian: Byte meno significativo prima
Ordine Word
Sezione intitolata “Ordine Word”Per valori multi-registro (32-bit, 64-bit):
{ "defaultWordOrder": "HighFirst" // o "LowFirst"}- HighFirst: Word alto prima (default)
- LowFirst: Word basso prima
Override Per-Variabile
Sezione intitolata “Override Per-Variabile”{ "key": "special_value", "address": 10, "registerType": "HoldingRegister", "dataType": "Float32", "bitOrder": "LittleEndian", "wordOrder": "LowFirst"}Configurazione Seriale RTU
Sezione intitolata “Configurazione Seriale RTU”Per connessioni Modbus RTU su seriale:
{ "endpoint": "/dev/ttyUSB0", "transport": "RTU", "baudRate": 9600, "dataBits": 8, "parity": "None", "stopBits": 1, "timeout": 1000}Parametri:
baudRate: 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200dataBits: 7 o 8parity: None, Even, OddstopBits: 1 o 2timeout: Timeout lettura in millisecondi
Unit ID (Indirizzo Slave)
Sezione intitolata “Unit ID (Indirizzo Slave)”Modbus supporta più dispositivi sulla stessa rete usando Unit ID:
{ "defaultUnitId": 1 // Default per tutte le variabili}Override per-variabile:
{ "key": "device2_temp", "address": 0, "registerType": "HoldingRegister", "dataType": "Float32", "unitId": 2 // Override per questa variabile}Casi d’Uso Comuni
Sezione intitolata “Casi d’Uso Comuni”1. Lettura Contatore Energia
Sezione intitolata “1. Lettura Contatore Energia”{ "type": "ModbusReader", "config": { "endpoint": "192.168.1.50:502", "transport": "TCP", "pollingRate": 5000, "defaultUnitId": 1 }, "variables": [ { "key": "voltage", "address": 0, "registerType": "InputRegister", "dataType": "Float32" }, { "key": "current", "address": 2, "registerType": "InputRegister", "dataType": "Float32" }, { "key": "power", "address": 4, "registerType": "InputRegister", "dataType": "Float32" }, { "key": "energy", "address": 6, "registerType": "InputRegister", "dataType": "Float64" } ]}2. Controllo PLC
Sezione intitolata “2. Controllo PLC”{ "type": "ModbusWriter", "config": { "endpoint": "192.168.1.100:502", "transport": "TCP", "defaultUnitId": 1 }, "variables": [ { "key": "motor_speed", "address": 100, "registerType": "HoldingRegister", "dataType": "UInt16" }, { "key": "motor_start", "address": 0, "registerType": "Coil" }, { "key": "motor_stop", "address": 1, "registerType": "Coil" } ]}3. Rete Multi-Dispositivo
Sezione intitolata “3. Rete Multi-Dispositivo”{ "type": "ModbusReader", "config": { "endpoint": "/dev/ttyUSB0", "transport": "RTU", "pollingRate": 1000, "baudRate": 9600 }, "variables": [ { "key": "device1_temp", "address": 0, "registerType": "HoldingRegister", "dataType": "Float32", "unitId": 1 }, { "key": "device2_temp", "address": 0, "registerType": "HoldingRegister", "dataType": "Float32", "unitId": 2 }, { "key": "device3_temp", "address": 0, "registerType": "HoldingRegister", "dataType": "Float32", "unitId": 3 } ]}Risoluzione dei Problemi
Sezione intitolata “Risoluzione dei Problemi”Timeout Connessione
Sezione intitolata “Timeout Connessione”Soluzioni:
- Verifica indirizzo endpoint e porta
- Controlla connettività di rete
- Aumenta valore timeout
- Verifica che il dispositivo sia alimentato e risponda
Dati Non Validi
Sezione intitolata “Dati Non Validi”Soluzioni:
- Controlla ordine byte (
BigEndianvsLittleEndian) - Verifica ordine word (
HighFirstvsLowFirst) - Conferma che il tipo dati corrisponda alla specifica del dispositivo
- Verifica che l’indirizzo registro sia corretto
Errori Comunicazione RTU
Sezione intitolata “Errori Comunicazione RTU”Soluzioni:
- Controlla connessioni cavo seriale
- Verifica che il baud rate corrisponda al dispositivo
- Conferma impostazioni parità e stop bit
- Controlla resistenze di terminazione appropriate
- Riduci frequenza polling per evitare collisioni bus
Codici Eccezione
Sezione intitolata “Codici Eccezione”Codici eccezione Modbus comuni:
- 01: Funzione Illegale
- 02: Indirizzo Dati Illegale
- 03: Valore Dati Illegale
- 04: Errore Dispositivo Slave
Best Practice
Sezione intitolata “Best Practice”- Inizia con Solo Lettura: Testa con Input Register prima di scrivere
- Usa Polling Appropriato: Non fare polling più veloce di quanto il dispositivo possa rispondere
- Raggruppa Registri Consecutivi: Più efficiente di letture sparse
- Documenta Ordine Byte: Mantieni note su configurazioni specifiche dispositivo
- Testa Unit ID: Verifica che ogni dispositivo risponda al suo Unit ID
Connettori Correlati
Sezione intitolata “Connettori Correlati”- OPC UA - Protocollo industriale alternativo
- Siemens S7 - Comunicazione diretta PLC Siemens
- Filter - Filtra dati Modbus
- SQL Writer - Archivia dati Modbus in database