Protocolli Industriali (Modbus, S7, EtherNet/IP)
Collega l'agente direttamente a PLC e inverter via Modbus TCP, S7comm (Siemens S7-1200/1500) ed EtherNet/IP (Allen-Bradley). Lettura e scrittura senza gateway.
Protocolli Industriali Nativi
Oltre a HTTP / MQTT / OPC UA, Rela AI parla nativamente i tre protocolli più diffusi in campo: Modbus TCP, S7comm (Siemens) e EtherNet/IP (CIP, Allen-Bradley). L'agente può leggere variabili ed eseguire scritture sui PLC senza gateway intermedio.
A cosa serve
Gran parte del parco industriale installato non ha server OPC UA. Fino a poco tempo fa, integrare un Siemens S7-1200 o un Allen-Bradley richiedeva un gateway o un server OPC UA intermedio. Ora:
- L'agente legge direttamente registri / data block / tag.
- L'agente scrive direttamente su coil, holding register, DB word, tag CIP (half-duplex completo).
- Il listener di eventi ingesta cambi di valore senza URL HTTP.
Riduce tre cose: costo di integrazione, latenza, superficie di guasto.
Come funziona
flowchart LR
PLC[PLC / SCADA] -->|Modbus TCP / S7 / CIP / OPC UA| L[Listener persistente<br/>worker WORKER_MODE=true]
L --> FM[Field mapping<br/>+ normalizzazione]
FM --> P[Pipeline predittivo<br/>anomaly / energy / prognostics]
A[Agente IA] -->|dispatcher sincrono| PLCDue percorsi: i listener persistenti del worker leggono in continuo e pubblicano eventi al pipeline; i dispatcher sincroni permettono agli strumenti dell'agente di scrivere verso il PLC. Ogni protocollo usa la sua libreria canonica (pymodbus 3.8+, snap7, pycomm3, asyncua) con i suoi gotcha (vedi il CLAUDE.md di relaai-api per i kwargs specifici).
Protocolli supportati
| Protocollo | Dispositivi tipici | Lettura | Scrittura | Libreria |
|---|---|---|---|---|
| HTTP / REST | ERP, CMMS, API generiche | ✅ | ✅ | httpx |
| MQTT | Broker IoT, gateway | ✅ | ✅ | aiomqtt |
| OPC UA (incl. Reverse Connect) | SCADA, PLC con server OPC UA | ✅ | ✅ | asyncua |
| Modbus TCP | PLC, inverter, misuratori | ✅ holding/input/coil/discrete | ✅ write_register / write_coil | pymodbus ≥ 3.8 |
| S7comm | Siemens S7-1200, S7-1500, S7-300/400 | ✅ DB / M / I / Q | ✅ DB write con codec per tipo | python-snap7 |
| EtherNet/IP (CIP) | Allen-Bradley ControlLogix / CompactLogix | ✅ tag read | ✅ tag write | pycomm3 |
Modbus TCP
Lettura (listener)
Sorgente di tipo modbus:
protocol: modbus
modbus_host: 10.10.2.15
modbus_port: 502
modbus_unit_id: 1
poll_interval_s: 5
registers:
- address: 40001
count: 2
register_type: holding
field_name: tank_levelregister_type supportati: holding, input, coil, discrete.
Scrittura (tool action)
tool_type: action
config:
protocol: modbus
modbus_host: 10.10.2.15
modbus_port: 502
modbus_unit_id: 1
modbus_operation: holding # o "coil"
action_defaults:
address: 40100Dispatcher valida modbus_host, address, value, esegue write_register o write_coil (kwarg device_id, API pymodbus 3.8+), ritorna {success, written, address, value, type, duration_ms}.
Le scritture agli holding register modificano il comportamento del PLC. Usa solo con agenti il cui prompt includa restrizioni di sicurezza e conferma esplicita.
S7comm (Siemens)
Lettura (listener)
protocol: s7
s7_host: 10.10.2.40
s7_rack: 0
s7_slot: 1
poll_interval_s: 10
variables:
- area: DB
db_number: 20
offset: 0
data_type: real
field_name: pressureAree supportate: DB, M, I, Q.
Scrittura (tool action)
tool_type: action
config:
protocol: s7
s7_host: 10.10.2.40
action_defaults:
db_number: 20
offset: 0
data_type: realTipi encodati dal dispatcher (_s7_encode_value):
data_type | Byte | Encoder |
|---|---|---|
bool | 1 | set_bool |
byte | 1 | set_byte |
int | 2 | set_int |
word | 2 | set_word |
dint | 4 | set_dint |
dword | 4 | set_dword |
real | 4 | set_real |
string | N | set_string |
EtherNet/IP (CIP)
Lettura (listener)
protocol: ethernet_ip
cip_host: 10.10.3.22
poll_interval_s: 5
tags:
- tag_name: Program:MainProgram.Temperature
field_name: temperatureScrittura (tool action)
tool_type: action
config:
protocol: ethernet_ip
cip_host: 10.10.3.22Dispatcher usa pycomm3.LogixDriver. Se il tag non esiste o tipo non corrisponde, risponde {success: false, error}.
OPC UA Reverse Connect
Per PLC dietro firewall stretti: OPC UA Reverse Connect — il PLC inizia la connessione TCP. Sorgente tipo opcua_reverse con opcua_reverse_listen_port e certificati opzionali.
Sicurezza
- Isolamento di rete: listener e dispatcher industriali devono girare su worker con accesso alla VLAN industriale.
- Permessi di scrittura: pre-configura
address/db_number/tag_nameviaaction_defaults. - Conferma umana: agenti con azioni di scrittura devono includere "conferma prima di eseguire".
- Rate limiting: evita tool che permettano scritture massive.
- Audit: ogni scrittura loggata con host, address, value, actor, duration_ms.
Listener persistenti e orchestrazione
MQTT, OPC UA, Modbus, S7, EtherNet/IP richiedono connessioni persistenti. Rela AI le gestisce in rela-ai-worker (Cloud Run):
- Scansiona tutte le sorgenti abilitate all'avvio.
- Avvia un
asyncio.Taskper sorgente. - Auto-riconnessione con backoff esponenziale (1s → 60s).
- Pubblica status di connessione via Ably.
- Stop/restart automatico quando una sorgente viene creata/aggiornata/eliminata.
L'API web non esegue listener, solo il worker.
Test dal dashboard
Prima di attivare una sorgente o tool di scrittura:
- Test connessione — valida credenziali.
- Test lettura — legge un registro configurato.
- Test scrittura — scrive e rilegge per conferma.
Benefici chiave
- Tre protocolli industriali nativi aggiuntivi.
- Half-duplex completo.
- Listener riconnettibili con backoff.
- Dispatcher validati da test.
- Status real-time via Ably.
- Rate limiting + audit + conferma umana per difesa in profondità.
Connessioni esterne
Strumenti per collegarsi ad API, dispositivi IoT e macchinari industriali.
Connettività VPN — Configurazione e Setup
Crea un tunnel WireGuard dedicato tra il tuo impianto e Rela AI, scarica la configurazione adattata alla tua apparecchiatura, e verifica che il PLC raggiunga la piattaforma.