为了让用户有一个更加直观、清晰的认识,我们采用一个“基于Modbus TCP模拟设备的数据采集与反向控制”的实际例子引导用户逐步上手,便于快速理解软件的核心功能以及常用配置方法。
准备一台EG3110、EG5120或EG5200边缘网关
按照如下拓扑图,将电脑的网口与网关网口相连,并确保在同一网段(本实例中假定电脑的IP为192.168.0.89,网关的LAN口IP为192.168.0.1)
如果您的网关设备已经预置了E2C Factory应用,可跳过此步骤
1)固件版本要求:>= 2.3.106
可从网关WEB首页中查看到固件版本信息,如下图所示:
注意: 若版本较低,请联系客服或销售人员获取最新的固件进行升级,具体的升级操作可参考《ROS Pro用户手册》
2)安装E2C Factory软件
按照下图的提示进行软件的安装操作,即可完成软件的安装。
3)运行并打开E2C Factory操作界面
安装完成后,可在左侧菜单栏中找到边缘计算或顶部的边缘计算 - 数据采集菜单项并打开E2C Factory软件的操作页面。
此时会打开新的标签页,呈现如下图所示的软件主页面
1)Modbus模拟器
本示例使用PeakHMI MB TCP Slave作为Modbus TCP Slave的模拟器,用户可自行在PeakHMI官网下载安装。
安装完成后启动模拟器,点击Windows - Register data菜单项,可打开点表配置界面。
2)MQTT Broker
本示例选择在同一台电脑中安装Mosquitto作为测试用的MQTT Broker服务。用户可在Mosquitto官网中下载并安装,也可以选择自己熟悉的MQTT Broker平台或者软件。
选择数据采集页面,点击新建设备按钮,弹出如下所示的对话框
主要参数:
名称:Modbus模拟器(自定义南向设备的名称)
协议:Modbus TCP
IP地址:192.168.0.89(模拟器的IP地址)
端口号:502(模拟器监听端口,缺省值为502)
从站地址:1(PeakHMI模拟器缺省的Slave ID)
轮询周期:10(秒)
点击保存后将在设备列表中看到刚才添加的设备。
选择刚添加的设备,然后点击右上侧的“新增”按钮,即可打开【添加监控数据】对话框
名称:变量的名称,通常可使用具有物理意义的名称
功能码:对应于Modbus协议中的功能码,可选01、02、03、04
地址:Modbus寄存器地址,(注意: 这里通常从0开始计算,在PeakHMI模拟器中从1开始计算)
数据类型:数据类型,可选ushort、short、uint、int、float等
读写权限:控制变量的读写权限,在Modbus中,Holding Register通常是只读的
为了方便测试,我们先增加两个变量:
| 变量名称 | 功能码 | 地址 | 数据类型 | 读写权限 | 小数变量数 |
|---|---|---|---|---|---|
| I_out | 03 Holding Register | 0 | float32 | 只读 | 4 |
| V_out | 03 Holding Register | 2 | float32 | 只读 | 2 |
添加完成后,点击发布,稍等片刻(1个轮询周期左右),可在点表列表页面中看到各个点表采集到的最新数值。如下图所示:
此时,我们已经完成了南向数据采集的配置并成功采集到了数据。
接下来,我们要做的就是将我们采集到的输出电压、输出电流值上报到MQTT平台中,除此以外,我们还会需要上报即时功率。
在正式开始之前,我们需要了解上报的机制以及所上报数据的组织形式。在此引入一个点表分组的概念。我们可以将不同设备下的不同变量数据分配到一个组中,需要注意的是一个点表最多只能隶属于一个分组,所有的上报数据都是以组为单位上报的,每个组可配置不同的上报策略(周期、变化、变化+周期)。
在数据采集页面点击新建分组,弹出如下对话框:
在分组页面左侧的列表中选中刚才我们添加的grp分组,然后点击右侧的新增按钮,将弹出添加监控数据到分组的对话框。
这里选中所有的点表,点击“>”按钮,可将选中的点表添加到当前分组下。点击确定后即可完成操作,无需进行发布。
1)创建云服务
选择数据上云菜单项,点击新建云服务
云服务名称:cloud - 自定义云服务的名称,方便记忆
云服务类型:MQTT
2)配置云服务连接信息
选择刚才创建的cloud云服务,可配置连接信息
服务器地址:192.168.0.89(根据实际情况进行更改)
MQTT客户端ID:power_data
端口号:1883
MQTT版本:v3.1
配置完成并保存后,可以点击测试连接,稍等片刻后可查看云服务状态是否变更为连接成功。否则请检查配置信息是否有误,MQTT Broker服务器是否正常,或者服务器的防火墙是否开启并阻止了1883端口的流量。
连接成功后,可以添加具体需要上传的数据组以及对应的topic。
完成保存后,我们可以在PC上打开一个MQTT客户端(这里使用的是MQTTX,用户的可以到MQTTX官网上下载安装),观察是否可以收到来自设备的数据。正常情况下,应该可以看到如下图的上报消息
{
"messageId": "86d70ab8-401b-4cdd-b92b-f6ad8d0ca603",
"messageType": "normal",
"groupName": "grp",
"groupTime": 1763524978582,
"payload": {
"V_out": {
"time": 1763524968000,
"value": "220.00",
"deviceName": "Modbus模拟器",
"tag": "V_out"
},
"I_out": {
"deviceName": "Modbus模拟器",
"tag": "I_out",
"time": 1763524968000,
"value": "2.45"
}
}
}
截止到现在,我们已经成功的完成了南向设备的数据采集,并将采集到的数据上报到指定的MQTT平台。
正如你所看到的结果,上一节中上报数据的格式可能并不是我们想要的,我们希望能够按照下的方式来规则数据:
{
"sn":"123456",
"time": 1756880727169,
"data":{
"V_out":220,
"I_out":2.0
}
}
通过分析,我们得知:从现有格式转换成目标格式,需要进行如下几个方面的操作:
上述这些需要,都可以通过编写简单的JS脚本实现:
在消息管理中选择需要调整的主题,点击右侧的编辑图表,可打开编辑发布对话框。
我们可将如下的代码拷贝到函数代码编辑框中:
// 提取时间
const time = msg.groupTime
// 提取点位数据包
const payload = msg.payload
// 组装上云数据格式
const result = {
"sn":"123456",
"time":time,
"data":{
"V_out":payload.V_out.value,
"I_out":payload.I_out.value
}
}
return result;
点击保存后,可以通过MQTT客户端观察发布到MQTT上的数据是否发生了变化,正常情况下,应该出现如下格式的消息:
{
"time": 1763542439184,
"data": {
"V_out": "220.00",
"I_out": "2.45"
},
"sn": "123456"
}
当然,你可以修改模拟器的数值,观察发布到云端的数据是否也进行了相应的更新,用户可自行验证。
现在我们希望对采集的电压值进行阈值判断,当电压值大于920伏的时候,系统应触发高压告警,同时通过邮件的方式将告警信息通知到预先设定的用户邮箱中。
在告警管理页面中,选择告警推送模板 - 邮件标签页,可配置邮件服务器以及告警信息的模板内容。
在通信录标签页面中,可以新增目标用户的邮箱地址信息。
我们可以在“告警规则”标签下新增告警的规则,此规则包括告警源、触发条件、告警等级以及告警推送等规则的配置。
按照上图所示,我们添加一个输出电压V_out大于920伏的告警规则。此时我们修改模拟器中的V_out为925.125(可以是大于920的任意值),稍等片刻,我们在实时告警中应该可以看到出现了一条高压告警的信息。
为了能够更好的观察指令处理的结果,我们可以在数据采集的Modbus模拟器设备中增加一个名为Switch,功能码为01 Coil Status,地址为0,可读写的点表,便于通过云指令进行状态更改。
提示:修改点表后,记得需要进行发布。
在上述步骤创建的云服务项中可以增加指定topic的订阅
在添加订阅对话框中,填入以下信息:
下发指令的格式:
{
"device": "Modbus模拟器",
"switch": "on"
}
为了让网关在接收到指令后能触发相应的动作(写入Modbus寄存器),可以在函数代码对话框中加入如下的代码。
let data = JSON.parse(msg);
let deviceName = data.device;
let swStatus = data.switch === 'on' ? 1 : 0;
Edge.WriteTags(deviceName,[{"tag":"Switch","value": swStatus}])
最终的订阅配置如下图所示
在完成上述配置后,我们就可以通过MQTTX向site01cmd的topic发送指令了。
指令发送后,模拟器中Coils的00001地址的bit位应变成了1,随后观察最新的上报数据,switch最新状态也应变成true。
至此,我们已经成功完成了数据采集、云端上报、告警配置、指令下发一个相对完整的快速体验。在此过程中,可能会存在一些异常,不用着急,通常我们可以采用分段排查的方式进行逐端检查,比如采集不到数据时,我们可以先检查模拟器是否正确配置了,PC的防火墙是否阻止了外部对模拟器的访问,网关中的连接信息是否配置正确等等;当接收下发的指令并没有按照预期执行时,我们可以通过Edge.Log函数将接收到的消息输出到日志中,通过日志信息,分析指令是否成功被接收,指令的格式是否正确等等。