JZGKCHINA
工控技术分享平台
尊重原创 勿抄袭
勿私放其他平台
前 言:
近几年,物联网领域mqtt协议以轻量级的优势风靡起来,众多物联网设备开始需要使用mqtt协议来相互沟通。但是,在工控领域,对mqtt协议的直接支持还寥寥无几。如果有用户想将PLC或仪表的数据通过mqtt直接传输至数据中心呢?
北京伟联科技有限公司WL-320E-M边缘计算模块来帮忙。不需要修改PLC程序哦!
本文以AB L33ERMPLC为例,将部分数据写入到WiSCADA 3.0软件的mqtt服务器内变量中。
思路:
先将PLC数据读回来,再按照mqtt服务器规定的格式编写JSON字符串,通过mqtt客户端写入功能将数据写入。
WiSCADA 3.0软件支持mqtt 服务器,OPC UA服务器、Modbus服务器 。
在WiSCADA 3.0软件内配置一些内部变量用于通过mqtt协议发布。在模拟变量属性的量程变换选项里面,扩展区域,写上mqtt=topic,这个topic名称可以自定义,本文测试使用testdata,记住这个名称,后面读取的时候会需要。其实也就是使用这个topic名称将需要发布的变量分类。多配置几个变量。
同时给这几个变量关联了秒变化变量,这些数据会随着秒的变化而变化。
01
配置WiSCADA 3.0软件的扩展服务,选择mqtt服务器,启用
配置WiSCADA 3.0软件的扩展服务,选择mqtt发布服务,启用。此处需要注意几个参数
- 服务器地址:mqtt服务器的IP地址,本文测试环境启用WiSCADA3.0软件自带的mqtt 服务器功能,此处可以写127.0.0.1,表示本机,也可以写本地计算机网卡IP地址。
- 服务器端口:mqtt服务器端口
- 客户端标识:WiSCADA 3.0软件自定义的。
- 心跳时间:检测连接状态
- 质量:选择质量选项
- 写入主题:自定义,用于订阅客户端执行写入功能时对变量的分类
- 用户名:由mqtt server提供的用户名密码,本文为admin密码admin。如果是第三方提供mqtt server,该用户名密码需要联系管理员获取。
- 发送周期:可控制消息发布的频率
配置完毕后运行WiSCADA软件。
02
接下来读取PLC数据
在伟联边缘计算模块内,使用eth-ip in读取AB PLC数据,配合inject节点周期性触发整条流程,使用function函数整理读取回来的数据。
Inject节点配置如下:
使用mqtt out节点执行mqtt协议数据的写入,在边缘计算模块内拖拽mqtt out节点用于写入数据到mqtt server,需要注意,写入操作需要mqtt server允许,如果连接的是其他mqtt服务器,需要联系管理员确认。
本文中WiSCADA 3.0软件提供的数据写入格式为
[{"id":"Tagname","v":value}]
Tagname为WiSCADA 3.0软件内发布的变量名,value为要写入的数值。
注意,每个mqtt服务器提供的数据写入JSON格式不尽相同,需要与管理索要详细的文档才可以。
Function节点配置如下,根据mqtt服务器提供的数据格式,整理数据
代码语言:javascript复制var ValueData = new Array() //定义数组
//定义全局变量存储标签值,有多少标签就需要定义多少这种全局变量
var TestFloat_0 = context.get('TestFloat_0')
var TestFloat_1 = context.get('TestFloat_1')
var TestFloat_2 = context.get('TestFloat_2')
var TestFloat_3 = context.get('TestFloat_3')
var TestFloat_4 = context.get('TestFloat_4')
//判断当前接受的消息是否是记录触发消息
if(msg.payload == "RecordStart")
{
SetValue() //调用子函数
msg.payload = ValueData //输出该数组
return msg; //函数节点输出
}
else //如果接收的消息不是记录触发消息,为正常的数据,将消息传递给全局变量
{
TestFloat_0 = msg.payload["TsetFloat[0]"]; //获取上一节点读取到的标签值
TestFloat_1 = msg.payload["TsetFloat[1]"]; //获取上一节点读取到的标签值
TestFloat_2 = msg.payload["TsetFloat[2]"]; //获取上一节点读取到的标签值
TestFloat_3 = msg.payload["TsetFloat[3]"]; //获取上一节点读取到的标签值
TestFloat_4 = msg.payload["TsetFloat[4]"]; //获取上一节点读取到的标签值
context.set('TestFloat_0',TestFloat_0) //将获取的消息传递给全局变量
context.set('TestFloat_1',TestFloat_1)
context.set('TestFloat_2',TestFloat_2)
context.set('TestFloat_3',TestFloat_3)
context.set('TestFloat_4',TestFloat_4)
}
function SetValue()
{ //有多少变量值需要写入,就需要在此创建多少数组对象
ValueData[0]={
"id": "Sim1_tag11",
"v": TestFloat_0
}
ValueData[1]={
"id": "Sim1_tag12",
"v": TestFloat_1
}
ValueData[2]={
"id": "Sim1_tag13",
"v": TestFloat_2
}
}
配置完成后部署到边缘计算模块内即可。
可在WiSCADA 3.0软件内查看当前写入的数值。
至此,将PLC数据写入到mqtt服务器操作完毕。
不止是本文中使用AB PLC,对于西门子、施耐德、欧姆龙、三菱等PLC,modbusRTU仪表,MS SQL Server,MySQL,Influxdb等数据库,伟联科技的边缘计算模块也完全支持。
WL-320E-M为伟联科技新一代专门针对工业的边缘计算产品,采用基于Node.js的架构,无需编写一行代码,实现可视化的工业数据采集和协议交换。通过在浏览器中拖拽的方式将不同的PLC、数据库以及Web应用连接在一起,构成数据流,使用户可以快速的创建出自己的应用。
功能特点: ----可实现多种PLC之间的数据交换,AB,SIEMENS,Schneider,Omron和.Mitsubishi。 ----可实现和空 ---- MQTT可方便 ----从PLC采集的数据可以直接通过WiFi进行无线数据传输 ----Python可实现灵活的二次系统开发 ----采集来的数据可进行数学和逻辑运算
未完待续
李大拿家的王小拿
2022年2月