Module opcxmlda
Le module opcxmlda permet de communiquer avec des serveurs OPC XML-DA (Data Access) pour lire et écrire des données industrielles via le protocole SOAP/HTTP.
Import
Pour importer le module en Lua :
Configuration YAML
Le module opcxmlda nécessite une configuration dans le fichier YAML de l'agent :
iot:
modules:
opcxmlda:
- name: opcxmlda1 # nom unique de l'instance
endpoint: "http://server:8080/OPC/DA" # URL du serveur OPC XML-DA
timeout: 30 # timeout en secondes (optionnel, défaut: 30)
locale_id: "en-US" # locale pour les messages (optionnel, défaut: "en-US")
username: "" # nom d'utilisateur (optionnel)
password: "" # mot de passe (optionnel)
# Options TLS (optionnel, pour HTTPS)
cert_file: "" # chemin vers le certificat client
key_file: "" # chemin vers la clé privée
ca_file: "" # chemin vers le certificat CA
insecure: false # ignorer la vérification TLS (défaut: false)
Détails de la configuration
- name : Nom unique de l'instance du module. Utilisé pour l'import en Lua.
- endpoint : URL complète du endpoint OPC XML-DA du serveur.
- timeout : Délai d'attente pour les requêtes SOAP, en secondes (défaut: 30).
- locale_id : Identifiant de locale pour les messages du serveur (défaut: "en-US").
- username : Nom d'utilisateur pour l'authentification HTTP Basic (optionnel).
- password : Mot de passe pour l'authentification HTTP Basic (optionnel).
- cert_file : Chemin vers le certificat client pour l'authentification TLS mutuelle (optionnel).
- key_file : Chemin vers la clé privée du certificat client (optionnel).
- ca_file : Chemin vers le certificat de l'autorité de certification (optionnel).
- insecure : Ignorer la vérification du certificat TLS du serveur (défaut: false).
API Lua
Liste des fonctions
| Fonction | Signature Lua | Rôle | Retour (succès) | Retour (échec) |
|---|---|---|---|---|
connect |
bool, err = opc.connect() |
Initialise le client HTTP. | true, nil |
nil, "msg" |
disconnect |
bool, err = opc.disconnect() |
Ferme les connexions. | true, nil |
nil, "msg" |
getStatus |
status, err = opc.getStatus() |
Récupère le statut du serveur. | table, nil |
nil, "msg" |
browse |
items, err = opc.browse([path]) |
Parcourt l'arborescence des items. | table, nil |
nil, "msg" |
read |
values, err = opc.read(items) |
Lit les valeurs d'items. | table, nil |
nil, "msg" |
write |
results, err = opc.write(items) |
Écrit des valeurs dans des items. | table, nil |
nil, "msg" |
getProperties |
props, err = opc.getProperties(items) |
Récupère les propriétés d'items. | table, nil |
nil, "msg" |
| Champs | opc.name, opc.type |
Métadonnées du module. | – | – |
opcxmlda.connect()
Initialise le client HTTP avec la configuration. Doit être appelé avant toute autre opération.
- Paramètres : Aucun
- Retour :
truesi l'initialisation est réussie.nilet un message d'erreur en cas d'échec (erreur de configuration TLS).
local opc = require("opcxmlda1")
local ok, err = opc.connect()
if not ok then
print("Erreur de connexion : " .. err)
return
end
print("Client OPC XML-DA initialisé")
opcxmlda.disconnect()
Ferme les connexions HTTP inactives et libère les ressources.
- Paramètres : Aucun
- Retour :
truesi la déconnexion est réussie.nilet un message d'erreur en cas d'échec.
local opc = require("opcxmlda1")
local ok, err = opc.disconnect()
if not ok then
print("Erreur de déconnexion : " .. err)
end
opcxmlda.getStatus()
Récupère le statut du serveur OPC XML-DA.
- Paramètres : Aucun
- Retour :
- Une table Lua contenant les informations du serveur.
nilet un message d'erreur en cas d'échec.
Champs retournés :
- StartTime : Heure de démarrage du serveur
- ProductVersion : Version du produit
- ServerState : État du serveur
- StatusInfo : Information de statut
- VendorInfo : Information sur le fournisseur
- SupportedLocales : Table des locales supportées
local opc = require("opcxmlda1")
opc.connect()
local status, err = opc.getStatus()
if not status then
print("Erreur : " .. err)
else
print("Serveur : " .. status.VendorInfo)
print("Version : " .. status.ProductVersion)
print("État : " .. status.ServerState)
end
opc.disconnect()
opcxmlda.browse([itemPath])
Parcourt l'arborescence des items disponibles sur le serveur.
- Paramètres :
-
itemPath(string, optionnel) : Chemin de l'item à parcourir. Si omis, parcourt la racine. -
Retour :
- Une table Lua (array) contenant les éléments enfants.
nilet un message d'erreur en cas d'échec.
Chaque élément contient :
- Name : Nom de l'élément
- ItemName : Nom complet de l'item
- ItemPath : Chemin de l'item
- IsItem : true si l'élément est un item lisible
- HasChildren : true si l'élément a des enfants
local opc = require("opcxmlda1")
opc.connect()
-- Parcourir la racine
local items, err = opc.browse()
if not items then
print("Erreur : " .. err)
else
for _, item in ipairs(items) do
print("Item : " .. item.Name .. " (ItemPath: " .. item.ItemPath .. ")")
if item.HasChildren then
print(" -> A des enfants")
end
end
end
-- Parcourir un chemin spécifique
local subitems, err = opc.browse("Simulation Items")
opc.disconnect()
opcxmlda.read(items)
Lit les valeurs d'un ou plusieurs items OPC.
- Paramètres :
-
items(string ou table) : Item unique (string) ou liste d'items (table) à lire. -
Retour :
- Une table Lua (array) contenant les valeurs lues.
nilet un message d'erreur en cas d'échec.
Chaque élément du résultat contient :
- ItemName : Nom de l'item
- ItemPath : Chemin de l'item
- Value : Valeur de l'item
- Quality : Qualité de la valeur (ex. "good")
- Timestamp : Horodatage de la valeur
- ResultID : Code de résultat (vide si succès)
local opc = require("opcxmlda1")
opc.connect()
-- Lecture d'un seul item
local values, err = opc.read("Simulation Items.Random.Real4")
-- Lecture de plusieurs items
local values, err = opc.read({
"Simulation Items.Random.Real4",
"Simulation Items.Random.Int4",
"Simulation Items.Bucket Brigade.Real4"
})
if not values then
print("Erreur : " .. err)
else
for _, item in ipairs(values) do
print(item.ItemName .. " = " .. tostring(item.Value) .. " [" .. item.Quality .. "]")
end
end
opc.disconnect()
opcxmlda.write(items)
Écrit des valeurs dans un ou plusieurs items OPC.
- Paramètres :
-
items(table) : Table contenant les items à écrire. Chaque élément est une table avec :ItemName(string) : Nom de l'itemItemPath(string, optionnel) : Chemin de l'itemValue: Valeur à écrire
-
Retour :
- Une table Lua (array) contenant les résultats de chaque écriture.
nilet un message d'erreur en cas d'échec.
Chaque élément du résultat contient :
- ItemName : Nom de l'item
- ItemPath : Chemin de l'item
- ResultID : Code de résultat (vide si succès)
local opc = require("opcxmlda1")
opc.connect()
local results, err = opc.write({
{ ItemName = "Simulation Items.Bucket Brigade.Real4", Value = 42.5 },
{ ItemName = "Simulation Items.Bucket Brigade.Int4", Value = 100 }
})
if not results then
print("Erreur d'écriture : " .. err)
else
for _, result in ipairs(results) do
if result.ResultID == "" then
print(result.ItemName .. " : succès")
else
print(result.ItemName .. " : échec (" .. result.ResultID .. ")")
end
end
end
opc.disconnect()
opcxmlda.getProperties(items)
Récupère les propriétés d'un ou plusieurs items OPC.
- Paramètres :
-
items(string ou table) : Item unique (string) ou liste d'items (table). -
Retour :
- Une table Lua (array) contenant les propriétés.
nilet un message d'erreur en cas d'échec.
Chaque élément contient :
- Name : Nom de la propriété
- Value : Valeur de la propriété
- Description : Description de la propriété
- ItemPath : Chemin de l'item
- ItemName : Nom de l'item
- ResultID : Code de résultat
local opc = require("opcxmlda1")
opc.connect()
local props, err = opc.getProperties("Simulation Items.Random.Real4")
if not props then
print("Erreur : " .. err)
else
for _, prop in ipairs(props) do
print(prop.Name .. " = " .. tostring(prop.Value))
end
end
opc.disconnect()
Exemple complet
local opc = require("opcxmlda1")
local json = require("json")
local alemca = require("alemca")
-- Connexion
local ok, err = opc.connect()
if not ok then
printError("Connexion OPC XML-DA échouée : " .. err)
return
end
-- Vérification du statut serveur
local status, err = opc.getStatus()
if not status then
printError("Erreur statut : " .. err)
opc.disconnect()
return
end
printInfo("Serveur OPC XML-DA : " .. status.VendorInfo .. " - " .. status.ServerState)
-- Lecture des valeurs
local values, err = opc.read({
"Process.Temperature",
"Process.Pressure",
"Process.Flow"
})
if not values then
printError("Erreur lecture : " .. err)
else
local data = {}
for _, item in ipairs(values) do
if item.Quality == "good" then
data[item.ItemName] = item.Value
end
end
-- Publication vers Alemca
alemca.publish(json.encode(data), "opc_data")
end
-- Déconnexion
opc.disconnect()
Champs Lua associés
opcxmlda.name: Retourne le nom de l'instance du module.opcxmlda.type: Retourne le type du module ("opcxmlda").