python工業網際網路監控專案實戰4—python opcua
前面章節我們採用OPC作為裝置到上位的資訊互動的協議,本章我們介紹跨平臺的OPC UA。OPC作為早期的工業通訊規範,是基於COM/DCOM的技術實現的,用於裝置和軟體之間交換資料,最初,OPC標準僅限於Windows作業系統。OPC是OLE for Process Control的縮寫(中文意思:用於過程控制的OLE)。
OPC規範包括了3大部分:
- OPC DA:OPC實時資料訪問規範,定義了包括資料值,更新時間與資料品質資訊的相關標準。前面實戰2我們使用openOPC獲取的tag位號值就屬於OPC DA,通過OPC DA讀取底層裝置的狀態、工業引數等位號的實時資料。
- OPC HDA:OPC歷史資料訪問規範,定義了查詢、分析歷史資料和含有時標的資料的方法。
- OPC AE:OPC報警事件訪問規範,定義了報警與時間型別的訊息類資訊,以及狀態變化管理等相關標準。
由於基於COM/DCOM的技術有著不能跨平臺的根本缺點,隨著技術的發展,OPC基金會在2008年釋出了新的規範:OPC UA (OPC Unified Architecture)OPC 統一框架。
1. OPC UA是什麼
2008年釋出的OPC統一架構(UA)將各個OPC Classic規範的所有功能整合到一個可擴充套件的框架中,獨立於平臺並且面向服務。OPC UA規範不再是基於COM/DCOM技術,因此OPC UA不僅能在Windows平臺上實現,更可以在Linux,以及其它的嵌入式平臺中實現。
這種多層方法實現了最初設計UA規範時的目標:
- 功能對等性:所有COM OPC Classic規範都對映到UA
- 平臺獨立性:從嵌入式微控制器到基於雲的基礎設施
- 安全性:資訊加密、身份驗證和稽核
- 可擴充套件性:新增新功能而不影響現有應用程式的能力
- 綜合資訊建模:用於定義複雜資訊
2. OPC UA相對於傳統OPC的變化
功能對等性
OPC UA不僅支援傳統OPC的所有功能,更支援更多新的功能:
- 發現:在本地PC和/或網路上查詢可用的OPC伺服器
- 地址空間:所有資料都是分層表示的(例如檔案和資料夾),允許OPC客戶端發現、利用簡單和複雜的資料結構
- 按需:基於訪問許可權讀取和寫入資料/資訊
- 訂閱:監視資料/資訊,並且當值變化超出客戶端的設定時報告異常
- 事件:基於客戶端的設定通知重要資訊
- 方法:客戶端可以基於在伺服器上定義的方法來執行程式等
- OPC UA產品和OPC Classic產品之間的整合可以通過COM/Proxy Wrappers輕鬆實現。
平臺獨立性
鑑於市場上有各種各樣的硬體平臺和作業系統,平臺獨立性就顯得至關重要。OPC UA包含但不限於以下平臺及系統:
硬體平臺:傳統PC硬體、雲伺服器、PLC、微控制器(ARM等)
作業系統:Microsoft Windows、Apple OSX、Android或任何Linux發行版本等
OPC UA為企業之間的互操作性提供必要的M2M、M2E及兩者之間的基礎架構。
安全性
最大的變化是OPC UA可以通過任何單一埠(經管理員開放後)進行通訊,這使得OPC通訊不再會由於防火牆受到大量的限制,實現Internet 通訊。
綜合資訊建模
OPC UA資訊建模框架將資料轉換為資訊。通過完全面向物件的功能,即使是最複雜的多級結構也可以建模和擴充套件。資料型別和結構在配置檔案中定義。 例如,現有的OPC Classic規範被建模為UA配置檔案,也可以由其他組織擴充套件:
更詳細的內容請參閱OPC基金會官網:http://opcfoundation.cn/
3. 安裝python-opcua元件
pip安裝:pip install opcua
元件按照完畢後,我們可以在python環境執行uadiscover命令檢視效果:
由於執行電腦上沒有執行的opcua服務端,命令沒有發現任何opcua服務。下面通過執行opcua上最新的服務端程式碼再來看看效果。
- 在C:\Python\Python36-32\Scripts\下建立examples目錄;
- Copy opcua原始碼下的server-minimal.py到C:\Python\Python36-32\Scripts\examples;
- 在C:\Python\Python36-32目錄下執行命令,如下圖:
- python C:\Python\Python36-32\Scripts\examples\server-minimal.py
重新執行uadiscover命令,結果如下:
現在連線到 OPCUA Sever 的模擬器提供的 OPC UA 服務了。
4. 建立一個4C9反應罐的OPCUA Server模擬器
4.1. 在Solution上新增一個Python Application Project Tank4C9Svr
開啟Tank4C9Svr.py檔案,修改Example裡的server-minimal.py檔案裡程式碼,模擬4C9反應罐如下:
import sys sys.path.insert(0, "..") import time import random from opcua import ua, Server if __name__ == "__main__": # setup our server server = Server() server.set_endpoint("opc.tcp://0.0.0.0:4840/freeopcua/server/") # setup our own namespace, not really necessary but should as spec uri = "http://examples.freeopcua.github.io" idx = server.register_namespace(uri) # get Objects node, this is where we should put our nodes objects = server.get_objects_node() # populating our address space myobj = objects.add_object(idx, "Tank4C9") status = myobj.add_variable(idx, "Status", 0) overheadFlow = myobj.add_variable(idx, "OverheadFlow", 0) buttomsFlow = myobj.add_variable(idx, "ButtomsFlow", 0) power = myobj.add_variable(idx, "Power", 0) #myVar.set_writable() # Set MyVariable to be writable by clients # starting! server.start() try: count = 0 while True: time.sleep(5) count = count + 1 print(count%4) if count%4>0: status.set_value(1) else: status.set_value(0) a= random.randint(100,500) print("OverheadFlow:"+str(a)) overheadFlow.set_value(a) buttomsFlow.set_value(random.randint(50,500)) power.set_value(random.randint(1000,5000)) finally: #close connection, remove subcsriptions, etc server.stop()
我們把Tank4C9Svr設定成solution預設啟動專案後,F5除錯執行Tank4C9Svr,如下圖:
5. opcua-client瀏覽4C9 opcua伺服器
安裝:pip install opcua-client
cmd視窗C:\Python\Python36-32\Scripts目錄下執行opcua-client.exe命令,如下圖:
位址列輸入 opc.tcp://localhost:4840 點選連線按鈕,就能看見我們構建的Tank4C9裝置和對於的tag變量了,如下圖:
我們可以在變數上右鍵來訂閱資料變化的讀取最新的資料值。
6. 小結
本小節主要介紹了OPC DA到OPC UA之間的關係,更多詳細的資訊參考OPC基金會官網。首先,我們使用 python-opcua 元件模擬構建一個Tank4C9的反應罐OPC UA伺服器,然後,演示OPC UA的Objects是如何構建的。最後,展示opcua-client連線這個OPCUA伺服器並訂閱資料變化是如何的顯示效果。下一節我們將用演示監控如何遷移到OPC UA資料通訊協議。
&n