如何在 OpenOPC 服务器上的 VARIANT 结构中写入数组标记
How to write an array tag in a VARIANT structure on an OpenOPC server
我正在尝试与 OPC DA 服务器通信,需要写入数组格式的标签。我们可以连接模拟服务器,读取标签(int、real、array)和写入标签(int、real、str)。当我们需要写入数组标签时,问题就来了。 OpenOPC 库的开发者 (Barry Barnreiter) 建议使用 VARIANT 变量,因为 OPC“在编写复杂对象(如数组)时希望看到 Windows VARIANT 结构”。
- 我确实按照建议安装了 Pywin32(build 217)here。
- 我试图发送一个简单的整数而不是 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)
这是执行带有 opc_local.write 的行时出现的错误:
AttributeError: 'module' object has no attribute 'VARIANT'
这是完整的回溯:
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
这是电脑的配置:
- Windows 10
- Python 2.7
- 火焰兵 3.16
- Pywin32 版本 223
- OpenOPC 1.3.1 win32-py27
您需要将 python
升级到 3.9
,将 Pywin32
升级到 Build 302
。另外,你需要安装 OpenOPC-Python3x 1.3.1
.
根据 Python COM server throws 'module' object has no attribute 'VARIANT',Pywin32 build 217 中引入了 VARIANT
class。
正如您在 post 中包含的那样,您拥有 Pywin32 Build 223,这应该不是问题。但可以肯定的是,从这个可用下载列表中:Home / pywin32 / Build 217, I would specifically select pywin32-217.win-amd64-py2.7.exe.
如果还是不行,建议检查一下你列出的配置源;您只安装了一个版本的 python 吗?也许您有多个 Python 可能会混淆的 IDE?这些是一些常见的情况,可能会在修复错误时造成混淆。
您必须将线路 opc_local = OpenOPC.open_client()
更改为 opc_local = OpenOPC.client()
。这将使您直接连接到 OPC 服务器,而不是使用 OpenOPC 网关服务。
网关服务 exe 中不包含 VARIANT 结构。请注意,网关服务 exe 是它自己的冻结 Python 分发。因此它只包含它需要 运行 的 Python 模块,仅此而已。因此,通过避免使用网关服务,您应该不会遇到这个问题,因为您将完全使用您自己在 PC 上安装的 Python 分发来执行代码。
我正在尝试与 OPC DA 服务器通信,需要写入数组格式的标签。我们可以连接模拟服务器,读取标签(int、real、array)和写入标签(int、real、str)。当我们需要写入数组标签时,问题就来了。 OpenOPC 库的开发者 (Barry Barnreiter) 建议使用 VARIANT 变量,因为 OPC“在编写复杂对象(如数组)时希望看到 Windows VARIANT 结构”。
- 我确实按照建议安装了 Pywin32(build 217)here。
- 我试图发送一个简单的整数而不是 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)
这是执行带有 opc_local.write 的行时出现的错误:
AttributeError: 'module' object has no attribute 'VARIANT'
这是完整的回溯:
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
这是电脑的配置:
- Windows 10
- Python 2.7
- 火焰兵 3.16
- Pywin32 版本 223
- OpenOPC 1.3.1 win32-py27
您需要将 python
升级到 3.9
,将 Pywin32
升级到 Build 302
。另外,你需要安装 OpenOPC-Python3x 1.3.1
.
根据 Python COM server throws 'module' object has no attribute 'VARIANT',Pywin32 build 217 中引入了 VARIANT
class。
正如您在 post 中包含的那样,您拥有 Pywin32 Build 223,这应该不是问题。但可以肯定的是,从这个可用下载列表中:Home / pywin32 / Build 217, I would specifically select pywin32-217.win-amd64-py2.7.exe.
如果还是不行,建议检查一下你列出的配置源;您只安装了一个版本的 python 吗?也许您有多个 Python 可能会混淆的 IDE?这些是一些常见的情况,可能会在修复错误时造成混淆。
您必须将线路 opc_local = OpenOPC.open_client()
更改为 opc_local = OpenOPC.client()
。这将使您直接连接到 OPC 服务器,而不是使用 OpenOPC 网关服务。
网关服务 exe 中不包含 VARIANT 结构。请注意,网关服务 exe 是它自己的冻结 Python 分发。因此它只包含它需要 运行 的 Python 模块,仅此而已。因此,通过避免使用网关服务,您应该不会遇到这个问题,因为您将完全使用您自己在 PC 上安装的 Python 分发来执行代码。