寫在最前面
Python、工業4.0、大數據等如此火熱,難得閒下來數小時,用Python實現下OPC DA Client玩兒玩兒吧。
工具
1.kepserver 作爲OPC DA 服務端
2.Python 3.7
3.OPC DA COM組件即opcdaauto.dll
開始
1.創建keyserver測試工程,這裏就不多講了直接上圖。測試而已,所以只加了一個變量。
2.如果機器沒註冊opcdaauto.dll Com組件,註冊COM。方法爲:
1)以管理員方式打開命令行
2)輸入regsvr32 + 路徑+opcdaauto.dll
3.上面工作準備完成後開始測試嘍,很簡單的。
1)首先引入必要包
2)拿到OPC DA組件
3)獲取OPCServer實例
opcserver = dll.OPCServer()
4)測試一下枚舉檢測到的OPC DA Server
for svr in opcserver.GetOPCServers():
print (svr)
因爲我電腦只裝了一個kepserver 6,所以結果如下圖
5)連接
opcserver.Connect('KEPware.KEPServerEx.V6')
6)拿到組實例
groups=opcserver.OPCGroups
groups.DefaultGroupIsActive = True
groups.DefaultGroupDeadband = 0
groups.DefaultGroupUpdateRate = 200
7)添加組,並訂閱回調事件
group = DispatchWithEvents(groups.Add('Group1'),GroupEvent)
group.IsActive = True
group.IsSubscribed = True
group.UpdateRate = 100
8)添加需要操作的條目
item1 = "T1.T1.Tag1"
item=items.AddItem(item1,1)
item.IsActive = True
myItems[1]=item
9)測試讀寫
a=0
b=0
c=0
d=0
item.Read(win32com.client.constants.OPCDevice,b,c,d)
# write a new value
item.Write(100)
item.Write(111)
item.Write(120)
#read item value
item.Read(win32com.client.constants.OPCDevice,b,c,d)
10)搞一個消息循環,不然訂閱無法正常觸發。這個問題卡了我挺長時間
root = Tk()
#root.withdraw() # 隱藏窗口
root.mainloop() # 消息循環
11)斷開連接
opcserver.Disconnect()
12)別忘記回調函數註冊
def OnDataChange(unknow,TransactionID,NumItems,ClientHandles,ItemValues,Qualities,TimeStamps):
i=0
print("callback")
while(i<NumItems):
handle = ClientHandles[i]
value = ItemValues[i]
quality = Qualities[i]
time = TimeStamps[i]
print("item:%s , value:%s , quality:%s , time:%s ",myItems[handle],value,quality,time)
i=i+1
結果:
經測試,讀、寫、訂閱均沒問題。
簡單封裝下就可以項目中使用了呦。
雖然現在UA是趨勢,但是DA也得會用噠。
看看測試截圖吧