最近,我一直在尝试使用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仍与组对象存在于同一位置,但是某些客户端方法不起作用:
如果我想要项目列表,则该列表为空,但是如果我请求服务器,我仍然会得到正确的答案。 至于读取方法,我会遇到很多错误,而且我真的不知道该如何解决。
如果有人知道这个问题或知道避免该问题的方法,我真的很感兴趣。