JZGKCHINA
工控技术分享平台
尊重原创 勿抄袭
勿私放其他平台
写在前面
说起Github,在 IT圈中是无人不知的,甚至被程序员们戏称为“全球最大同性交友网站”。这里聚集了来自全球的超过5000万开发者,也是目前最大的开源社区。
MQTT (Message Queue Telemetry Transport),翻译成中文就是,遥测传输协议,其主要提供了订阅/发布两种消息模式,更为简约、轻量,易于使用,特别适合于受限环境(带宽低、网络延迟高、网络通信不稳定)的消息分发,属于物联网(Internet of Thing)的一个标准传输协议。
随着近年来IT与OT的加速融合,原来越多的工业应用场景有了“互联网+”的需求。来自IT行业的人才、资金涌进了传统的工业领域,一时间市面上如雨后春笋般的涌现了一大批“数据采集盒子”,PLC+盒子的方案成为了市场主流。
本文介绍了一种新的路径,在现有的PLC硬件平台上,通过源代码移植,为PLC增加目前物联网常用的MQTT通讯协议。这样就把传统的PLC控制功能和物联网的通讯能力整合在同一个硬件平台下,使得IT工程师和自动化工程师有了共同的平台。
第一步:在github上找代码
因为贝加莱平台除了支持IEC规定的六种自动化编程语言之外,还支持C/C++语言开发,所以我们先在Github上搜索MQTT,从结果中挑选了一个名为libemqtt的C语言代码。看介绍很合适:“Embedded C client library for the MQTT protocol”。嵌入式平台的代码一般都是轻量级的,更容易移植到PLC。
再看一下授权是LGPL,这是允许代码通过类库引用供商业软件使用的,且开发的商业软件不要求开源。
第二步:移植
libemqtt贴心的提供了pub.c和sub.c两个例程。通过分析例程,发现这个库的回调(callback)函数只有一个send(),用于发送tcp报文。
其它的几个函数init_socket(),close_socket(),read_packet()都只是在例程中调用。
我们第一步先实现send回调函数,例程源代码用的是socket方式通讯,贝加莱平台也有EthSock库可以直接使用socket函数编程。同时还有astcp库,提供更加简化的TCP通讯函数,这次我用astcp库来实现TCP通讯。
下图是astcp库的函数列表:
从表中可以看出,这个库可是支持SSL加密通讯的。
利用astcp库重写的回调函数send()的代码实现如下:
主程序需要调用astcp库的函数来建立tcp连接,调用libemqtt库的函数来发送报文,接收报文后也需要调用libemqtt库的函数来解析报文,在此就不赘叙。
完成后的任务视图如下,libemqtt.c和libemqtt.h来自github,不做任何修改。Main.c程序就是我自己写的主程序。
为了发送数据跨平台的可用性,我写了一个自动把变量数据转为Json格式字符串的函数JsonStrPutPV(),所以上传的内容为Json格式的变量内容。下图是引用方式,填入要解析的变量名,会自动把变量内容转换为Json格式字符串,支持复杂类型如结构体嵌套等。
上传变量的数据类型如图,我特意定义了一个嵌套结构体,目的为了测试json的语法解析是否正常。
第三步:测试
测试的硬件平台可以选择贝加莱任意一款带有网络接口的PLC,本例中我们用贝加莱PLC仿真器来测试。如下图:
MQTT服务器采用搭建在家中的群晖NAS服务器上安装的Mosquitto:
电脑端再安装一个MQTT.fx软件用来充当另一个客户端,注册hello/test标题的报文监听:
从图中我们可以看到,从PLC发送的Json格式的字符串已经可以被正确解析。
然后我们测试接收,先从MQTT.fx软件发送内容”test ABC”
然后到PLC在线监控窗口查看接收到了同样内容的报文。
至此测试完成,收发功能均正常。
写在最后
写下此文目的仅为抛砖引玉,对于自动化的同行来说,可以开拓思路,对于IT界的人士来说,内容虽然肤浅,但是提供了一条IT与OT平台融合的路径。
使IT工程师和自动化工程师可以在同一个平台下无缝协作,梯形图,结构文本和C++一起开发的项目将会有无尽可能。
IT技术带给自动化的将不仅是通讯的便利,还有算法和AI等等。
作者简介
陈巍:
现任北京亿德同创自动化技术有限公司技术总监,工控行业15年老兵,精通运动控制,总线通讯。主要服务OEM客户,涉及包装、印刷、制药、物流等行业。