Table des matières
- Table des matières
- Description
- Constitution des devices
- Evenements
- Description des souscriptions au format json
- Description des souscriptions par les propriétés uniquement
- Déploiement
Description
Objectifs
L'objectif du device server OPCUAProxy est de fournir sur le bus Tango des attributs visibles via le protocole OPC-UA. Il permet d'écrire ces attributs et d'y souscrire pour être notifié de leurs modifications.
Il fournit également des services afin d'explorer l'arborescence d'un serveur OPC-UA.
Structure
Le device server est constitué de deux devices :
- OpcUaConnector
- Il gère la connexion au serveur OPC-UA via une unique session. Il communique avec les devices OpcUaSubscriber.
- Il doit être unique au sein du device server.
- OpcUaSubscriber
- Il gère un ensemble de souscriptions au serveur OPC-UA via la connexion fournie par le device OpcUaConnector.
- Il n'y a pas de limitation au nombre d'instance du device au sein du server.
Constitution des devices
OpcUaConnector
Attributs
Le device n'a qu'un attribut fixe : asyncReplyResult
. Il affiche les réponses des commandes exécutée en asynchrone. C'est un String SPECTRUM en lecture seule.
Tous les autres attributs sont dynamiques et créés d'après les informations de la session.
Commandes
Nom | Paramètre | Description | Exemple |
---|---|---|---|
BrowseNode | Identifiant du nœud racine à explorer Il est possible de préciser le namespace index si celui par défaut n'est pas le bon. Dans ce cas, il faut le rajouter au début avec le séparateur « , »Il est possible de préciser le type d'identifiant de nœud en l'ajoutant au début avec un séparateur « , ». Dans ce cas, il faut également préciser le Namespace index. |
Affiche l'arborescence complète des nœuds enfant de celui donné en paramètre. |
1;"DBOPCUA"."StructureBoolEntierReel" "DBOPCUA"."StructureBoolEntierReel" 1, numeric, 1000
|
ReadNode | Nom du nœud à lire Il est possible de préciser le namespace index si celui par défaut n'est pas le bon. Dans ce cas, il faut le rajouter au début avec le séparateur « , »Il est possible de préciser le type d'identifiant de nœud en l'ajoutant au début avec un séparateur « , ». Dans ce cas, il faut également préciser le Namespace index. |
Renvoi la valeur du nœud. |
"DBOPCUA"."Reel" 1;"DBOPCUA"."Reel" Voir le paragraphe dédié. |
Propriétés
Nom | Description | Exemple | Valeur par défaut |
---|---|---|---|
OpcuaURL | Adresse du server OPC-UA | opc.tcp://172.16.3.38:4840 |
|
RequestTimeout | Durée du timeout des requêtes (souscription, intérrogation, ...). Spécifique à la session. |
5000 | 5000 |
CreateDiagnosticAttributes | Definie si les attributs de diagnostique de la sesssion doivent être crées. Cela implique une souscription auprès du server OPC-UA pour ces attributs. |
false ou true
|
false |
SamplingIntervalForSubscriptionForDiagnostic | Intervalle d'échantillonnage des élemments pour les attributs de diagnostique. | 1000.0 | 1000.0 |
RequestedPublishingIntervalForDiagnostic | Intervalle de publication pour la souscription des attributs de diagnostique. | 1000.0 | 1000.0 |
DefaultOpcUaNamespace | Espace de nommage à utiliser par défaut. | 1 | 1 |
DefaultOpcUaType | Type par défaut des identifiants. Il sera utilisé avec la commande ReadNode si le type n'est pas explicitement précisé. Les valeurs possibles sont : String, Numeric et Guid |
Numeric | String |
ApplicationUri | L'URI de l'application cliente. Attention l'URI d'application doit être identique à celle présente dans le certificat dans le cas d'une connexion sécurisé par certificat. Dans le cas d'un certificat autosigné autogénéré par le device, la valeur de cette propriété sera utilisée pour l'URI d'application du certificat. |
urn:eclipse:milo:tango:client |
urn:soleil:tango:opcua:client |
SecurityPolicy | Définit la politique de sécurité utilisée. Si la valeur est "None", la connexion n'utilisera pas un canal de communication sécurisé. Si un algorithme est spécifié la connexion sera réalisée avec authentification du serveur et chiffrement des échanges. Les valeurs recommandées par le serveur Panorama sont : Basic256Sha256, Aes128_Sha256_RsaOaep or Aes256_Sha256_RsaPss Les valeurs possibles sont définis dans l'énumération SecurityPolicy de Milo : https://github.com/eclipse/milo/blob/master/opc-ua-stack/stack-core/src/main/java/org/eclipse/milo/opcua/stack/core/security/SecurityPolicy.java Les algorithmes supportés sont définis par l'OPC Foundation : http://opcfoundation.org/UA/SecurityPolicy#None |
Basic256Sha256 |
None |
SecurityDir | Répertoire de l'emplacement du fichier keystore et du répertoire "pki", l’infrastructure de gestion de clés ou Public Key Infrastructure (PKI). Le répertoire "pki" contient les CA et le certificat du serveur OPC-UA. Le certificat du serveur est rejeté par défaut. On obtient un message "the trustAnchors parameter must be non-empty". Concrètement il est placé dans pki\rejected, il faut le déplacer dans pki\trusted\certs pour le valider. Ça semble être une pratique courante d'exiger une action manuelle pour valider le certificat auto-signé en le déplacer d'un répertoire rejected vers trusted |
/usr/Local/etc/opcua/security |
Windows: %TEMP%/client/security Linux: /tmp/client/security
|
SecurityKeystoreFilename | Nom du fichier keystore qui contient le certificat du client. Si SecurityPolicy est défini (autre que None), le certificat client sera chargé à partir de ce keystore. S'il n'existe pas un keystore sera généré automatiquement avec un certificat autosigné. |
tango-opcua.pfx |
tango-opcua-client.pfx |
SecurityKeystorePassword | Mot de passe du keystore | password |
Vide |
SecurityKeystoreAlias | Alias du certificat client dans le keystore | dev-el6-1 |
client-ai |
OpcUaSubscriber
Attributs
Tous les attributs sont créés dynamiquement d'après les propriétés.
Commandes
Le device ne dispose pas de commandes en dehors des commandes usuelles de Tango.
Propriétés
Nom | Description | Exemple | Valeur par défaut |
---|---|---|---|
SubscriptionsJson | La configuration du device au format JSON. Il y est décrit l'ensemble des souscriptions et des attributs avec leur paramètrage. |
Voir paragraphe dédié. | Videe |
DefaultOpcUaSamplingInterval | Intervalle d'échantillonnage des élemments pour les attributs de diagnostique. | 1000.0 | 1000.0 |
DefaultOpcUaPublishingInterval | Intervalle de publication pour la souscription des attributs de diagnostique. | 1000.0 | 1000.0 |
DefaultOpcUaNamespace | Espace de nommage à utiliser par défaut. | 1 | 1 |
DefaultOpcUaType | Type par défaut des identifiants. Il sera utilisé avec la commande ReadNode si le type n'est pas explicitement précisé. Les valeurs possibles sont : String, Numeric et Guid |
Numeric | String |
Un ensemble de propriété au nommage dynamique peut être utilisées pour décrire les souscriptions par les propriétés uniquement. Voir paragraphe dédié.
Evenements
Le device TangoOPCUA reçoit des évenements pour chaque changement de valeur d'un attribut OPCUA. En utilisant les propriété du device, il est possible de générer les évenements Tango équivalent.
Description des souscriptions au format json
Définition
Les souscriptions sont décrites dans un objets composé des éléments suivants :
- root
- subscriptions : tableau dont les élements représentent une souscription OPC-UA.
- subscription : objet représentant une souscription
- attributes : tableau dont les élements représentent des attributs tango à créer à partir d'éléments OPC-UA
- attribute : objet représentant un attribut.
- name : le nom de l'attribut dans tango. Il doit être unique pour tout le device.
- label : le label à utilisé. S'il n'es pas précisé, alors il sera identique au nom.
- read : décrit le nœud OPC-UA auquel souscrire pour la partie lecture de l'attribut.
- write : tableau de nœuds OPC-UA sur lesquels écrire pour la partie écriture de l'attribut. Optionnel. Si absent, alors l'attribut sera en read-only.
- readWrite : décrit le nœud OPC-UA auquel souscrire pour la partie lecture et écriture de l'attribut. Si présent alors les attribut "read" et "write" doivent être absents.
- events : tableau des évenements à produire en cas de notification de changmenent du nœud
- Les évenements possibles sont : change, archive, user_event et data_ready.
- samplingInterval : Interval d'échantillonnage du nœud lu.
- toBrowse : Booléen qui indique si le nœud est une racine à parcourir et qu'il faut souscrire en lecture à tous les nœuds finaux.
- toWriteLeafs : Booléen qui indique dans le cas ou le nœud est une racine à parcourir si les nœuds finaux doivent également être écrits.
- attribute : objet représentant un attribut.
- requestedPublishingInterval : The publishing interval requested to the OPC-UA server for this subscription.
- attributes : tableau dont les élements représentent des attributs tango à créer à partir d'éléments OPC-UA
- subscription : objet représentant une souscription
- defaultRequestedPublishingInterval : L'interval de publication à utiliser lorsqu'il n'est pas précisé dans les définitions des souscription.
- defaultSamplingInterval : L'interval d'échantillonnage à utiliser lorsqu'il n'est pas précisé dans les définitions des attributs.
- defaultNamespaceIndex : Le namespace index OPC-UA à utiliser lorsqu'il n'est pas précisé dans les définitions de nœuds.
- defaultType : Le type d'identifiant OPC-UA à utiliser lorsqu'il n'est pas précisé dans les définitions de nœuds. Les valeurs possibles sont : String, Numeric et Guid.
- subscriptions : tableau dont les élements représentent une souscription OPC-UA.
Nœuds OPC-UA
Les nœuds OPC-UA doivent être décrits avec les attributs suivant :
- Id : Identifiant OPC-UA. Sous forme d'une chaine de caractère, entre
"
, même s'il est numérique. Par exemple :"1138"
. - type : Type d'identifiant OPC-UA. Les valeurs possibles sont : String, Numeric et Guid.
- NamspaceIndex : Index du namespace du nœud.
Seul l'id est obligatoire. Les autres paramètres peuvent être remplacés par des valeurs par défaut.
Exemple
Dans l'exemple suivant, l'id OPC-UA contient le caractère "
. Il s'agit normalement d'un cartère réservé au language JSON. Afin qu'il soit interpreté, il faut utiliser le caractère d'échapement \
avant.
Il est décrit ci-dessous une souscription avec deux attributs tango : reel
et struct
.
Le nœud struct
est une structure OPC-UA. Un seul paramètre sera souscrit mais il y aura autant d'attributs tango que de membre dans la structure.
{
"subscriptions": [
{
"attributes": [
{
"name": "reel",
"read": {
"id": "\"DBOPCUA\".\"Reel\""
},
"write": [ {
"id": "\"DBOPCUA\".\"Reel\""
}
]
},
{
"name": "struct",
"read": {
"id": "\"DBOPCUA\".\"Structure\""
},
"write": [{
"id": "\"DBOPCUA\".\"Structure\""
}]
}
],
"requestedPublishingInterval": 1000.0
}
],
"defaultNamespaceIndex": 3,
"defaultRequestedPublishingInterval": 1000.0,
"defaultSamplingInterval": 1000.0,
"defaultType": "String"
}
Description des souscriptions par les propriétés uniquement
Définition
Afin de définir des souscriptions par les propriétés, il faut définir plusieurs ensembles de propriétés :
- IdentifiersSubscription
- Liste des différents nœuds OPC-UA auxquels souscrire. Cett propriété est obligatoire si l'on souhaite souscrire par ce procédé. Les identifiants doivent être décrits selon le format définis dans le paragraphe dédié.
- SubscriptionDefaultSamplingInterval
- L'interval d'échantillonnage à utiliser lorsqu'il n'est pas précisé dans les définitions des attributs. Optionnel.
- SubscriptionRequestedPublishingInterval
- L'interval de publication à utiliser pour cette souscription. Optionnel.
- SubscriptionDefaultOpcUaNamespace
- Le namespace index OPC-UA à utiliser lorsqu'il n'est pas précisé dans les définitions de nœuds. Optionnel.
- SubscriptionDefaultOpcUaType
- Le type d'identifiant OPC-UA à utiliser lorsqu'il n'est pas précisé dans les définitions de nœuds. Les valeurs possibles sont : String, Numeric et Guid.
Toutes ces propriétés doivent être suffixées par un nom de la souscription. Par exemple :
- IdentifiersSubscriptionAlpha
- SubscriptionDefaultSamplingIntervalAlpha
- SubscriptionRequestedPublishingIntervalAlpha
- SubscriptionDefaultOpcUaNamespaceAlpha
- SubscriptionDefaultOpcUaTypeAlpha
Définition des éléments à souscrire
Dans les propriétés IdentifiersSubscription
, les attributs doivent être définis selon 7 champs minimum, séparés par le caractère ;
:
- Le nom tango,
- Le label tango,
- La liste des évenments tango devant être générés, séparés par le caractère
,
.- Les valeurs possibles sont: change, archive, user_event et data_ready
- Il peut être vide.
- Le nœud OPC-UA auquel souscrire pour la lecture
- Obligatoire
- L'interval d'échantillonnage
- Il peut-être vide, la valeur par défaut du device sera utilisée.
- Un booléen indiquant s'il faut i le nœud doit
- Il peut-être vide, il est à faux par défaut.
- Si le nœud est parcouru, un booléen indique
- Il peut-être vide, il est à faux par défaut. Il n'est pas pris en compte si le précédent est à faux.
- Les nœuds ou écrire, séparés par le caractère
;
Nœuds OPC-UA
Les nœuds OPC-UA doivent être décrits avec les attributs suivant :
- Id : Identifiant OPC-UA. Sous forme d'une chaine de caractère, entre
"
, même s'il est numérique. Par exemple :"1138"
. - type : Type d'identifiant OPC-UA. Les valeurs possibles sont : String, Numeric et Guid.
- NamspaceIndex : Index du namespace du nœud.
Un namespaceIndex et un type d'identifiant par défaut sont définit par les propriété. Il est possible de définir un nœud de trois manières :
- Identifiant seul : le namespaceIndex et le type d'identifiant par défaut sont utilisés
"DBOPCUA"."Reel"
- NamespaceIndex, Identifiant : le type d'identifiant par défaut est utilisés
2,"DBOPCUA"."Reel"
- NamespaceIndex, Type d'identifiant, Identifiant : La description est complète.
2,string,"DBOPCUA"."Reel"
Exemple
Property | Value |
---|---|
IdentifiersSubscriptionAlpha |
reel;;;"DBOPCUA"."Reel";;; Att_Bool_Elec_1;;archive;/Application/SOLEIL/Batiment_T7/RDC/Elec/T7ELEC1.Value_Bool;1000.0;false;false;/Application/SOLEIL/Batiment_T7/RDC/Elec/T7ELEC1.Value_Bool;
|
SubscriptionDefaultSamplingIntervalAlpha |
200.0 |
SubscriptionRequestedPublishingIntervalAlpha |
1500 |
SubscriptionDefaultOpcUaNamespaceAlpha |
1 |
SubscriptionDefaultOpcUaTypeAlpha |
String |
Dans l'exemple ci-dessus une souscription est définie.
- L'interval de publication sera de 1500ms
- Elle comporte 2 attributs tango :
-
reel
- Pas de label Tango
- Le nœud OPCUA pour la partie en lecture de l'attribut tango sera :
- Namespace=1 : valeur par défaut de la souscription
- Identifiant du nœud :
"DBOPCUA"."Reel"
- Type d'ID=String : valeur par défaut de la souscription
- Pas d'évenements générés
- Inteval d'échantillonnage=200.0ms : valeur par défaut de la souscription
- L'attribut tango sera en lecture seule
- Le nœud OPC-UA ne sera pas parcouru et ne générera qu'un seul attribut tango
-
Att_Bool_Elec_1
- Le nœud OPCUA pour la partie en lecture de l'attribut tango sera :
- Namespace=1 : valeur par défaut de la souscription
- Identifiant du nœud :
/Application/SOLEIL/Batiment_T7/RDC/Elec/T7ELEC1.Value_Bool
- Type d'ID=String : valeur par défaut de la souscription
- Des évènements de type
archive
seront générés - Inteval d'échantillonnage=1000.0ms
- L'attribut tango sera en lecture et écriture. Il écrira sur le même nœud que pour la lecture.
- Le nœud OPC-UA ne sera pas parcouru et ne générera qu'un seul attribut tango
- Le nœud OPCUA pour la partie en lecture de l'attribut tango sera :
-
Déploiement
Script d’exécution et librairies
Le device utilise les librairies eclipse Milo et Jackson. Actuellement, ces dépendances ne sont pas présentes dans les déploiements. Il faut les rajouter ainsi que les dépendances liées.
Device server
DeviceServer: OPCUAProxy
Class: OpcUaConnector et OpcUaSubscriber