Passerelle OPC UA vers BACnet et Modbus : Traduction de protocole pour l'intégration BMS
La grande majorité des dispositifs BMS installés — contrôleurs BACnet/IP, compteurs d'énergie Modbus TCP et dispositifs de terrain Modbus RTU — n'implémentent pas de serveur OPC UA. Une passerelle de protocole comble cette lacune : elle se connecte aux dispositifs existants via leurs protocoles natifs et expose tous les points de données découverts comme des nœuds OPC UA dans un espace d'adressage unique et navigable. Kepware KEPServerEX est le choix standard de l'industrie pour ce rôle, soutenu par Siemens, Schneider et Rockwell Automation pour les déploiements de passerelles BMS multi-protocoles.
Pourquoi une passerelle est nécessaire
Les appareils BACnet/IP et BACnet MS/TP exposent des données via les services d'objets BACnet (ReadProperty, SubscribeCOV) – et non via les services OPC UA. Les appareils Modbus TCP et RTU exposent des données sous forme de registres numérotés sans nommage intégré, informations de type ou sécurité. Un client OPC UA ne peut communiquer nativement avec aucun des deux protocoles.
La passerelle agit comme une couche de traduction. Côté sud, elle interroge ou s'abonne aux appareils en utilisant leurs protocoles natifs. Côté nord, elle exécute un serveur OPC UA complet, mappant chaque point de données d'appareil à un nœud de variable OPC UA nommé et typé. Résultat : un système SCADA, un connecteur cloud ou une plateforme de gestion d'énergie voit un seul point de terminaison OPC UA contenant toutes les données du bâtiment, que les appareils sous-jacents parlent BACnet, Modbus, KNX ou SNMP.
COV vs. interrogation dans la passerelle : Pour les appareils BACnet prenant en charge les abonnements Change of Value (COV), configurez Kepware pour utiliser SubscribeCOV plutôt que l'interrogation périodique ReadProperty. COV réduit le trafic réseau BACnet et garantit que la passerelle reflète les changements d'état immédiatement plutôt que d'attendre le prochain cycle d'interrogation. Les appareils Modbus nécessitent toujours une interrogation – réglez la fréquence de balayage en fonction de vos besoins d'actualité des données (généralement 1 à 10 secondes pour le CVC, 100 à 500 ms pour la qualité de l'énergie).
Comparaison des options de passerelle
| Passerelle | Serveur OPC UA | Prise en charge BACnet | Prise en charge Modbus | Plateforme |
|---|---|---|---|---|
| Kepware KEPServerEX 6 | Serveur UA complet (tous les modes de sécurité) | BACnet/IP + MS/TP ; BBMD ; COV | Modbus RTU/TCP/ASCII ; 65535 registres | Windows Server/PC |
| matrikon OPC UA Tunneller | Serveur OPC UA + pont DA/HDA | Via pont OPC DA uniquement | Via pont OPC DA uniquement | Windows |
| Cogent DataHub OPC UA | Serveur UA complet | BACnet/IP; COV limité | Modbus TCP | Windows |
| softing edgeConnector Modbus | Serveur OPC UA | Non — Modbus uniquement | Modbus TCP + RTU | Docker / Linux / Windows |
| softing edgeConnector BACnet | Serveur OPC UA | BACnet/IP + MS/TP | Non | Docker / Linux / Windows |
| Ignition (Inductive Automation) | Serveur OPC UA (intégré) | BACnet/IP via module pilote | Pilote Modbus TCP/RTU | Windows / Linux (JVM) |
Kepware KEPServerEX : configuration du pilote BACnet/IP
Le pilote Ethernet BACnet/IP de Kepware (sous licence distincte du package de base KEPServerEX) se connecte aux périphériques BACnet/IP sur le sous-réseau local ou via des routeurs à l'aide d'un dispositif de gestion de diffusion BACnet (BBMD). Après avoir ajouté le canal pilote, Kepware découvre automatiquement tous les périphériques BACnet visibles et importe leurs listes d'objets.
Configuration du pilote Kepware BACnet/IP
Channel settings (Connectivity > BACnet/IP Ethernet): Network adapter: 192.168.10.5 (Kepware server OT NIC) UDP port: 47808 (BAC0 — standard BACnet/IP port) BACnet device instance: 1001 (Kepware gateway identity on BACnet network) BBMD address: 192.168.10.1 (router acting as BBMD for cross-subnet discovery) BBMD UDP port: 47808 Foreign device registration: enabled (for devices on other subnets) Auto-discovery: Tools > Device Discovery > BACnet/IP Scan range: all subnets registered on BBMD Result: discovered 47 BACnet devices with object counts Import: select all → creates Kepware device entries with all objects COV subscription (preferred over polling): Device property > Subscriptions > Use COV: Enabled Lifetime: 3600 seconds (re-subscribe hourly) COV increment for Analog Values: 0.5 (only report if change > 0.5 units) Fallback poll rate (if COV not supported): 5000 ms
Chaque objet BACnet importé devient une balise Kepware. Kepware mappe automatiquement la propriété BACnet Present_Value à la valeur principale de la balise. Le nom de la balise suit le modèle DeviceName.ObjectType_Instance.Property, par exemple : PXC_01.AnalogInput_1.Present_Value. Ces tags sont immédiatement exposés en tant que nœuds de variables OPC UA sur le point de terminaison OPC UA intégré de KEPServerEX.
Modbus TCP vers OPC UA : import de la table des registres
Les appareils Modbus TCP nécessitent une configuration explicite de la table des registres — contrairement à BACnet, il n'y a pas de découverte d'objets auto-descriptive. Le pilote Modbus TCP/IP Ethernet de Kepware accepte un fichier d'importation de tags CSV ou une configuration manuelle des tags spécifiant l'adresse du registre, le type de données et la conversion technique.
Configuration des tags Modbus TCP Kepware
Channel: Modbus TCP/IP Ethernet Network adapter: 192.168.10.5 Port: 502 (standard Modbus TCP port) Request timeout: 1000 ms Failure count before error: 3 Device: Schneider_PM5100 IP address: 192.168.10.21 Unit ID (slave address): 1 Scan rate: 1000 ms (1 second) Tags (imported from Schneider PM5100 register map): Tag name | Address | Data type | Scaling ActivePower_Total | 400593 (HR593) | Float (4B) | ×1 → kW ActiveEnergy_Import | 400001 (HR001) | DWord (4B) | ×0.1 → kWh Voltage_L1_N | 400003 (HR003) | Float (4B) | ×1 → V Current_L1 | 400013 (HR013) | Float (4B) | ×1 → A PowerFactor_Total | 400085 (HR085) | Float (4B) | ×1 (dimensionless) Frequency | 400073 (HR073) | Float (4B) | ×1 → Hz # Tag addressing format for Kepware Modbus driver: # Holding Register 40001 → address "400001" or "4:1" # Input Register 30001 → address "300001" or "3:1" # Coil 1 → address "000001" or "0:1" # Discrete Input 10001 → address "100001" or "1:1"
Correspondance objet BACnet vers nœud OPC UA
Kepware fait correspondre chaque type d'objet BACnet à un nœud de variable OPC UA avec le type de données OPC UA approprié. La propriété Present_Value de l'objet BACnet devient la valeur du nœud OPC UA. Les propriétés Status_Flags et Reliability sont mappées au StatusCode OPC UA de la variable.
| Type d'objet BACnet | Type de Present_Value | Type de données OPC UA | Utilisation typique |
|---|---|---|---|
| Entrée analogique (AI) | REAL (Float) | Float | Capteur de température, pression, débit |
| Sortie analogique (AO) | REAL (Float) | Float (accessible en écriture) | Consigne de position de vanne, vitesse du ventilateur |
| Valeur analogique (AV) | REAL (Float) | Float (accessible en écriture) | Consigne, valeur calculée |
| Entrée binaire (BI) | ÉNUMÉRÉ (Actif/Inactif) | Booléen | État marche/arrêt, état d'alarme |
| Sortie binaire (BO) | ÉNUMÉRÉ (Actif/Inactif) | Booléen (inscriptible) | Commande marche/arrêt, commande de relais |
| Valeur binaire (BV) | ÉNUMÉRÉ (Actif/Inactif) | Booléen (inscriptible) | Indicateur de mode, état de forçage |
| Entrée multi-état (MI) | UNSIGNED INT | Int32 | Lecture du mode de fonctionnement (Arrêt=0, Chauffage=1, Refroidissement=2) |
| Sortie multi-état (MO) | UNSIGNED INT | Int32 (accessible en écriture) | Commande de mode, palier de vitesse |
| Valeur multi-état (MV) | UNSIGNED INT | Int32 (accessible en écriture) | Valeur d'énumération configurable |
| Accumulateur | UNSIGNED INT (32 bits) | UInt32 | Compteur d'impulsions : kWh, m³, litres |
Sécurité des passerelles OPC UA
Une passerelle OPC UA est un dispositif de frontière IT/OT. Si elle est compromise, un attaquant peut écrire sur des sorties BACnet accessibles en écriture (vannes, relais) ou des bobines Modbus via le service d'écriture OPC UA. Appliquez une défense en profondeur : segmentation réseau, authentification par certificat et permissions d'écriture minimales.
| Contrôle de sécurité | Implémentation |
|---|---|
| VLAN OT dédié | Placer le serveur Kepware sur un VLAN isolé ; les appareils BACnet et Modbus sur le même VLAN ; pas de routage direct vers le LAN IT |
| Règles de pare-feu | Autoriser le TCP 4840 entrant uniquement depuis les IP clientes OPC UA connues ; bloquer tout autre trafic entrant ; autoriser Kepware sortant vers BACnet UDP 47808 et Modbus TCP 502 |
| Authentification par certificat | Désactiver l'anonyme ; exiger des certificats clients X.509 ; importer les certificats clients de confiance dans le magasin de confiance Kepware |
| Contrôle d'accès utilisateur Kepware | Créer un rôle UA en lecture seule pour les clients de supervision ; un rôle UA en lecture-écriture uniquement pour l'intégration BMS ; MFA sur la console d'administration Kepware |
| Protection en écriture au niveau des tags | Définir les tags Modbus en Lecture seule dans Kepware là où les écritures ne sont pas nécessaires ; les tags BACnet AO/BO/MO activés en écriture uniquement pour le rôle SCADA |
| Journalisation d'audit | Activer le journal des événements Kepware ; transférer vers le journal des événements Windows → SIEM ; alerter en cas de tentatives d'écriture non autorisées |
Port par défaut 4840 : Kepware KEPServerEX écoute par défaut sur le port TCP 4840 — le port OPC UA enregistré par l'IANA. Ce port doit être ouvert dans le pare-feu Windows sur l'hôte Kepware pour que les clients OPC UA puissent se connecter. N'exposez pas le port 4840 à des réseaux non fiables. Si le serveur Kepware nécessite un OPC UA accessible via Internet (pour les connecteurs cloud), utilisez un proxy inverse avec TLS mutuel plutôt qu'un transfert de port direct.
Test des connexions OPC UA avec UaExpert
UaExpert (par Unified Automation) est le client OPC UA gratuit standard pour la mise en service et le diagnostic. Il fournit un navigateur complet de l'espace d'adressage, une surveillance des données en temps réel, des tests d'abonnement et une gestion des certificats de sécurité. Téléchargement depuis unified-automation.com (inscription gratuite requise).
UaExpert — étapes de connexion et de vérification
1. Add server: Server menu > Add > Advanced > Enter URL: opc.tcp://192.168.10.50:4840 Security policy: Basic256Sha256 Message security mode: SignAndEncrypt Authentication: Certificate (browse to client_cert.pem + client_key.pem) 2. First connection — certificate exchange: UaExpert generates a self-signed client cert on first run Server will show certificate as "untrusted" initially On Kepware: OPC UA Configuration > Trusted Clients > Move cert to Trusted On UaExpert: OPC UA > Manage Certificates > Trust the server cert 3. Browse address space: Expand Root > Objects > (your channel name) > (device name) Locate BACnet tags: PXC_01 > AnalogInput_1 > Present_Value Locate Modbus tags: Schneider_PM5100 > ActivePower_Total 4. Read values: Double-click any Variable node to open Data Monitor Verify values match expected engineering units and range Check StatusCode column — should show "Good (0x00000000)" StatusCode "Bad_NoCommunication" → check BACnet/Modbus connectivity from Kepware 5. Create subscription: Data Access View panel (bottom): drag Variable nodes from address space Set PublishingInterval 1000 ms Watch values update in real time — confirms subscription pipeline is working 6. Test write (writable tags only): Right-click Variable node > Write Value Enter test value within EU range Verify change reflected on BACnet device Present_Value Note: writes on Kepware require the connecting client to have write permission in UA role
Intégration cloud via Azure IoT Hub OPC Publisher
Azure IoT Hub OPC Publisher est le client OPC UA open source de Microsoft qui se connecte aux serveurs OPC UA (y compris Kepware) et transmet la télémétrie à Azure IoT Hub. Il s'exécute en tant que module Azure IoT Edge sur un hôte de conteneur Linux dans le bâtiment, faisant le pont entre la couche OT OPC UA et les services cloud Azure.
OPC Publisher — publishednodes.json pour Kepware
// publishednodes.json — defines which OPC UA nodes to publish to Azure IoT Hub
[
{
"EndpointUrl": "opc.tcp://192.168.10.50:4840",
"UseSecurity": true,
"OpcAuthenticationMode": "UsernamePassword",
"OpcAuthenticationUsername": "azure-publisher",
"OpcAuthenticationPassword": "<from keyvault>",
"OpcNodes": [
{
"Id": "ns=2;s=Channel1.PXC_01.AnalogInput_1.Present_Value",
"DisplayName": "AHU01_SupplyAirTemp",
"OpcPublishingInterval": 10000,
"OpcSamplingInterval": 5000,
"HeartbeatInterval": 60
},
{
"Id": "ns=2;s=Channel1.Schneider_PM5100.ActivePower_Total",
"DisplayName": "MainMeter_ActivePower_kW",
"OpcPublishingInterval": 5000,
"OpcSamplingInterval": 2000
},
{
"Id": "ns=2;s=Channel1.Schneider_PM5100.ActiveEnergy_Import",
"DisplayName": "MainMeter_Energy_kWh",
"OpcPublishingInterval": 60000,
"OpcSamplingInterval": 30000,
"SkipFirst": true
}
]
}
]
// Azure IoT Hub receives JSON telemetry:
// {
// "NodeId": "ns=2;s=Channel1.Schneider_PM5100.ActivePower_Total",
// "DisplayName": "MainMeter_ActivePower_kW",
// "Value": { "Value": 47.3, "StatusCode": "Good", "SourceTimestamp": "2025-03-14T10:30:00Z" }
// }Depuis Azure IoT Hub, les données de télémétrie sont acheminées vers Azure Time Series Insights, Azure Data Explorer ou un travail Azure Stream Analytics personnalisé pour des tableaux de bord KPI énergétiques en temps réel dans Power BI. Le conteneur OPC Publisher gère la reconnexion, la mise en mémoire tampon en cas de perte de connectivité (store-and-forward configurable) et la gestion des certificats pour la connexion OPC UA à Kepware.
Besoin d'une passerelle BACnet ou Modbus vers OPC UA pour votre projet ?
Nous configurons et mettons en service des passerelles Kepware KEPServerEX connectant des dispositifs de bâtiment BACnet/IP, Modbus TCP et KNX à des clients OPC UA, des plateformes SCADA et Azure IoT Hub — avec un durcissement complet de la sécurité et une gestion des certificats.
Demander un devis →