# OPC DA

> Un client pour les serveurs OPC Data Access classiques sur COM/DCOM, qui tourne dans un processus auxiliaire 32 bits, avec un adressage par ID d'élément et un balayage des serveurs d'une machine.

Le pilote **OPC DA** est un client pour les serveurs OPC Data Access classiques (versions 1.0, 2.05a et 3.0), les serveurs COM par lesquels des passerelles d'automates anciennes, des systèmes SCADA et des simulateurs publient encore leurs données. Un serveur est nommé par la machine où il tourne et par son ProgID, par exemple `Matrikon.OPC.Simulation.1`, et chaque tag par l'ID d'élément du serveur. Ajoutez le pilote et ses équipements sur la page [Connector](connector).

## Équipement {#device}

| Champ | Sens | Défaut |
| --- | --- | --- |
| **Hôte** | Le nom ou l'adresse de l'ordinateur où tourne le serveur OPC DA. Vide désigne cet ordinateur, où tournent la plupart des serveurs classiques. | vide : cet ordinateur |
| **Serveur / Clé** | Le ProgID du serveur, tel que son éditeur l'enregistre dans Windows, par exemple `Matrikon.OPC.Simulation.1`. | `OPC.Server.1` |
| **Intervalle de scrutation (ms)** | La fréquence à laquelle la station lit les tags de l'équipement, sauf si un tag fixe son propre intervalle. | 1000 |

L'adresse de l'équipement est assemblée à partir des deux, par exemple `opc.da://localhost/Matrikon.OPC.Simulation.1`. Il n'y a pas de port : COM trouve le serveur par l'enregistrement de Windows lui-même.

## Adressage des tags {#tag-addressing}

Un tag est adressé par son **ID d'élément**, saisi en texte libre et envoyé au serveur exactement tel qu'il est écrit, par exemple `Random.Real8` ou `Channel1.Device1.Tag1`. Les ID d'élément sont ceux du serveur ; sa documentation ou un balayage les liste. La station ajoute chaque élément à un groupe de l'équipement la première fois qu'un tag le lit, et le lit sur l'équipement, pas dans le cache du serveur.

## Types de donnée {#data-types}

Le sélecteur **Type de donnée** propose les types que contient un élément OPC DA : Boolean, SByte, Byte, Int16, UInt16, Int32, UInt32, Int64, UInt64, Float, Double, String et DateTime. Chaque lecture est convertie vers le type du tag, choisissez donc le type que le serveur déclare pour l'élément, celui qu'un balayage propose : un élément réel sur 64 bits lu en Float perd en précision, et lu en Double la conserve. Une valeur que le type du tag ne peut pas contenir, comme un texte qui n'est pas un nombre ou un tableau, laisse le tag sans valeur. En OPC DA une date ne porte pas de fuseau horaire, et la station la lit et l'écrit en UTC.

Chaque valeur que le serveur renvoie porte sa qualité. Une valeur de bonne qualité (Good) atteint le tag. Une valeur de qualité incertaine (Uncertain) ou de mauvaise qualité (Bad) laisse le tag sans valeur, et la ligne du journal de la lecture échouée nomme la qualité dans les mots de la spécification OPC DA, par exemple `Bad: not connected (0x0008)` ou `Uncertain: last usable value (0x0044)`. Un élément dont la lecture échoue laisse son tag sans valeur, et les autres tags de l'équipement continuent de lire.

## Découverte {#discovery}

**Découvrir** liste les serveurs OPC DA enregistrés sur un ordinateur : saisissez son nom ou son adresse dans la cible du balayage, ou laissez-la vide pour cet ordinateur. Chaque serveur est proposé comme un équipement, et son espace d'adressage est parcouru : chaque élément qu'il contient est proposé comme un tag en lecture seule, avec le type que le serveur déclare pour lui : un réel sur 64 bits en Double, un entier non signé sur 16 bits en UInt16, et ainsi de suite pour chaque type ci-dessus, une valeur monétaire en Double. Un élément qui ne déclare aucun type est proposé en String, qui lit toute valeur ; un élément d'un type qu'aucun tag ne lit, comme un tableau, n'est pas proposé, et le balayage le compte parmi ce qu'il a laissé de côté. Voir [Découverte](connector-discovery) pour la façon dont les candidats sont choisis et ajoutés.

Le balayage demande les serveurs à l'énumérateur de serveurs OPC (OpcEnum), par les bibliothèques proxy et stub d'OPC DA enregistrées sur cet ordinateur. Tant que l'une d'elles manque, le balayage ne liste rien et dit ce qui manque, avec les étapes de [Installer les OPC Core Components](#installing-the-opc-core-components).

## Écritures {#writes}

Les tags dont l'**Accès** est Lecture et écriture ou Écriture seule peuvent être écrits, vers le même élément que la lecture emploie. La valeur est envoyée dans le type dans lequel le serveur tient l'élément (dans le type du tag lui-même quand le serveur ne le dit pas), convertie depuis la valeur du tag sans passer par du texte, si bien qu'une station dans n'importe quelle langue envoie le même nombre. Un nombre entier hors de la plage du type de l'élément est refusé avant tout envoi, jamais ramené à la valeur la plus proche que le type peut contenir. Une écriture que le serveur refuse revient refusée, avec la raison quand la station sait la dire (un élément qui n'accepte pas d'écriture, une valeur que l'élément n'accepte pas, un élément que le serveur ne connaît pas, un accès refusé) et sinon avec le code d'erreur du serveur, par exemple `OPC DA 0x80004005` ; le journal garde le code du serveur dans tous les cas. OPC DA n'a pas de commandes : un équipement de ce pilote n'en propose aucune.

## Le processus auxiliaire 32 bits {#the-32-bit-helper}

Les serveurs OPC DA sont joints par un client COM 32 bits, que la station 64 bits ne peut pas charger. Le pilote tourne donc dans un processus auxiliaire qui lui est propre, `Lab.Desktop.DriverBridge.exe`, que la station démarre la première fois qu'un équipement ou un balayage OPC DA en a besoin, ou qu'elle vérifie les OPC Core Components, et ferme quand le Connector s'arrête. Rien ne change dans l'usage du pilote : ses équipements et ses tags sont lus, écrits, balayés et inscrits au journal comme ceux de tout autre.

Si le processus auxiliaire s'arrête, ses équipements affichent l'erreur "Le processus auxiliaire 32 bits du pilote OPC DA s'est arrêté. La station le redémarre, et l'équipement se reconnecte par lui.", la page Événements garde son code de sortie, et leurs tags perdent leurs valeurs. La station redémarre le processus auxiliaire, après une pause qui grandit tant qu'il continue de s'arrêter, et les équipements se reconnectent d'eux-mêmes par lui. Une écriture qui était en route quand le processus auxiliaire s'est arrêté revient en échec, en disant qu'on ne sait pas si la valeur a atteint l'équipement. Aucun autre pilote ni aucune autre partie de la station ne s'arrête avec lui.

## Avant de commencer {#before-you-start}

- La station n'installe aucun composant OPC. L'énumérateur de serveurs OPC (OpcEnum) et les bibliothèques proxy et stub d'OPC DA viennent avec le serveur OPC DA, ou avec les OPC Core Components. La station vérifie d'elle-même s'ils sont enregistrés et, tant que l'un d'eux manque, dit comment les installer : voir [Installer les OPC Core Components](#installing-the-opc-core-components).
- Un serveur sur un autre ordinateur est joint par DCOM, que les deux ordinateurs doivent autoriser pour le compte Windows sous lequel tourne la station : permissions DCOM, règles de pare-feu et le même compte ou un domaine approuvé. Ce réglage se fait dans Windows, jamais dans la station : voir [Préparer un serveur distant](#prepare-a-remote-server).
- Le pilote ne tourne que sous Windows.

## Installer les OPC Core Components {#installing-the-opc-core-components}

La station vérifie d'elle-même, dans le processus auxiliaire 32 bits, si cet ordinateur a l'énumérateur
de serveurs OPC (OpcEnum) et les bibliothèques proxy et stub d'OPC DA enregistrés pour les programmes
32 bits : la première fois que la page du pilote, la page de l'un de ses équipements ou l'agent le
demande, puis toutes les 30 secondes tant que l'un d'eux manque. Tant que le Connector n'a pas démarré, on
ne sait pas s'ils sont là, et rien n'en est dit. Tant que l'un d'eux manque :

| Où | Ce qui est dit |
| --- | --- |
| La page du pilote | Un avis d'attention, « Les OPC Core Components manquent sur cet ordinateur », avec les étapes ci-dessous. Son lien ouvre la page de l'OPC Foundation dans le navigateur de l'ordinateur. |
| La page de chaque équipement | Le même avis, sauf si l'équipement est en ligne. |
| Un balayage | Il ne liste rien et dit ce qui manque : la ligne qui clôt le balayage renvoie à l'avis, et `device_discover` de l'agent donne les étapes en anglais. |
| La dernière erreur d'un équipement dont la connexion échoue | Ce qui manque et les mêmes étapes, en anglais, comme sont écrites les causes propres du pilote. |
| L'agent | `driver_capabilities` les donne sous `prerequisite`, avec `installed` à false. |

Pour les installer :

1. Exécutez de nouveau le programme d'installation de votre serveur OPC DA : il les installe généralement.
2. Sinon, ouvrez la page [Core Components](https://opcfoundation.org/developer-tools/samples-and-tools-classic/core-components/) de l'OPC Foundation et téléchargez les OPC Core Components Redistributables. Seul un utilisateur enregistré peut les télécharger : si la page indique que vous n'avez pas la permission de télécharger le fichier, connectez-vous avec « Login » ou créez un compte avec « Create Account » sur la même page.
3. Prenez `opc-core-components-redistributable-<version>-x86-x64.msi` sur un Windows 64 bits, qui contient aussi les composants 32 bits, et celui qui se termine par `-x86.msi` seulement sur un Windows 32 bits.
4. Exécutez-le en tant qu'administrateur, et redémarrez l'ordinateur si le programme d'installation le demande.

Au plus tard 30 secondes après l'installation, l'avis disparaît, le balayage liste les serveurs OPC DA et
les équipements de ce pilote se connectent avec la configuration qu'ils ont, sans redémarrer Ganter Lab.

## Préparer un serveur distant {#prepare-a-remote-server}

Un serveur sur cet ordinateur n'a besoin de rien d'autre. Un serveur sur un autre ordinateur se joint
par DCOM, qui ne laisse rien entrer d'un autre ordinateur tant que les deux ne sont pas préparés pour
cela. La préparation se fait dans Windows sur les deux ordinateurs, par un administrateur de chacun,
jamais dans la station :

1. Utilisez le même compte Windows avec le même mot de passe sur les deux ordinateurs (le compte sous
   lequel tourne la station), ou un compte de domaine que les deux connaissent.
2. Sur l'ordinateur du serveur, lancez `dcomcnfg` et ouvrez **Component Services > Computers > My
   Computer > Properties > COM Security**. Sous **Access Permissions** et **Launch and Activation
   Permissions**, dans **Edit Limits** comme dans **Edit Default**, accordez à ce compte tous les
   droits à distance. Dans **Edit Limits** d'**Access Permissions**, accordez aussi **Remote Access**
   à ANONYMOUS LOGON, dont l'énumérateur de serveurs OPC (OpcEnum) a besoin.
3. Au même endroit, sous **My Computer > DCOM Config**, ouvrez les Properties du serveur OPC et
   d'OpcEnum, et dans leur onglet Security personnalisez les trois autorisations avec le même
   compte.
4. Sur l'ordinateur de la station, lancez aussi `dcomcnfg` et, dans **Edit Limits** d'**Access
   Permissions**, accordez **Remote Access** au compte sous lequel tourne le serveur OPC : le serveur
   rappelle la station.
5. Sur l'ordinateur du serveur, dans le Pare-feu Windows Defender, autorisez en entrée le port TCP
   135 et les programmes du serveur OPC et d'OpcEnum (`OpcEnum.exe`), et vérifiez dans **Services**
   qu'OpcEnum tourne et démarre automatiquement.

**Edit Default** ne change rien tant qu'**Edit Limits** refuse le droit : réglez les deux. DCOM
répond sur le port 135 puis porte les appels sur un port que Windows choisit : un pare-feu entre les
deux ordinateurs qui n'ouvre que le 135 bloque donc encore le serveur.

| Ce que Windows répond | Ce que dit la page de l'équipement |
| --- | --- |
| Accès refusé (0x80070005) | « *hôte* refuse cette station par DCOM », avec le compte sous lequel tourne la station et les étapes 1 à 4 |
| Le serveur RPC n'est pas disponible (0x800706BA) | « *hôte* ne répond pas à DCOM » : l'ordinateur est éteint ou hors d'atteinte, son pare-feu bloque DCOM, ou OpcEnum n'y tourne pas, avec l'étape 5 |

Chaque avis prend la place de l'erreur de l'équipement et disparaît de lui-même dès que le serveur se
connecte. Le journal technique et l'agent lisent les mêmes étapes en anglais. Un serveur sur cet
ordinateur n'est jamais signalé ainsi.

Là où l'installation n'autorise pas DCOM, un wrapper ou un tunnel qui sert le serveur OPC DA en OPC
UA, sur l'ordinateur du serveur, l'évite tout à fait : la station lit alors le serveur avec le pilote
[OPC UA](driver-opc-ua).
