Salta ai contenuti

Connettore Modbus

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 Modbus
  • ModbusWriter - Scrivi dati su dispositivi Modbus
  • ✅ 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

Meddle supporta i seguenti trasporti Modbus:

  • TCP - Modbus TCP su Ethernet
  • TCPWithTLS - Modbus TCP con crittografia TLS
  • UDP - Modbus su UDP
  • RTU - Modbus RTU su seriale
  • RTUOverTCP - Modbus RTU incapsulato in TCP
  • RTUOverUDP - Modbus RTU incapsulato in UDP
{
"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"
}
]
}
{
"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"
}
]
}
{
"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"
}
]
}

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)

Registri di sola lettura tipicamente usati per dati sensori.

{
"key": "sensor_reading",
"address": 0,
"registerType": "InputRegister",
"dataType": "Int16"
}

Codice Funzione: Read (04)

Registri a singolo bit per uscite digitali.

{
"key": "motor_enable",
"address": 0,
"registerType": "Coil"
}

Codici Funzione: Read (01), Write Single (05), Write Multiple (15)

Registri a singolo bit di sola lettura per ingressi digitali.

{
"key": "limit_switch",
"address": 0,
"registerType": "DiscreteInput"
}

Codice Funzione: Read (02)

// Intero con segno 16-bit (-32768 a 32767)
{"dataType": "Int16"} // 1 registro
// Intero senza segno 16-bit (0 a 65535)
{"dataType": "UInt16"} // 1 registro
// Float 32-bit (4 byte)
{"dataType": "Float32"} // 2 registri
// Float 64-bit (8 byte)
{"dataType": "Float64"} // 4 registri
// Carattere ASCII (1 byte per registro)
{"dataType": "AsciiChar"} // 1 registro

I dispositivi Modbus possono usare diversi ordinamenti byte e word. Configurali per corrispondere al tuo dispositivo:

{
"defaultBitOrder": "BigEndian" // o "LittleEndian"
}
  • BigEndian: Byte più significativo prima (default, più comune)
  • LittleEndian: Byte meno significativo prima

Per valori multi-registro (32-bit, 64-bit):

{
"defaultWordOrder": "HighFirst" // o "LowFirst"
}
  • HighFirst: Word alto prima (default)
  • LowFirst: Word basso prima
{
"key": "special_value",
"address": 10,
"registerType": "HoldingRegister",
"dataType": "Float32",
"bitOrder": "LittleEndian",
"wordOrder": "LowFirst"
}

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, 115200
  • dataBits: 7 o 8
  • parity: None, Even, Odd
  • stopBits: 1 o 2
  • timeout: Timeout lettura in millisecondi

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
}
{
"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"
}
]
}
{
"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"
}
]
}
{
"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
}
]
}

Soluzioni:

  • Verifica indirizzo endpoint e porta
  • Controlla connettività di rete
  • Aumenta valore timeout
  • Verifica che il dispositivo sia alimentato e risponda

Soluzioni:

  • Controlla ordine byte (BigEndian vs LittleEndian)
  • Verifica ordine word (HighFirst vs LowFirst)
  • Conferma che il tipo dati corrisponda alla specifica del dispositivo
  • Verifica che l’indirizzo registro sia corretto

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 Modbus comuni:

  • 01: Funzione Illegale
  • 02: Indirizzo Dati Illegale
  • 03: Valore Dati Illegale
  • 04: Errore Dispositivo Slave
  1. Inizia con Solo Lettura: Testa con Input Register prima di scrivere
  2. Usa Polling Appropriato: Non fare polling più veloce di quanto il dispositivo possa rispondere
  3. Raggruppa Registri Consecutivi: Più efficiente di letture sparse
  4. Documenta Ordine Byte: Mantieni note su configurazioni specifiche dispositivo
  5. Testa Unit ID: Verifica che ogni dispositivo risponda al suo Unit ID
  • OPC UA - Protocollo industriale alternativo
  • Siemens S7 - Comunicazione diretta PLC Siemens
  • Filter - Filtra dati Modbus
  • SQL Writer - Archivia dati Modbus in database