这个项目很有意思,用户现场已经有个运行很久的自动化系统,PLC使用西门子S7-200控制几台设备的运行,这是由厂家A提供,并每年提供维护支持。而另一个后来做的系统,由厂家B提供,通过4G方式远程采集几十公里之外的液位、压力、环境参数等信息,然后直接把数据发送到一个云端的系统中,系统提供了Web方式的监控和数据展示分析界面。
本来两个系统各自运行互不干扰,用户发现A厂家的系统如果能获取B厂家的几个数据,就可以实现远程联动,进而控制优化节约能耗。
那么问题来了,厂家A提供的西门子PLC控制系统不想更换,因为如果更换PLC做大升级厂家A需要的成本很高。用户希望用最小的代价实现------把数据接入现有的西门子S7-200中,厂家A只需要把升级程序修改好发送给用户自己下载到PLC中即可(人员不需要到现场,这样的工作可以归为维护)。
1 我给的技术方案
使用一个Linux嵌入IOT-Tree Server设备就可以搞定:
1)这个设备提供RS485接口,并安装在PLC控制柜内部,提供RS485接口连接西门子PLC S7-200.
2)设备通过本地宽带接入网络,能够访问厂家B的Web系统,通过一个URL获取json数据格式的实时数据,里面包含远程监测点的各个指标数据。
3)设备通过RS485口模拟了一个Modbus RTU Slave设备,这个设备内部提供液位等寄存器数据(含通信状态)。这样S7-200就可以直接通过RS485 Modbus RTU协议使用Master方式获取对应的数据,并通过液位数据实现本地设备的启停或更优化调度。
2 具体实现过程
2.1 使用的硬件设备和IOT-Tree Server配置安装
现场使用了一个巴掌大小的Linux模块,有2个RS485口和2个以太网口,内部运行IOT-Tree Server。

这样既可以通过网络访问B系统获取数据,也可以通过RS485口模拟Modbus RTU设备,给S7-200提供数据。
IOT-Tree Server在Linux设备上安装可以参考,本文就重复了:使用IOT-Tree Server制作一个边缘计算设备(Arm Linux)
2.2 新建IOT-Tree项目
访问边缘设备管理界面:http://your_device_ip:9090/admin/。在本地项目区域点击"新增",填写项目名称如下:

完成之后,点击此项目进入项目管理主界面。
2.3 Web数据获取并转换为通道标签数据
2.3.1 接入B系统Web数据并提取
我们可以先访问外部提供的URL,获取一个JSON数据。本文使用的JSON格式如下:
javascript
{ "yeiwei":3.32, "pressure":0.21, "update_dt":17213546556 }
在左上角点击"接入",选择"HTTP Client",填写对话框 Name=web ,Title=Web。如下:

确定之后,鼠标右键点击新增的"web"项,选择新增连接。在弹出对话框填写外部提供的URL地址。当然也得提供Name和title。如下:

点击"Data Probe"按钮,在弹出的对话框左上角点击"json"按钮,然后把样本JSON数据填写如文本框:
确定之后,可以看到左边展示了整体的数据结构:

点击需要提取的数据值,并选择中间右箭头按钮,可以在Probed List增加对应内容:我们本次就提取这3个数据。其中,在Title列,点击就可以修改对应的标题。如下:

多次确定,完成"Url1 [u1]"这个接入。
2.3.2 定义通道和标签
鼠标右键浏览树的根节点选择"新增通道"。填写如下:

确定之后,把"Url1 [u1]"和ch1之间建立关联。如下:

点击ch1,在右边标签列表中添加如下几个标签数据:

2.3.3 绑定提取数据到标签
再次鼠标右键接入"Url1 [u1]",选择编辑,在弹出对话框中点击按钮"Bind Channel"。

在弹出绑定对话框中,左边选择提取的数据,右边选择通道下面对应的标签,点击中间绑定按钮。多次操作最终完成绑定:

确定之后,我们就可以启动项目查看通道ch1下面的标签值是否跟着外部Web系统提供的URL数据变化而变化。

2.3.4 转换标签数据类型(便于Modbus输出)
上面只要看到标签数据有效,且更新时间不断刷新,说明标签接入url、提取和绑定数据全部ok了。接着我们需要把这几个标签数据转换为modbus设备的内部寄存器地址中的数据。
为此,我们还需要做个标签数据类型转换:这是因为Modbus协议最基本的数据类型是bool(bit)和字(int16),为了PLC调用方便,我们可以把压力和液位两个数值从float转换为int16。并且设定
输出值=实际值*100
双击压力这个标签,点击"转换"-简单计算,其他一些转换填写内容如下(液位同样转换配置):

另外把更新计数绑定的时间毫秒数转换为int16,只保留数值后4个字符
更新计数=实际毫秒 % 10000 //除余10000,确保数据有变化即可
双击更新计数这个标签,点击"转换"-JS,转换填写内容如下:
javascript
return $input % 10000;

2.3.5 运行查看效果

可以看到3个标签都转成了int16类型,这个很方便直接成为Modbus设备的数据了。
2.4 模拟Modbus RTU设备
这就要用的IOT-Tree Server消息流功能了。
2.4.1 新增Modbus Slave模块节点
在你的IOT-Tree项目管理界面左下角,你可以添加一个消息流,点击之后,可以看到消息流具体配置界面,你可以在配置界面左边列表选择模拟器分类下的"Modbus Slave"节点,拖拽到配置区就完成了节点的添加。如下图:

双击刚刚添加的Modbus Slave节点,可以看到弹出配置界面。你可以在里面进行详细配置。
2.4.2 配置总线上的设备
2.4.2.1 总线设备列表和对外接口
我们配置了设备1,地址=1的一个设备,以及串口COM3提供对外连接接口------此接口对应RS485与PLC相连。

一个Modbus Slave节点代表了一个Modbus 总线,上面可以配置一个或多个Modbus设备(每个设备地址不相同)。因此,在节点弹出的配置界面中,上面部分是设备区域(Devices),你可以在其中添加多个设备。
请注意:根据Modbus协议要求,每个设备地址不允许相同,设置时请限制在1-254之间的范围内
2.2.2 设备内部数据地址段
点击新增设备或现有设备编辑按钮。弹出单个设备具体的配置界面。如图:

我们点击段添加或现有段编辑按钮,弹出的编辑界面填写如下:

其中FC时功能码,我们选择4------这表示只读int16数据类型,地址idx从0开始,共有3个数据。
确定之后,点击选择此段,右边会出现3个数据地址列表,我们只需要把Bind Tag列选择添加对应的标签进行绑定即可:

确定之后,就完成了Modbus RTU设备对外提供Slave对接所有工作了。
2.5 测试接口
你可以使用modscan等软件,配合设备提供RS485接口对数据更新进行测试。
3 可靠性应对措施
这是一个工业现场必须考虑的情况------可靠性。以上的整体实现过程中间经过了2个环节,一个是B供应商提供的Web URL,以及本文使用的IOT-Tree Server。PLC在使用这个数据进行控制优化时,必须考虑这两个环节失效的情况,并做好应对措施,保证优化之后的系统能够安全运行------最坏情况应该是能够退出优化控制状态,等数据恢复之后再次自动进入优化控制状态。
1,PLC不仅要考虑此RS485接口及对应的模拟设备断开之后的应对措施------退出优化控制状态。
2,PLC还应该根据更新计数up_cc这个数据,判断数据是否有效,如果up_cc这个数据点超过一定的时间(如30秒)没有更新,则也应该认为当前获取的数据无效,进而退出优化控制状态。
