介紹
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ù)

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

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

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

流程
客戶端和服務(wù)端的配置流程如下
客戶端
QOpcUaPkiConfiguration配置PKI,生成應(yīng)用id,這是是為了加密通信過(guò)程QOpcUaProvider通過(guò)open62541插件創(chuàng)建QOpcUaClient對(duì)象,QOpcUaClient對(duì)象需要設(shè)置PKI、應(yīng)用id-
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
-
QOpcUaClient根據(jù)nodeId獲取指定節(jié)點(diǎn)QOpcUaNode,QOpcUaNode可以訪問以下attribute信息:- Value
- NodeClass
- Description
- DataType
- BrowseName
- DisplayName
- Historizing
-
QOpcUaNode可以通過(guò)信號(hào)來(lái)更新相應(yīng)的節(jié)點(diǎn)信息- attributeRead
- attributeUpdated
- browseFinished
服務(wù)端
服務(wù)器利用open62541接口配置
- 初始化服務(wù)器:調(diào)用UA_Server_new初始化一個(gè)服務(wù)器實(shí)例、調(diào)用UA_ServerConfig_setMinimal綁定端口
- 先生成對(duì)象,每個(gè)對(duì)象有唯一的nodeId,生成對(duì)象核心的函數(shù)是:UA_Server_addObjectNode
- 根據(jù)對(duì)象生成變量節(jié)點(diǎn),核心的函數(shù)是:UA_Server_addVariableNode
- 根據(jù)對(duì)象生成函數(shù)節(jié)點(diǎn),核心的函數(shù)是:UA_Server_addMethodNode
- 關(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)境