Qt OPC UA初体验
介绍
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++开发环境