【米尔STM32MP135】OPC UA服务端测试
[复制链接]
米尔STM32MP135开发板,带有两个千兆网卡,不做点高级的网络测试有点对不起这块板子。本次就使用这块板子上的linux系统做一组OPC UA的服务端测试。可能有小伙伴不知道OPC UA是个什么东东。简单的说OPC UA就是一种基于TCP/IP的高级通讯协议,这种协议在一些高档的PLC、机器人、仪表当中非常常见。这一协议可以做到”即插即用“,不像一些简单的通讯协议需要在SCADA系统中进行大量的设置才可以通讯,最麻烦的是一些厂家的协议还是专用的,需要使用厂家专用的库或协议,这种情况很是令人头疼。而带有这种协议的PLC或仪表,其数据格式、设置描述等信息可以自动上传。这将大大简化客户端的设置,基本上SCADA系统OPC UA是一项标准配置。
OPC UA协议脱胎于微软Windows系统下的OLED机制,早期较为复杂,很少能够在一些简单的设备中使用。后来OPC基金会将协议进行了拆分和简化制定出了OPC UA协议族,即使做了大量的简化,但对于无操作系统的单片机来说还是较为吃力。STM32MP135这样的MPU应该是没有什么问题地。
本次测试使用的是:功能较为全面的开源open62541库,这一库使用标准的C99编写,移植性很好。这个库的客户端和服务器功能都有。本次测试为服务器。
客户端使用的是:OPCFoundation推出的开源的.net客户端库,直接用的是其client例程。
一、下载和编译open62541库。
参考Building open62541一节的内容,
- sudo apt-get install git build-essential gcc pkg-config cmake python
-
-
- sudo apt-get install cmake-curses-gui
- sudo apt-get install libmbedtls-dev
- sudo apt-get install check libsubunit-dev
- sudo apt-get install python-sphinx graphviz
- sudo apt-get install python-sphinx-rtd-theme
-
- cd open62541
- mkdir build
- cd build
- cmake UA_ENABLE_AMALGAMATION=ON ..
- make
-
-
- ccmake ..
- make
-
-
- make doc
- make doc_pdf
这里的坑是: python-sphinx相关的脚本无法下载,这个是用来编译文档地,所以可以不用。
- git clone https://github.com/open62541/open62541.git -b V1.3.6
- git submodule update --init --recursive
这里建议不要下载Master分支,这个分支有可能无法编译。
在这里我兜兜转转的好次掉坑里,因为我的默认环境是x86的GNU开发环境,不是嵌入式的环境,所以就尝试了很多cmake的方案,然而确是十分的简单,直接使用STlinux的SDK就可以。这让我很是尴尬。上面过程中有个开关UA_ENABLE_AMALGAMATION=ON,这是关键,可以生成open62541.c和open62541.h文件。这样可以不去使用动态库等SDK。
make完成后生成open62541.c和open62541.h两个文件,将这两个文件和server.cpp文件拷贝到一个目录
-
-
- #include "open62541.h"
-
- #include <signal.h>
- #include <stdlib.h>
-
-
-
- using namespace std;
-
- UA_Boolean running = true;
-
- static void stopHandler(int sign) {
- UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "received ctrl-c");
- running = false;
- }
-
- int main() {
- signal(SIGINT, stopHandler);
- signal(SIGTERM, stopHandler);
-
- UA_Server *server = UA_Server_new();
- UA_ServerConfig_setDefault(UA_Server_getConfig(server));
-
-
- UA_VariableAttributes attr = UA_VariableAttributes_default;
- UA_Int32 myInteger = 42;
- UA_Variant_setScalarCopy(&attr.value, &myInteger, &UA_TYPES[UA_TYPES_INT32]);
- attr.description = UA_LOCALIZEDTEXT_ALLOC("en-US","the answer");
- attr.displayName = UA_LOCALIZEDTEXT_ALLOC("en-US","the answer");
- UA_NodeId myIntegerNodeId = UA_NODEID_STRING_ALLOC(1, "the.answer");
- UA_QualifiedName myIntegerName = UA_QUALIFIEDNAME_ALLOC(1, "the answer");
- UA_NodeId parentNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER);
- UA_NodeId parentReferenceNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES);
- UA_Server_addVariableNode(server, myIntegerNodeId, parentNodeId,
- parentReferenceNodeId, myIntegerName,
- UA_NODEID_NULL, attr, NULL, NULL);
-
-
- UA_VariableAttributes_clear(&attr);
- UA_NodeId_clear(&myIntegerNodeId);
- UA_QualifiedName_clear(&myIntegerName);
-
- UA_StatusCode retval = UA_Server_run(server, &running);
-
- UA_Server_delete(server);
- return retval == UA_STATUSCODE_GOOD ? EXIT_SUCCESS : EXIT_FAILURE;
- }
-
这个文件编译过程如下:
- $CC -std=c99 -c open62541.c
- $CXX server.cpp open62541.o -o server
注意:需要在STlinux SDK环境编译。
将生成的文件server拷贝到开发板当中。并且启动。
启动后等待连接。
在PC主机上启动客户端。服务器地址,opc.tcp://192.168.1.105:4840
开始连接
使用默认参数,OK
填写一个Session名字,OK
可以连接到服务器了。客户端也可以响应该服务了。
总结:本次测试使用了较为高级的linux系统进行测试,但是我还发现open6541还支持freeRTOS系统,说明代码已经可以在一些高级的MCU上使用了。随着物联网的发展其它的工业设备也在发展。支持OPC UA的设备会越来越多。如果:大家在使用过程中有什么疑问可以联系作者。也欢迎大家来一起讨论。
|