Graham, 

thanks for the beta! I think my main problem is that I don't really
understand this code; I didn't write it. Could you recommend a book/website
that describes what these functions like 'group.OPCItems.AddItem' do? For
example I don't really know what a 'group' is or what the addItem()
parameters are, or how to interpret that error code that you interpreted,
and I'm not really sure if this code will work for other OPC servers other
than the automation direct server.

 

Also, where might I go learn about how to setup the event handler for a data
change event?

 

Thanks again, I appreciate your help!

 

Jeff

 

Message: 1

Date: Mon, 03 Dec 2007 10:21:35 +0000

From: Graham Bloice <[EMAIL PROTECTED]>

Subject: Re: [python-win32] problem accessing OPC clients from thread

To: python-win32@python.org

Message-ID: <[EMAIL PROTECTED]>

Content-Type: text/plain; charset=ISO-8859-1

 

Jeff Peery wrote:

> Hello,

> I'm getting in a bit over my head here and need some help. I'm running 

> a simple wxpython application that runs a thread in the background.

> The thread is supposed to read and write data to/from an OPC server - 

> which I use to communicate to a PLC (programmable logic controller, 

> for process automation). My OPC module works well for just reading and 

> writing to the OPC server; however when I try to read and write to the 

> OPC server from within the thread it doesn't work. I get this error:

>  

> Here's the snippet from my thread:

> # connect to server

> opcServerName = 'the server name goes here'

> opcItemName = 'the opc item goes here'

> (server, group) = myOPC.connectServer(opcServerName)

> item = myOPC.addItem(opcItemName, group) value = 

> myOPC.readItemValue(item) # the value return a tuple of info including 

> a value and timestamp and quality Here's the error that's returned:

> line 124, in readItemValue

>     return opcItem.Read(0x1)

>   File "<COMObject AddItem>", line 3, in Read

>   File "C:\Python25\lib\site-packages\win32com\client\dynamic.py",

> line 258, in _ApplyTypes_

>     result = self._oleobj_.InvokeTypes(*(dispid, LCID, wFlags, 

> retType, argTypes) + args)

> com_error: (-2147352567, 'Exception occurred.', (0, None, None, None, 

> 0, -2147221008), None)

The error code indicated (-2147221008) or 0x800401F0, is "CoInitialize has
not been called".  I would guess that you haven't done that on your thread.
Try adding a pythoncom.CoInitialize() or CoInitializeEx(0 call to the start
of the thread.  You might need the Ex version to set the correct threading
model.

>  

> I attached my OPC module, if its important to include the wxapp I can 

> do that to, but it's pretty apparent that the problem only happens 

> when I call my OPC funcitons from within a thread...

>  

> I suppose its also worthwhile to mention that I need to access the OPC 

> module from within a thread (thats not the main applications thread) 

> because I'm trying to aquire data from a PLC and I want to do that 

> continuously and not lock up my program.

>  

> Any ideas on how I might get this thing to work within the thread? Thanks!

>  

Although I think your code will work, it's not using OPC in it's normal
event driven mode of operation where the OPC Server will send an event when
the data read from the PLC changes.  You are using a polling mode, via
ReadItemValue().  If you added an event handler for the DataChange event of
the group then you would be automatically informed of any data (or quality)
changes without the need for a polling thread.  One caveat of this is that
you need to have a unique client handle for each data item in the group and
the supplied code always seems to just use a constant '1' in the call to
OPCItems.AddItem(). (in addItem()).

 

--

Regards,

 

Graham Bloice

 

 

_______________________________________________
python-win32 mailing list
python-win32@python.org
http://mail.python.org/mailman/listinfo/python-win32

Reply via email to