Python通過DCOM調用實現OPC DA訪問

寫在最前面

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也得會用噠。

看看測試截圖吧

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章