与多个线程一起使用OpenOPC

时间:2018-07-17 13:59:10

标签: python multithreading opc

最近,我一直在尝试使用OpenOPC创建客户端,为此,我使用Windows机器,并且为了运行测试,我使用了Matrikon OPC Server Simulation。

由于测试可以在模拟服务器上完美运行,所以我尝试通过自动机在真实服务器上进行测试,一切都很好,我可以轻松地从服务器上的项目中收集信息。

我现在尝试的最后一件事是尝试使用线程,我希望能够以不同的速度读取几组Item。

为此,我使用以下代码:

import OpenOPC
from pprint import pprint
import time
from datetime import datetime
from threading import Thread

opc=OpenOPC.client()
opc.connect('Matrikon.OPC.Simulation.1')

l=opc.list('Simulation Items.Random')

class lec(Thread):

    def __init__(self, pace, name,liste):

        Thread.__init__(self)
        self.pace = pace
        self.name=name
        self.liste=liste
        print ("opclist : ",opc.list('Simulation Items.Random')[0:4])

    def run(self):

        print("opclist run : ", opc.list('Simulation Items.Random'))
        print(opc)
        print(opc.servers())


        opc.read(self.liste,group=self.name)
        time.sleep(self.pace)



thred1=lec(3,"test",l)

thred1.start()

thred1.join()

opc.close()

我得到以下答案:

opclist :  ['Random.ArrayOfReal8', 'Random.ArrayOfString', 'Random.Boolean', 'Random.Int1']
opclist run :  []
<OpenOPC.client object at 0x02872F90>
['OMRON.OpenDataServer.1', 'Matrikon.OPC.Simulation.1']
Exception in thread test:
Traceback (most recent call last):
  File "c:\Users\fma\Documents\Client_OpenOPC_DCOM\env\lib\OpenOPC.py", line 426, in iread
    opc_group = opc_groups.GetOPCGroup(sub_group)
  File "C:\Users\fma\AppData\Local\Temp\gen_py\3.6\F8582D24-88FB-11D0-B850-00C0F0104305x0x1x0.py", line 404, in GetOPCGroup
    ret = self._oleobj_.InvokeTypes(1610743823, LCID, 1, (13, 0), ((12, 1),),ItemSpecifier
pywintypes.com_error: (-2147352567, 'Une exception s’est produite.', (0, None, None, None, 0, -2147467259), None)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "c:\Users\fma\Documents\Client_OpenOPC_DCOM\env\lib\OpenOPC.py", line 433, in iread
    opc_group = opc_groups.Add(sub_group)
  File "C:\Users\fma\AppData\Local\Temp\gen_py\3.6\F8582D24-88FB-11D0-B850-00C0F0104305x0x1x0.py", line 376, in Add
    ret = self._oleobj_.InvokeTypes(1610743822, LCID, 1, (13, 0), ((12, 17),),Name
pywintypes.com_error: (-2147352567, 'Une exception s’est produite.', (0, None, None, None, 0, -2147417842), None)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\fma\AppData\Local\Programs\Python\Python36-32\Lib\threading.py", line 916, in _bootstrap_inner
    self.run()
  File "c:\Users\fma\Documents\Client_OpenOPC_DCOM\truc.py", line 29, in run
    opc.read(self.liste,group=self.name)
  File "c:\Users\fma\Documents\Client_OpenOPC_DCOM\env\lib\OpenOPC.py", line 624, in read
    return list(results)
  File "c:\Users\fma\Documents\Client_OpenOPC_DCOM\env\lib\OpenOPC.py", line 436, in iread
    raise OPCError(error_msg)
OpenOPC.OPCError: AddGroup: -2147417842

问题是,当我进入Thread的运行部分时,opc仍与组对象存在于同一位置,但是某些客户端方法不起作用:

如果我想要项目列表,则该列表为空,但是如果我请求服务器,我仍然会得到正确的答案。 至于读取方法,我会遇到很多错误,而且我真的不知道该如何解决。

如果有人知道这个问题或知道避免该问题的方法,我真的很感兴趣。

0 个答案:

没有答案