Vai al contenuto

ADR-001 — OPC UA come standard di interfaccia impianto ⇄ twin

Stato: accettato (2026-07-10, decisione del founder). Ambito: tutte le interfacce fra impianto (virtuale o reale), controllori di cella, SCADA/HMI e ingestione dati del closed-loop.

Decisione

Ogni scambio impianto⇄twin passa per OPC UA. Il namespace è definito in un solo posto (digital_twin/plc/contract.py) e vale identico per il mondo virtuale e per quello reale.

Motivazioni

  1. Simmetria virtuale/reale — il gemello espone lo stesso contratto che esporrà l'impianto: il ramo top-down (ingestione IoT → ricalibrazione) si sviluppa e si collauda contro il virtuale prima che l'impianto esista; poi si cambia endpoint, non architettura.
  2. Lingua franca industriale — parlano OPC UA: PLC/soft-PLC (Siemens PLCSIM Advanced, Beckhoff TwinCAT, CODESYS, OpenPLC), SCADA (FUXA, Ignition), Omniverse/Isaac (connettore), storici di fabbrica. Nessun adattatore proprietario nostro.
  3. Modello informativo tipizzato — nodi con tipi/gerarchia (non byte grezzi): il contratto è auto-documentante e versionabile in git.

Regole del contratto

  • Sensors/* scrive solo l'impianto; Actuators/* scrive solo il controllore; Control/* = telemetria del controllore (ResetCmd: scritto da HMI, consumato dal controllore); Test/* esiste solo nel mondo virtuale (fault injection).
  • Tempo scalato: il virtuale espone SimTime (minuti simulati); i timer dei controllori contano su quel clock (principio del virtual-time-sync). Sull'impianto reale SimTime = wall clock.
  • Evoluzione: aggiunte retro-compatibili libere; rinomini/rimozioni = nuova versione del namespace.

Sicurezza (esplicitamente rimandata)

Prototipo: endpoint locale non cifrato. Prima di qualsiasi esposizione di rete: certificati + utenti/ruoli OPC UA, e l'endpoint mai pubblico (VPN/rete di impianto). Da riaprire in fase deploy.

Conseguenze

  • Prima implementazione: digital_twin/plc/ (cella pressa: impianto server + PLC MIL client, collaudo con fault injection — PASS).
  • Un futuro SCADA web (es. FUXA/Grafana) si aggancia allo stesso endpoint senza codice nostro.
  • Alternative valutate: MQTT (ottimo transport, ma senza modello informativo → eventualmente come complemento per telemetria leggera), ROS 2 (per la robotica in Isaac, non per l'I/O di cella), API proprietarie dei singoli emulatori (lock-in).