Qt OPC UA初體驗(yàn)

介紹

OPC UA全稱Open Platform Communication Unified Architecture,開放平臺(tái)統(tǒng)一架構(gòu),是工業(yè)自動(dòng)化領(lǐng)域通用的數(shù)據(jù)交換協(xié)議,它有兩套主要的通信機(jī)制:1.客戶端-服務(wù)器通信;2.發(fā)布訂閱。Qt對(duì)OPC UA通信標(biāo)準(zhǔn)也提供了支持,目前還是第三方庫(kù)的形式(不過(guò)Qt官方貌似有文檔了),基于open62541開源庫(kù)進(jìn)行了封裝,使得C++開發(fā)者也能很快捷、從容、深入的開發(fā)工業(yè)自動(dòng)化軟件(組態(tài)軟件),項(xiàng)目地址:https://github.com/qt/qtopcua

編譯

拉取開源代碼

git clone https://github.com/qt/qtopcua --recursive

我使用的Qt版本是6.7.1 MSVC2019 64bit,因此要切換一下qtopcua倉(cāng)庫(kù)的版本也為6.7.1,否則編譯不過(guò)

git checkout 6.7.1

在頂層CMakeLists.txt設(shè)置Debug調(diào)試模式、使能構(gòu)建Example的開關(guān)

set(CMAKE_BUILD_TYPE Debug)
set(QT_BUILD_EXAMPLES ON)

接著編譯構(gòu)建就可以了

運(yùn)行

opcuaviewer

在構(gòu)建目錄進(jìn)行以下操作:拷貝plugins\opcua文件夾到examples\opcua\opcuaviewer目錄下,然后運(yùn)行opcuaviewer.exe,這個(gè)程序用于查看節(jié)點(diǎn)運(yùn)行時(shí)數(shù)據(jù)

image.png

simulationserver

examples\opcua\waterpump\simulationserver目錄下的simulationserver.exe也跑一下,這是一個(gè)后臺(tái)程序,沒有界面,使用的端口號(hào)是43344

image.png

通信驗(yàn)證

opcuaviewer依次配置以下信息:①、②、③、④、⑤,主要端口號(hào)要改為43344

image.png

即可查看到節(jié)點(diǎn)的數(shù)據(jù)信息:Variable、Object、Method等

image.png

流程

客戶端和服務(wù)端的配置流程如下

客戶端

  1. QOpcUaPkiConfiguration配置PKI,生成應(yīng)用id,這是是為了加密通信過(guò)程

  2. QOpcUaProvider通過(guò)open62541插件創(chuàng)建QOpcUaClient對(duì)象,QOpcUaClient對(duì)象需要設(shè)置PKI、應(yīng)用id

  3. QOpcUaClient對(duì)象對(duì)整個(gè)通信流程負(fù)責(zé):

    • 通信狀態(tài)(connectError、connected、disconnected、errorChanged、stateChanged、endpointsRequestFinished、findServersFinished),綁定以上幾個(gè)信號(hào)處理不同的連接狀態(tài)
    • 綁定url和port查找服務(wù)器
    • 獲取Endpoints
    • 連接Endpoints
  4. QOpcUaClient根據(jù)nodeId獲取指定節(jié)點(diǎn)QOpcUaNodeQOpcUaNode可以訪問以下attribute信息:

    • Value
    • NodeClass
    • Description
    • DataType
    • BrowseName
    • DisplayName
    • Historizing
  5. QOpcUaNode可以通過(guò)信號(hào)來(lái)更新相應(yīng)的節(jié)點(diǎn)信息

    • attributeRead
    • attributeUpdated
    • browseFinished

服務(wù)端

服務(wù)器利用open62541接口配置

  1. 初始化服務(wù)器:調(diào)用UA_Server_new初始化一個(gè)服務(wù)器實(shí)例、調(diào)用UA_ServerConfig_setMinimal綁定端口
  2. 先生成對(duì)象,每個(gè)對(duì)象有唯一的nodeId,生成對(duì)象核心的函數(shù)是:UA_Server_addObjectNode
  3. 根據(jù)對(duì)象生成變量節(jié)點(diǎn),核心的函數(shù)是:UA_Server_addVariableNode
  4. 根據(jù)對(duì)象生成函數(shù)節(jié)點(diǎn),核心的函數(shù)是:UA_Server_addMethodNode
  5. 關(guān)閉服務(wù)器,要調(diào)用UA_Server_run_shutdown、UA_Server_delete接口,對(duì)象的nodeId也要清理一下

總結(jié)

  • 總體來(lái)說(shuō)OPC UA通信并不難,跟DDS、ROS、ROS2(xml、protobuf)那一套有類似的地方,都屬于數(shù)據(jù)交換協(xié)議
  • C#能做的,C++能做的更好,open62541就是一個(gè)開源的C語(yǔ)言庫(kù),它能無(wú)縫地切換到C++開發(fā)環(huán)境
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容