介紹
OPC UA全稱Open Platform Communication Unified Architecture,開放平臺統一架構,是工業自動化領域通用的資料交換協議,它有兩套主要的通訊機制:1.客戶端-伺服器通訊;2.釋出訂閱。Qt對OPC UA通訊標準也提供了支援,目前還是第三方庫的形式(不過Qt官方貌似有文件了),基於open62541開源庫進行了封裝,使得C++開發者也能很快捷、從容、深入的開發工業自動化軟體(組態軟體),專案地址:https://github.com/qt/qtopcua
編譯
拉取開原始碼
git clone https://github.com/qt/qtopcua --recursive
我使用的Qt版本是6.7.1 MSVC2019 64bit,因此要切換一下qtopcua倉庫的版本也為6.7.1,否則編譯不過
git checkout 6.7.1
在頂層CMakeLists.txt設定Debug除錯模式、使能構建Example的開關
set(CMAKE_BUILD_TYPE Debug)
set(QT_BUILD_EXAMPLES ON)
接著編譯構建就可以了
執行
opcuaviewer
在構建目錄進行以下操作:複製plugins\opcua
資料夾到examples\opcua\opcuaviewer
目錄下,然後執行opcuaviewer.exe
,這個程式用於檢視節點執行時資料
simulationserver
把examples\opcua\waterpump\simulationserver
目錄下的simulationserver.exe
也跑一下,這是一個後臺程式,沒有介面,使用的埠號是43344
通訊驗證
在opcuaviewer
依次配置以下資訊:①、②、③、④、⑤,主要埠號要改為43344
即可檢視到節點的資料資訊:Variable、Object、Method等
流程
客戶端和服務端的配置流程如下
客戶端
-
QOpcUaPkiConfiguration
配置PKI,生成應用id,這是是為了加密通訊過程 -
QOpcUaProvider
透過open62541
外掛建立QOpcUaClient
物件,QOpcUaClient
物件需要設定PKI、應用id -
QOpcUaClient
物件對整個通訊流程負責:- 通訊狀態(connectError、connected、disconnected、errorChanged、stateChanged、endpointsRequestFinished、findServersFinished),繫結以上幾個訊號處理不同的連線狀態
- 繫結url和port查詢伺服器
- 獲取Endpoints
- 連線Endpoints
-
QOpcUaClient
根據nodeId獲取指定節點QOpcUaNode
,QOpcUaNode
可以訪問以下attribute資訊:- Value
- NodeClass
- Description
- DataType
- BrowseName
- DisplayName
- Historizing
-
QOpcUaNode
可以透過訊號來更新相應的節點資訊- attributeRead
- attributeUpdated
- browseFinished
服務端
伺服器利用open62541
介面配置
- 初始化伺服器:呼叫UA_Server_new初始化一個伺服器例項、呼叫UA_ServerConfig_setMinimal繫結埠
- 先生成物件,每個物件有唯一的nodeId,生成物件核心的函式是:UA_Server_addObjectNode
- 根據物件生成變數節點,核心的函式是:UA_Server_addVariableNode
- 根據物件生成函式節點,核心的函式是:UA_Server_addMethodNode
- 關閉伺服器,要呼叫UA_Server_run_shutdown、UA_Server_delete介面,物件的nodeId也要清理一下
總結
- 總體來說OPC UA通訊並不難,跟DDS、ROS、ROS2(xml、protobuf)那一套有類似的地方,都屬於資料交換協議
- C#能做的,C++能做的更好,open62541就是一個開源的C語言庫,它能無縫地切換到C++開發環境