我正在嘗試與 OPC DA 服務器通信,并且需要寫入一個陣列格式的標簽。我們可以連接模擬服務器,讀取標簽(int、real、array)和寫入標簽(int、real、str)。當我們需要寫入陣列標簽時,問題就來了。OpenOPC 庫的開發者 (Barry Barnreiter) 建議使用 VARIANT 變數,因為 OPC “在撰寫復雜物件(如陣列)時希望看到 Windows VARIANT 結構”。
- 我確實按照此處的建議安裝了 Pywin32 (build 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)
這是執行帶有 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
這是計算機的配置:
- 視窗 10
- 蟒蛇 2.7
- 火焰兵 3.16
- Pywin32 構建 223
- OpenOPC 1.3.1 win32-py27
uj5u.com熱心網友回復:
你必須改變你的行opc_local = OpenOPC.open_client()為opc_local = OpenOPC.client()。這將使您直接連接到 OPC 服務器,而不是使用 OpenOPC 網關服務。
VARIANT 結構不包含在網關服務 exe 中。請注意,網關服務 exe 是它自己的凍結 Python 發行版。因此,它只包含它需要運行的 Python 模塊,沒有其他任何內容。因此,通過避免使用網關服務,您應該不會遇到這個問題,因為您將完全使用自己安裝在 PC 上的 Python 發行版來執行代碼。
uj5u.com熱心網友回復:
您需要升級python到3.9和Pywin32到Build 302。此外,您需要安裝OpenOPC-Python3x 1.3.1.
uj5u.com熱心網友回復:
根據Python COM 服務器拋出 'module' object has no attribute 'VARIANT',VARIANT該類是在 Pywin32 build 217 中引入的。
正如您在帖子中提到的,您擁有 Pywin32 Build 223,這應該不是問題。但可以肯定的是,從以下可用下載串列中:Home / pywin32 / Build 217,我會特別選擇pywin32-217.win-amd64-py2.7.exe。
如果這不起作用,我建議檢查您列出的配置的來源;你只安裝了一個版本的python嗎?也許您有多個可能會混淆的 Python IDE?這些是一些常見的情況,可能會導致修復錯誤的混亂。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/377934.html
標籤:Python python-2.7 服务器 变体 操作员
下一篇:AttributeError:'dict'物件沒有屬性'click'錯誤與find_element_by_css_selector()和click()使用Sel
