一、前言
OPCUA(OPC Unified Architecture)是一種應用層資料通訊協議,其規範由OPC基金會(OPC Foundation)制定,筆者在工作期間(面向西門子數控系統的資料採集)接觸該協議較多。
西門子數控系統產品稱作Sinumerik,其內部嵌入了一個OPCUA伺服器,透過乙太網連線,可以用上位機(普通電腦或工控機)的OPCUA客戶端程式訪問OPCUA伺服器,獲取Sinumerik數控系統內的各種資料。
採集到資料之後,我們才能構建更進一步的工作,例如機床的數字孿生 、工廠資訊視覺化大屏、實時機床健康狀態評估等等,可以說資料採集是所有上層服務的基礎。目前在機床資料採集方面,不同廠家的數控系統對外提供的採集協議都不太一樣,例如FANUC有FOCAS、西門子有OPCUA、華中數控有NC-Link,我們很可能遇到實際工廠中有支援不同協議的多種數控系統,這時就需要我們在資料採集軟體中實現支援不同協議的採集功能。
本系列文章聚焦於西門子數控系統Sinumerik支援的OPCUA通訊協議,探討如何使用微軟dotNet框架(C#)開發資料採集程式,並逐步完善各項功能,此外會結合OPC基金會官方文件探討OPCUA底層結構。基於其他協議的資料採集暫不討論。
二、準備工作
2.1 準備開發環境
2.1.1 Visual Studio2022
筆者使用的開發軟體是微軟的Visual Studio 2022,其完整安裝包較大。
建議配置時參考網上其他文章(關鍵詞:.NET開發,VS2022)。作業系統是windows11家庭版。
2.1.2 dotNet(.NET)
dotNet(.NET)開發環境/執行環境和C#的關係可以理解為JDK/JVM和Java之間的關係,如果是計算機專業的應該能明白。
如果不是計算機的,我簡略解釋一下,計算機底層(CPU)需要的是計算機電子電路能夠理解的二進位制機器碼,不同CPU架構(x86、ARM)的機器碼不一樣,我們寫的C#程式碼文字都需要轉換、翻譯成和計算機能讀懂的機器碼,因此有了.NET這類軟體框架作為中間媒介,負責轉換、翻譯,讓計算機能夠執行程式。
2.1.3 NuGet第三方包管理器
Visual Studio裡面有個叫NuGet的東西,相當於Python的pip,Java的Maven,其作用是在我們的專案裡引入其他人寫好的模組(第三方包)。
對於OPCUA相關的專案,必不可少的是OPC基金會提供的OPCUA相關模組,我們都是使用這個NuGet引入的。
2.2 獲取OPCUA客戶端示例
示例程式碼在 https://gitee.com/zuoquangong/opcuaapi
(注:該示例程式碼目前十分粗糙,存在UI層面的bug,一些重要功能如“訂閱”有待補全,筆者正在著手整理中)
本OPCUA客戶端示例的介面如下,設計的比較樸素,介面操作方法見第三章。
2.3 獲取OPCUA伺服器
我們在開發時身邊可能不會有Sinumerik數控系統,那麼需要在電腦上安裝一個可以用於測試的OPCUA伺服器軟體。
2.3.1 獲取Prosys軟體
推薦使用Prosys的軟體,叫“Prosys OPC UA Simulation Server”,別下載錯了。
Prosys官網入口:https://prosysopc.com/
注意,紅框裡這個“opc.tcp://SAM.mshome.net:53530/OPCUA/SimulationServer”就是該OPCUA伺服器的訪問地址(傳輸層為TCP協議),我們的OPCUA客戶端訪問這個地址即可。
實際Sinumerik中,OPCUA伺服器的埠是4840,可以連線的IP通常有X127除錯埠的192.168.215.1(該IP固定不可調),以及X130的公司網路埠192.168.1.6(該IP可以自己設,或透過DHCP獲取)。
2.3.2 切換模式
這個軟體有兩種模式,基礎模式(Basic Mode)和專家模式(Expert Mode),我們用專家模式。切換方法如下:
2.3.3 新增個使用者
Sinumerik系統的OPCUA預設使用者是OpcUaClient,我們在prosys裡也建一個這樣的使用者。
注意,兩次密碼一致“Add User”按鈕才能被點選。
這樣新使用者建立完畢,OPCUA客戶端程式可以使用該使用者身份與Prosys的OPCUA伺服器建立會話連線。
三、OPCUA初試
首先把prosys軟體執行起來,即OPCUA伺服器開始工作。
然後用Visual Studio2022開啟客戶端專案,開始執行客戶端程式碼。
3.1 連線伺服器
出現介面後,在伺服器地址輸入prosys提供的OPC地址,並填寫使用者名稱、密碼資訊。
點選“建立”,即可在伺服器和客戶端之間建立一個OPCUA會話:
成功建立OPCUA會話(Session)之後,可以檢視當前會話相關資訊:
我們可以透過點選“建立”按鈕,建立並維持多個會話;透過會話下拉選單選擇當前會話(currentSession);點選“取消”按鈕,可以斷開(DisConnect)當前會話。
3.2 瀏覽OPCUA伺服器內容
介面左側用於連線伺服器和會話管理(建立、切換、斷開、檢視資訊),介面右側則是基於當前會話的一些功能。
首先是瀏覽OPCUA伺服器。OPCUA伺服器內容可以樹狀目錄形式進行瀏覽,點選“瀏覽”按鈕,即可顯示OPCUA伺服器的根目錄節點內容:
這裡每一個內容都稱作一個“節點(Node)”,一個節點包含多個“屬性(Attribute)”。
單擊節點,即可顯示節點資訊(即節點內的各個屬性):
雙擊節點即可進入該節點,瀏覽其內部節點結構(例如雙擊“Objects”節點):
點選“返回”按鈕即可返回上一級目錄。
以上是基本的瀏覽功能,實際上也包含了節點資訊讀取(readNode)和節點值讀取(readValue),兩種讀取功能。在OPCUA中,基本的節點操作有:
其中“寫入”操作用的較少,因為筆者的工作中,OPCUA伺服器資料對應的是數控系統內資料,隨意改寫會導致安全問題。
實現這幾個操作就基本完成了一個客戶端的主幹功能,後面我們將結合原始碼和文件對這些操作逐步解讀。
3.3 觀察節點資訊
通常我們更關注如何讀取一個節點的值(readValue),我們可以觀察到每個節點都有一個ID
例如這個節點名稱為“Counter”的節點,其ID為“ns=3;i=1002”,ns是“namespace”的簡寫,代表一個名稱空間,“3”是該名稱空間在伺服器上的索引號,“1002”是其在該名稱空間內的索引號。該節點值為4。
我們進行資料採集,通常是透過OPCUA客戶端的瀏覽功能(Browser)找到想要獲取值的節點(例如機床Z軸座標或電流)的ID,然後呼叫讀取(readNode)或監控(subscription)方法,獲取其值。
如果咱們客戶端能快取節點ID就不用瀏覽,可以直接讀取節點值了。
總結
後續我們將對示例原始碼和伺服器節點結構等問題進行討論。
附錄
OPC基金會:OPCUA英文文件
OPCUA技術開發英文文件
*附言
由於作者水平有限,可能在文章中出現錯誤或不當描述,如有發現此類情況希望您能及時提供反饋,非常感謝!
如果感覺本文對您有所幫助,希望為文章點個推薦,謝謝。
作者聯絡方式,163郵箱:zuoquangong@163.com