Passerelle PLC
Passerelle de protocole industriel faisant le pont entre les PLC Modbus TCP legacy et l'OPC UA moderne, avec analytique temps réel et visualisation Grafana.
Les usines modernes font tourner un mix d'équipements legacy et modernes. Les PLC plus anciens exposent les données uniquement via Modbus TCP — un protocole simple basé sur des registres — tandis que les systèmes SCADA/MES/IIoT modernes attendent de l'OPC UA, un protocole plus riche, standardisé, avec tags sémantiques. Faire le pont manuellement est fastidieux : poller les registres, décoder les mises à l'échelle en virgule fixe, réassembler les compteurs 32-bit splités sur deux registres 16-bit, mapper les bitfields en états significatifs.
Construire un pipeline Dockerized self-contained qui lit les données live d'un PLC industriel (simulé) en Modbus, les expose en OPC UA, puis les stream à travers Node-RED pour le traitement vers InfluxDB et les dashboards Grafana — le tout en un seul docker compose up reproductible.
Tech Stack
Décisions clés
- →Polling cyclique avec auto-reconnect — poll Modbus chaque 1s, ferme le socket et retry après 3s en cas d'échec, robuste face aux redémarrages de PLC.
- →Getters OPC UA paresseux — chaque nœud utilise une closure get() lisant plcData en mémoire, donc l'address space reflète toujours le dernier poll.
- →Décodage fixed-point à la passerelle — température en 0.1°C, pression en 0.01 Bar, vibration en 0.01 mm/s, tous décodés à la couche bridge.
- →Réassemblage du compteur 32-bit — le count de production splité sur deux registres 16-bit, recombiné avec (high << 16) | low.
- →Séparation traduction vs. analytique — la passerelle reste un pure protocol bridge (<100ms), tout le calcul dérivé vit dans Node-RED.
Adaptation d'impédance de protocole : Modbus → OPC UA
Modbus est des registres 16-bit plats avec scaling implicite hors bande. OPC UA est un modèle d'objets typé, hiérarchique, browsable. La passerelle invente la structure de l'address space (dossier PLC_Data + variables typées) et encode toute la connaissance du scaling fixed-point à un seul endroit.
// Address space OPC UA exposé sous Objects/PLC_Data/
MotorSpeed (Double)
Temperature (Double, ×0.1 °C)
Pressure (Double, ×0.01 Bar)
Vibration (Double, ×0.01 mm/s)
Current (Double, ×0.1 A)
ProductionCount (UInt32, (reg[6]<<16)|reg[7])
MachineState (String: Stop/Start/Run/Alarm)
MotorOn (Boolean, status & 0x01)
AlarmActive (Boolean, status & 0x08)Mapping bitfield vers sémantique
Un seul registre de status contient plusieurs états booléens packés en bits. La passerelle les dépaquette avec des masques en nœuds OPC UA Boolean distincts pour que les consommateurs downstream n'aient pas besoin de connaître les positions des bits.
const MotorOn = (status & 0x01) !== 0;
const TempHigh = (status & 0x02) !== 0;
const PressureHigh = (status & 0x04) !== 0;
const AlarmActive = (status & 0x08) !== 0;
const VibrationHigh = (status & 0x10) !== 0;Analytique dérivée dans Node-RED
Plutôt que de dumper des valeurs brutes, Node-RED calcule la puissance triphasée (√3 × 400 × I × 0.85 / 1000), le taux de production par heure, les moyennes mobiles, l'écart-type, et les flags d'anomalie de déviation par rapport à la moyenne — tout avant l'écriture dans InfluxDB.
Fonctionnalités démo
- →Aucun PLC physique requis — le simulateur génère sine-wave + bruit avec 2% de déclenchement d'alarme aléatoire
- →Une seule commande : docker compose build && docker compose up -d
- →Dashboard Grafana 9 panneaux avec jauges, stat panels et time-series (auto-refresh 5s)
- →Harness de test automatisé de 221 lignes couvrant ports, containers, lectures Modbus, logs de conversion, écritures InfluxDB et dashboards Grafana
- →Alarmes de température, spikes de vibration et transitions d'état apparaissent naturellement en quelques minutes
- →L'inadéquation d'impédance de protocole entre Modbus (16-bit plat, scaling implicite) et OPC UA (typé, hiérarchique, browsable) a nécessité d'inventer la structure de l'address space et d'encoder le scaling à un seul endroit.
- →Réassembler des valeurs 32-bit sur deux registres 16-bit nécessite la bonne endianness — (high << 16) | low — un piège Modbus classique.
- →Résilience de connexion sur des réseaux industriels — close-on-error + auto-reconnect différé vaut mieux que crasher, avec logging structuré winston pour l'observabilité.
- →Reproductibilité sans matériel — construire un simulateur PLC fidèle (sine-wave + bruit + alarmes stochastiques) a rendu tout le stack démontrable sur un laptop.