making a opc client in Python and use opc server Events

getgroup getelectronic at gmail.com
Wed Aug 8 10:23:03 EDT 2007


On 7 août, 07:17, jp.eugs... at googlemail.com wrote:
> On 28 juin, 16:55, jp.eugs... at googlemail.com wrote:
>
>
>
>
>
> > On 4 juin, 11:32, getelectro... at gmail.com wrote:
>
> > > Hi all
> > > I have a sample code to implementopcclientinPython. i use a
> > > file .py making by makepy with pythonwin for Com Interface.
> > > i can get all server in machine, connect to serveropc, disconnect,
> > > add group, add item, read, write item in serveropc.
>
> > > import win32com.client # librairie pour utiliser l'interface COM/DCOM
> > > from win32com.clientimport gencache
> > > gencache.EnsureModule('{DFB83232-A952-11D2-A46B-00C04F796375}', 0, 1,
> > > 0)
>
> > > for svr in opcserver.GetOPCServers():
> > >     print svr
>
> > > #connect to serverOPCDemo Simulation from Matrikon
> > > opcserver.Connect('Matrikon.OPC.Simulation.1')
>
> > > # Instance object Groups
> > > groups=opcserver.OPCGroups
> > > #add group
> > > group=groups.Add('Group1')
>
> > > #instance onject Items
> > > items=group.OPCItems
> > > # add item in serveropc
> > > tem=items.AddItem('File1.item1',1)
>
> > > #read item value
> > > item.Read(win32com.client.constants.OPCDevice)
>
> > > # write a new value
> > > item.Write(100)
>
> > > #read item value
> > > item.Read(win32com.client.constants.OPCDevice)
> > > #if no pb you have 100 :)
>
> > > #Disconnect
> > > #opcserver.Disconnect()
>
> > > BUT, and BUT, i want to use a event fromopcserver for uodating item
> > > value with this below class. And i don't konw how make it!!!!!!!!
> > > help me plz
>
> > > opcserver=win32com.client.Dispatch('OPC.Automation.1')
> > > and now i want to use events fromopcserver. in a class:
> > > class DIOPCGroupEvent:
> > > class DIOPCGroupsEvent:
> > > class DIOPCServerEvent:
>
> > Try this:
>
> > # Event Handlers
> > class ServerEvent:
> >         def __init__(self):
> >                 print 'Init ServerEvent'
>
> >         def OnServerShutDown(self, Reason):
> >                 print 'OnServerShutDown', Reason
>
> > class GroupEvent:
> >         def __init__(self):
> >                 print 'Init GroupEvent'
>
> >         def OnAsyncCancelComplete(self, CancelID):
> >                 print 'OnAsyncCancelComplete', CancelID
>
> >         def OnDataChange(self, TransactionID, NumItems, ClientHandles,
> > ItemValues, Qualities, TimeStamps):
> >                 print 'OnDataChange', zip(ClientHandles, ItemValues, Qualities)
>
> >         def OnAsyncReadComplete(self, TransactionID, NumItems, ClientHandles,
> > ItemValues, Qualities,
> >                                                  TimeStamps, Errors):
> >                 print 'OnAsyncReadComplete', zip(ClientHandles, ItemValues,
> > Qualities)
>
> >         def OnAsyncWriteComplete(self, TransactionID, NumItems,
> > ClientHandles, Errors):
> >                 print 'OnAsyncWriteComplete', zip(ClientHandles, Errors)
>
> > class GroupsEvent:
> >         def __init__(self):
> >                 print 'Init GroupsEvent'
>
> >         def OnGlobalDataChange(self, TransactionID, GroupHandle, NumItems,
> > ClientHandles, ItemValues,
> >                                                  Qualities, TimeStamps):
> >                 print 'OnGlobalDataChange', zip(ClientHandles, ItemValues,
> > Qualities)
>
> >opc= DispatchWithEvents('Matrikon.OPC.Automation.1', ServerEvent)
>
> > groups = DispatchWithEvents(opc.OPCGroups, GroupsEvent)
> > groups.DefaultGroupIsActive = True
> > groups.DefaultGroupUpdateRate = 2000
>
> > group1 = DispatchWithEvents(groups.Add('G1'), GroupEvent)
> > group2 = DispatchWithEvents(groups.Add('G2'), GroupEvent)
> > #etc ...
>
> > It works for the GroupsEvents but I don't get the GroupEvent for each
> > group, I may still do someting wrong..- Masquer le texte des messages précédents -
>
> > - Afficher le texte des messages précédents -
>
> In order to get the GroupEvent, you have to keep a reference to the
> group you add
> eg:
> g1 = groups.Add('G1')
> group1 = DispatchWithEvents(g1, GroupEvent)
> etc...- Masquer le texte des messages précédents -
>
> - Afficher le texte des messages précédents -

Hi Yes i try it.
But when a client get a datachange the script is bloked
you must kill a main thread, this solution is not good.

i have experimented this programme:

http://groups.google.fr/group/cn.bbs.comp.lang.python/browse_thread/thread/7904c9e48e50bf4d/1ecb94a0aca9e8d6?lnk=st&q=client+opc+python&rnum=25&hl=fr#1ecb94a0aca9e8d6

it run when a item in Group is changed But you can't do anything in a
loop WHEN.




More information about the Python-list mailing list