轻松让PLC数据到MQTT

2022-03-11 18:31:34 浏览数 (1)

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,对于西门子、施耐德、欧姆龙、三菱等PLCmodbusRTU仪表,MS SQL Server,MySQL,Influxdb等数据库,伟联科技的边缘计算模块也完全支持。

WL-320E-M为伟联科技新一代专门针对工业的边缘计算产品,采用基于Node.js的架构,无需编写一行代码,实现可视化的工业数据采集和协议交换。通过在浏览器中拖拽的方式将不同的PLC、数据库以及Web应用连接在一起,构成数据流,使用户可以快速的创建出自己的应用。

功能特点: ----可实现多种PLC之间的数据交换,AB,SIEMENS,Schneider,Omron和.Mitsubishi。 ----可实现和空 ---- MQTT可方便 ----从PLC采集的数据可以直接通过WiFi进行无线数据传输 ----Python可实现灵活的二次系统开发 ----采集来的数据可进行数学和逻辑运算

未完待续

李大拿家的王小拿

2022年2月

0 人点赞