如何在 OpenOPC 服务器上的 VARIANT 结构中写入数组标记

Sim*_*ith 8 python variant opc python-2.7 server

我正在尝试与 OPC DA 服务器进行通信,并且需要写入数组格式的标签。我们可以连接模拟服务器,读取标签(int、real、array)和写入标签(int、real、str)。当我们需要写入数组标签时,问题就出现了。OpenOPC 库的开发人员 (Barry Barnreiter) 建议使用 VARIANT 变量,因为 OPC“希望在写入复杂对象(例如数组)时看到 Windows VARIANT 结构”。

  • 我确实按照此处的建议安装了 Pywin32(内部版本 217)。
  • 我尝试发送一个简单的整数而不是 VARIANT 结构中的数组。

这是代码:

from win32com.client import VARIANT
import pythoncom
import OpenOPC
opc_local = OpenOPC.open_client()
opc_local.connect('Matrikon.OPC.Simulation','localhost')
values = VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_R8, [1.0, 2.0, 3.0, 4.0, 5.0, 6.0])
w = opc_local.write(('Bucket Brigade.ArrayOfReal8', values))
print(w)
Run Code Online (Sandbox Code Playgroud)

这是执行 opc_local.write 行时出现的错误:

AttributeError: 'module' object has no attribute 'VARIANT'
Run Code Online (Sandbox Code Playgroud)

这是整个回溯:

runfile('C:/Users/nadmin/Downloads/sanstitre0.py', wdir='C:/Users/nadmin/Downloads')
Traceback (most recent call last):

  File "<ipython-input-5-6799f41ab928>", line 1, in <module>
    runfile('C:/Users/nadmin/Downloads/sanstitre0.py', wdir='C:/Users/nadmin/Downloads')

  File "C:\Users\nadmin\AppData\Local\Continuum\anaconda2\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 827, in runfile
    execfile(filename, namespace)

  File "C:\Users\nadmin\AppData\Local\Continuum\anaconda2\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 95, in execfile
    exec(compile(scripttext, filename, 'exec'), glob, loc)

  File "C:/Users/nadmin/Downloads/sanstitre0.py", line 14, in <module>
    w = opc_local.write(('Bucket Brigade.ArrayOfReal8', values))

  File "C:\Users\nadmin\AppData\Local\Continuum\anaconda2\lib\site-packages\Pyro\core.py", line 381, in __call__
    return self.__send(self.__name, args, kwargs)

  File "C:\Users\nadmin\AppData\Local\Continuum\anaconda2\lib\site-packages\Pyro\core.py", line 456, in _invokePYRO
    return self.adapter.remoteInvocation(name, Pyro.constants.RIF_VarargsAndKeywords, vargs, kargs)

  File "C:\Users\nadmin\AppData\Local\Continuum\anaconda2\lib\site-packages\Pyro\protocol.py", line 497, in remoteInvocation
    return self._remoteInvocation(method, flags, *args)

  File "C:\Users\nadmin\AppData\Local\Continuum\anaconda2\lib\site-packages\Pyro\protocol.py", line 572, in _remoteInvocation
    answer.raiseEx()

  File "C:\Users\nadmin\AppData\Local\Continuum\anaconda2\lib\site-packages\Pyro\errors.py", line 72, in raiseEx
    raise self.excObj
Run Code Online (Sandbox Code Playgroud)

这是计算机的配置:

  • Windows 10
  • Python 2.7
  • 火焰兵 3.16
  • Pywin32 内部版本 223
  • OpenOPC 1.3.1 win32-py27

Sim*_*ith 3

你必须改变你的opc_local = OpenOPC.open_client()线路opc_local = OpenOPC.client()。这将使您直接连接到 OPC 服务器,而不是使用 OpenOPC 网关服务。

VARIANT 结构不包含在网关服务 exe 中。请注意,网关服务 exe 是它自己的冻结 Python 发行版。因此,它只包含需要运行的 Python 模块,而不包含其他内容。因此,通过避免使用网关服务,您应该不会遇到此问题,因为您将完全使用您自己安装在 PC 上的 Python 发行版来执行代码。