Qt OPC UA初體驗

hywing發表於2024-06-05

介紹

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,這個程式用於檢視節點執行時資料

image

simulationserver

examples\opcua\waterpump\simulationserver目錄下的simulationserver.exe也跑一下,這是一個後臺程式,沒有介面,使用的埠號是43344

image

通訊驗證

opcuaviewer依次配置以下資訊:①、②、③、④、⑤,主要埠號要改為43344

image

即可檢視到節點的資料資訊:Variable、Object、Method等

image

流程

客戶端和服務端的配置流程如下

客戶端

  1. QOpcUaPkiConfiguration配置PKI,生成應用id,這是是為了加密通訊過程

  2. QOpcUaProvider透過open62541外掛建立QOpcUaClient物件,QOpcUaClient物件需要設定PKI、應用id

  3. QOpcUaClient物件對整個通訊流程負責:

    • 通訊狀態(connectError、connected、disconnected、errorChanged、stateChanged、endpointsRequestFinished、findServersFinished),繫結以上幾個訊號處理不同的連線狀態
    • 繫結url和port查詢伺服器
    • 獲取Endpoints
    • 連線Endpoints
  4. QOpcUaClient根據nodeId獲取指定節點QOpcUaNodeQOpcUaNode可以訪問以下attribute資訊:

    • Value
    • NodeClass
    • Description
    • DataType
    • BrowseName
    • DisplayName
    • Historizing
  5. QOpcUaNode可以透過訊號來更新相應的節點資訊

    • attributeRead
    • attributeUpdated
    • browseFinished

服務端

伺服器利用open62541介面配置

  1. 初始化伺服器:呼叫UA_Server_new初始化一個伺服器例項、呼叫UA_ServerConfig_setMinimal繫結埠
  2. 先生成物件,每個物件有唯一的nodeId,生成物件核心的函式是:UA_Server_addObjectNode
  3. 根據物件生成變數節點,核心的函式是:UA_Server_addVariableNode
  4. 根據物件生成函式節點,核心的函式是:UA_Server_addMethodNode
  5. 關閉伺服器,要呼叫UA_Server_run_shutdown、UA_Server_delete介面,物件的nodeId也要清理一下

總結

  • 總體來說OPC UA通訊並不難,跟DDS、ROS、ROS2(xml、protobuf)那一套有類似的地方,都屬於資料交換協議
  • C#能做的,C++能做的更好,open62541就是一個開源的C語言庫,它能無縫地切換到C++開發環境