OPC UA

Un client OPC UA pour les serveurs tiers, avec une confiance conditionnée par certificat, un adressage par node id et une découverte de l'espace d'adressage.

Afficher en Markdown

Le pilote OPC UA est un client pour les serveurs OPC UA tiers : automates, passerelles, historiens, autres SCADA, sur opc.tcp. C'est la contrepartie sortante du serveur OPC UA intégré qui publie l'espace d'adressage de cette station (décrit sous Paramètres) ; les deux partagent l'identité applicative de la station mais accordent leur confiance à leurs pairs indépendamment.

Équipement

Champ Sens Défaut
Hôte Le nom DNS, l'adresse IPv4 ou IPv6 du serveur. localhost quand il est laissé vide
Port réseau Le port TCP du point de terminaison. 4840 (un 0 configuré retombe sur 4840)
Chemin de ressource Le chemin de point de terminaison que certains serveurs exigent après l'hôte et le port, produisant opc.tcp://host:port/path. Laissez-le vide quand le serveur répond à la racine. vide
Sécurité de la session Désactivée, la session est signée et chiffrée et un matériel qui n'offre rien de mieux est refusé. Autoriser une session sans sécurité l'ouvre quand même, en clair, pour un matériel qui n'annonce aucun point de terminaison sécurisé. désactivée
Nom d'utilisateur / Mot de passe L'identité d'utilisateur de la session. Un nom d'utilisateur vide signifie une session anonyme. Le mot de passe est protégé au repos par la DPAPI Windows propre à l'utilisateur et ne peut être lu que sur la machine et le compte Windows qui l'ont saisi. anonyme
Période de scrutation (ms) La cadence de scrutation par défaut des tags qui ne la remplacent pas. 1000

Sécurité et certificats

La connexion commence par la liste des points de terminaison du serveur : le client choisit le point de terminaison le plus sûr que le serveur annonce et authentifie l'application avec le certificat propre à cette station, la même identité applicative OPC UA que le serveur intégré emploie. Beaucoup de serveurs exigent que ce certificat soit accordé de leur côté avant d'accepter la session ; cette étape se fait sur le matériel.

Un matériel qui n'annonce rien de mieux qu'un point de terminaison sans sécurité est refusé, et l'équipement dit pourquoi. Cette session ferait circuler les lectures et les identifiants en clair et ne prouverait aucune identité de matériel : elle ne s'ouvre donc que là où vous l'avez demandée sur cet équipement, par Sécurité de la session, Autoriser une session sans sécurité, sur la carte de connexion. Le choix appartient à cet équipement-là, voyage dans son adresse sous la forme ?security=none et vaut aussi bien pour la session de lecture que pour le parcours de la découverte. L'activer ne dégrade jamais un matériel qui offre de la sécurité : c'est toujours le point de terminaison le plus sûr annoncé qui est retenu.

Dans l'autre sens, la confiance est fermée par défaut et explicite. Le certificat du matériel est vérifié avant l'ouverture de la session :

  • Un certificat que cette station n'a jamais approuvé est refusé, enregistré pour examen, et le volet de l'équipement montre un avis nommant l'approbation qu'il attend : l'équipement n'est pas « hors ligne », il attend une décision.
  • Vous examinez les certificats sous Paramètres → Accès des matériels, la moitié sortante de la confiance par certificat : un certificat enregistré reste sous En attente d'approbation jusqu'à ce que vous l'approuviez (de nouvelles sessions peuvent s'ouvrir) ou le bloquiez (refusé sans relancer d'invites répétées). C'est la liste des matériels ; Accès des clients, sur la même page, est l'autre sens, qui peut se connecter en entrée au serveur propre à cette station.
  • Retirer l'approbation, sur une ligne approuvée, ferme les sessions en cours qui s'appuient sur ce certificat et le renvoie dans la liste d'examen, si bien que la prochaine connexion vous redemande.
  • Un matériel qui ne présente aucun certificat ne prouve rien sur qui a répondu : il n'y a donc rien à approuver et la session est refusée, son adresse écrite au journal. Il ne se connecte que sous ce même Autoriser une session sans sécurité, qui tient alors lieu d'approbation.

Approuver un serveur d'équipement n'autorise jamais ce certificat à se connecter en entrée au serveur propre à cette station : les deux sens gardent des dépôts séparés à dessein.

Le comportement d'une session

Les tags sont scrutés : chaque lecture demande au serveur la valeur courante du nœud. Le verdict du serveur lui-même voyage avec chaque échantillon : une valeur estampillée Bad ou Uncertain est refusée et le tag se lit en mauvaise qualité, si bien qu'une source douteuse n'est jamais blanchie en lecture correcte. Un nœud qui n'existe plus sur le serveur se lit comme aucune valeur plutôt que de faire échouer tout l'équipement.

La session est surveillée par des keep-alive ; après trois keep-alive manqués, le client lance une reconnexion automatique et poursuit. La boucle de reprise en arrière-plan de l'application possède la connexion initiale, si bien qu'un serveur injoignable ne coûte rien au démarrage.

Adressage des tags

Un tag est adressé par son Node id, saisi en texte libre et envoyé tel quel. Les formes acceptées sont les notations OPC UA standard :

Exemple Sens
ns=2;s=Temperature Un identifiant chaîne dans l'index de namespace 2
i=2258 Un identifiant numérique dans le namespace 0 (ici : le CurrentTime du serveur)
ns=3;i=1042 Un identifiant numérique dans l'index de namespace 3
nsu=urn:vendor:app;s=Line1.Speed La forme étendue qui nomme le namespace par son URI plutôt que par son index, robuste aux changements d'index d'un redémarrage à l'autre

Le tag lit et écrit l'attribut Value du nœud.

Types de valeur

Types proposés
Boolean, Byte, Int16, Int32, Int64, Float, Double et String

Les valeurs sont scalaires seulement : les tableaux, les structures et les autres valeurs complexes sont refusés comme illisibles plutôt qu'aplatis en un nombre trompeur, et le tag se lit en mauvaise qualité. Un tag comme celui-là échoue tout seul ; les autres tags de l'équipement continuent de se lire, et rien n'est reconnecté à cause de lui. Une chaîne vide est une valeur, pas un échec. Les types hors de l'ensemble proposé (les largeurs non signées, DateTime, Guid, ByteString) ne sont pas disponibles sur ce pilote.

Un balayage de serveur propose donc moins de voies que le serveur n'en porte : un nœud qui déclare une liste de valeurs, et un nœud dont le type est hors de l'ensemble proposé, sont laissés de côté. Ils ne sont pourtant pas écartés en silence. Le balayage les compte et son message de clôture dit combien et de quel type, par exemple « 5 voie(s) ont été laissées de côté : 3 de type UInt32, 2 qui portent une liste de valeurs au lieu d'une seule valeur. », si bien qu'une liste courte se lit comme une liste courte et non comme un automate nu.

Écritures

Un tag inscriptible écrit l'attribut Value du nœud par le service Write d'OPC UA. La réponse du serveur est le verdict : une écriture rejetée apparaît comme un échec, et la valeur en cache n'avance qu'à l'acceptation. Comme partout, le champ d'écriture prend la valeur physique et la chaîne de conversion est remontée avant que la valeur brute ne soit envoyée.

Découverte

La commande Découvrir prend une cible dans le champ à côté d'elle : une adresse de serveur OPC UA telle que opc.tcp://plc-host:4840. Le balayage a deux étapes, et la ligne de progression nomme celle qui tourne :

  1. Points de terminaison : le service de découverte standard de la cible est interrogé et chaque URL de découverte annoncée devient un point de terminaison candidat. Les ports et les chemins de serveur personnalisés font l'aller-retour dans les champs de connexion du candidat.
  2. Voies : l'espace d'adressage de chaque candidat est parcouru depuis le dossier Objects vers le bas, et chaque variable lisible est listée en tag candidat avec son type et son accès. Les zones de diagnostic du serveur sont sautées.

Le parcours se connecte anonymement (avec la même sélection du point de terminaison le plus sûr, le même refus d'une session sans sécurité et la même barrière de certificat de matériel). Un serveur qui refuse les sessions anonymes, un serveur qui n'annonce aucun point de terminaison sécurisé, ou un parcours qui échoue pour une raison quelconque, laisse tout de même le point de terminaison ajoutable avec zéro tag : ajoutez-le, réglez les identifiants et la sécurité de la session sur l'équipement, et configurez les tags à la main. Rien n'est conservé tant que vous n'avez pas ajouté un candidat, et l'annulation garde les candidats déjà complets.

Des limites à connaître

  • Les lectures sont des scrutations de l'attribut Value ; le pilote ne crée pas d'abonnement sur le serveur distant.
  • Des valeurs scalaires seulement : un tag ne peut adresser ni un élément de tableau ni un champ de structure.
  • La barrière d'approbation s'applique par certificat : un matériel qui renouvelle son certificat revient dans la liste d'examen et attend une nouvelle décision.