Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Réalisation d'un Client OPC en Python

9 réponses
Avatar
pierlau
Bonjour,

J'utilise un Serveur OPC pour "communiquer" avec des Automates, Variateurs
de vitesse etc...
Je souhaiterais programmer un client OPC en Python.
Pour se faire, je dispose de la dll OPCDAAuto.dll qui contient différentes
classes à instancier pour se connecter aux serveurs puis créer les groupes
et les items ainsi que faire les lectures/ecritures des différents éléments.

L'utilisation de cette dll est immédiate en VB ou VBA, mais j'ai un peu de
mal sous python.

Ma question est la suivante : comment instancier des classes qui sont dans
une dll sous python ?

J'ai vu qu'avec le module ctypes ont pouvait accéder à des fonctions dans
une dll, mais je n'ai pas l'impression que l'on puisse instancier des
objets.

Merci de votre aide

9 réponses

Avatar
blukbluk
Un Serveur OPC contient en fait des objets COM, il faut donc passer
generer les interfaces COM pour Python avec makepy dans PythonWin.
Tu devrais trouver pas mal d'exemple pour piloter Excel ou Word grace
aux interfaces IDispatch de tes objets COM
En theorie, c'est le meme principe... en pratique c'est peut etre un
peu plus dur
J'avais jeter un oeil a ca il y a quelques annees, je vais essayer de
retrouver ce que j'avais fait mais je me souviens avoir un peu galere
Bon courage
Avatar
pierlau
Un Serveur OPC contient en fait des objets COM, il faut donc passer
generer les interfaces COM pour Python avec makepy dans PythonWin.
Tu devrais trouver pas mal d'exemple pour piloter Excel ou Word grace
aux interfaces IDispatch de tes objets COM
En theorie, c'est le meme principe... en pratique c'est peut etre un
peu plus dur
J'avais jeter un oeil a ca il y a quelques annees, je vais essayer de
retrouver ce que j'avais fait mais je me souviens avoir un peu galere
Bon courage



Pour l'instant, je m'en sort de la façon suivante :
J'ai crée le client OPC dans une feuille excel dans laquelle j'ai
chargé la Dll OPCDAAutomation et qui me permet de me connecter au server
puis de créer les groupes et les items que je veux lire/ecrire.
Python lit et ecrit dans les cellules de la feuille Excel.

Si on arrivait à accéder directement aux fonction de la dll depuis
python ca serait plus 'pratique'...
J'avais envie de m'inspirer de ce qui a été fait dans le module Pyvisa
qui permet d'accéder aux fonctions de la dll VISA32 directement en
Python, mais ca n'a pas l'air si simple...

En fait, je suis à la limite de mes connaissances (compétences) en
informatique des que l'on commence a rentrer dans des domaines tel que
COM/DCOM....

Je suis néamoins preneur de toutes infos ou essais fait dans ce domaine...

Avatar
Méta-MCI
Bonjour !


Je ne connais pas la tech OPC.


Néanmoins, pour accéder à une DLL, il est possible d'utiliser "ctypes"
(http://starship.python.net/crew/theller/ctypes/)
Mais, pour accéder aux DLL, il est nécessaire de connaître précisément la
structure des appels.


Et, pour COM/DCOM, il faut installer PyWin32
(http://sourceforge.net/projects/pywin32/)

Comme Blukbluk, perso, j'aurais tendance à préférer COM, à cause du
transtypage dynamique (partiel).
Comme l'a indiqué Blukbluk, l'utilitaire MakePy permet d'analyser les
objets/serveurs COM qui ont une bibliothèque de types (exemples : Word,
Excel, MSagent). Malheureusement, cela ne marche par avec les serveurs COM
dynamique (exemples OOo, les serveurs COM développés avec PythonCom,
ActiveS )
Dans ce dernier cas, il faut se plonger dans les documentations, et...
expérimenter.


@-salutations
--
Michel Claveau
Avatar
blukbluk
OPC ca veut dire OLE for Process Control... c'est une techno tres
utilise dans le monde de l'automatisme. en gros, C'est un protocole de
communication base sur des interfaces COM/DCOM a implementer.

Il faut donc, a mon avis, forcement passer par makepy et COM
Avatar
Méta-MCI
Bonsoir !


OLE, bien que basé sur COM/DCOM, échange plus de choses, notamment des
aspects visuels (icônes, boutons, menus, etc.) Je ne suis pas sûr que Python
permettent de gérer ça facilement.

Pour l'aspect COM, Makepy est pratique... quand ça marche. Mais, par
expérience, rien ne vaut une bonne documentation.


En tout cas, merci pour l'info sur la définition ; ça me resservira sans
doute, un jour ou l'autre.


@-salutations

Michel Claveau
Avatar
blukbluk
Apres avoir genere l'interface Python pour OPC avec makepy, le code
suivant permet d'afficher la valeur du Tag T0 qui se trouve sur le
serveur DllTestSvr

import win32com.client

OPC = win32com.client.Dispatch('OPC.Automation.1')

#affiche la liste des serveurs OPC installes sur la machine
for svr in OPC.GetOPCServers():
print svr

OPC.Connect("DLLTestSvr") #connexion au server OPC de test WinTech

#cree 1 groupe OPC
groups = OPC.OPCGroups
gr1 = groups.Add("gr1").OPCItems

#Ajoute un item a ce groupe
T0= gr1.AddItem("T0", 0)

#affiche la valeur courante
print T0.Read(0) #Source mis a 0... cf doc OPC?

#deconnexion
OPC.Disconnect()
Avatar
pierlau
Merci beaucoup pour votre aide.

Par contre qu'est-ce que vous entendez par "générer l'interface Python
pour OPC avec makepy ?"

je lance 'COM Makepy Utility' dans le menu 'tool' de pythonWin
Ensuite je choisis la dll qui conserne l'OPC
et il génére un repertoire dans
Generating to C:Python24libsite-packageswin32comgen_py

Ensuite comment j'utilise ce qu'a généré cet utilitaire ?
juste avec le ligne import win32com.client ?

Apres avoir genere l'interface Python pour OPC avec makepy, le code
suivant permet d'afficher la valeur du Tag T0 qui se trouve sur le
serveur DllTestSvr

import win32com.client

OPC = win32com.client.Dispatch('OPC.Automation.1')

#affiche la liste des serveurs OPC installes sur la machine
for svr in OPC.GetOPCServers():
print svr

OPC.Connect("DLLTestSvr") #connexion au server OPC de test WinTech

#cree 1 groupe OPC
groups = OPC.OPCGroups
gr1 = groups.Add("gr1").OPCItems

#Ajoute un item a ce groupe
T0= gr1.AddItem("T0", 0)

#affiche la valeur courante
print T0.Read(0) #Source mis a 0... cf doc OPC?

#deconnexion
OPC.Disconnect()



Avatar
blukbluk
C'est fait par les 2 lignes suivantes:

import win32com.client
OPC = win32com.client.Dispatch('OPC.Automation.1')
Avatar
pierlau
C'est fait par les 2 lignes suivantes:

import win32com.client
OPC = win32com.client.Dispatch('OPC.Automation.1')



Ok, j'ai implementé tel qu'indiqué et ca marche !
Merci beaucoup de votre aide.