1631|2

2945

帖子

4

TA的资源

五彩晶圆(中级)

楼主
 

【米尔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
  • # enable additional features
  • sudo apt-get install cmake-curses-gui # for the ccmake graphical interface
  • sudo apt-get install libmbedtls-dev # for encryption support
  • sudo apt-get install check libsubunit-dev # for unit tests
  • sudo apt-get install python-sphinx graphviz # for documentation generation
  • sudo apt-get install python-sphinx-rtd-theme # documentation style
  • cd open62541
  • mkdir build
  • cd build
  • cmake UA_ENABLE_AMALGAMATION=ON ..
  • make
  • # select additional features
  • ccmake ..
  • make
  • # build documentation
  • make doc # html documentation
  • make doc_pdf # pdf documentation (requires LaTeX)

这里的坑是: 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文件拷贝到一个目录

  • /* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
  • * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. */
  • #include "open62541.h"
  • #include <signal.h>
  • #include <stdlib.h>
  • /* Build Instructions (Linux)
  • * - gcc -std=c99 -c open62541.c
  • * - g++ server.cpp open62541.o -o server */
  • 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));
  • // add a variable node to the adresspace
  • 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);
  • /* allocations on the heap need to be freed */
  • 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的设备会越来越多。如果:大家在使用过程中有什么疑问可以联系作者。也欢迎大家来一起讨论。

最新回复

本次测试使用了较为高级的linux系统进行测试,但是我还发现open6541还支持freeRTOS系统,说明代码已经可以在一些高级的MCU上使用了。随着物联网的发展其它的工业设备也在发展。支持OPC UA的设备会越来越多。如果:大家在使用过程中有什么疑问可以联系作者。也欢迎大家来一起讨论。 感谢分享新知识!   详情 回复 发表于 2023-9-6 11:11
点赞 关注
 
 

回复
举报

7145

帖子

11

TA的资源

版主

沙发
 

本次测试使用了较为高级的linux系统进行测试,但是我还发现open6541还支持freeRTOS系统,说明代码已经可以在一些高级的MCU上使用了。随着物联网的发展其它的工业设备也在发展。支持OPC UA的设备会越来越多。如果:大家在使用过程中有什么疑问可以联系作者。也欢迎大家来一起讨论。

感谢分享新知识!

点评

谢谢,兄弟是认认真真地看完了,OPC UA的应用是有些复杂,国内高端的控制应用也慢慢的在发展。这种应用在DCS当中是十分普遍的  详情 回复 发表于 2023-9-6 11:49
 
 
 

回复

2945

帖子

4

TA的资源

五彩晶圆(中级)

板凳
 
lugl4313820 发表于 2023-9-6 11:11 本次测试使用了较为高级的linux系统进行测试,但是我还发现open6541还支持freeRTOS系统,说明代码已经可以 ...

谢谢,兄弟是认认真真地看完了,OPC UA的应用是有些复杂,国内高端的控制应用也慢慢的在发展。这种应用在DCS当中是十分普遍的

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
艾睿电子& Silicon Labs 有奖直播 | 全新蓝牙信道探测:从技术创新到实际应用
直播时间:3月12日(周三)上午10:00
直播奖励:多功能榨汁机、蓝牙音箱、手机支架

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表