C#读取西门子S7系列PLC(三)
本文首发于公号【韭菜苔】
前言
本篇文章是本系列文章的最后一篇。
C#读取西门子S7系列PLC 里我们介绍了如何使用C#和Sharp7这个库连接西门子PLC并采集数据。
C#读取西门子S7系列PLC(二)
里我们介绍了一个用来创建ModbusTcp Server的库
EasyModbus
,并介绍了如何给西门子变量分配modbus地址。
本篇文章,我们会讲一下,如何实时的把读取上来的值更新到modbus server里。
思路
首先利用
EasyModbus
创建我们的Server
其次,把值更新到Server里对应的地址里。
Server里有对应的线圈和寄存器的数组集合,根据之前我们分配好的地址,按照序号写进去即可。
这里我们的开关量用的是coils字段,往里写整数和模拟量用的是holdingRegisters字段。
代码实现
首先通过配置文件配置好端口号,现场到时候可以灵活更改。
然后开启modbus服务。
这个时候modbus server服务已经好了,可以正常连上了。用modscan等测试工具可以测一下,只是数据都是默认的0
然后创建一个ModbusHelper的类,里面根据各种数据类型定义了Write函数。
好了,写值函数已经定义好了。
那么什么时候该往modbus里写呢?我这里是在从PLC读取到数据往类里更新的时候写的。
总结
总的来说,整个软件的大致思路就是:
1、通过变量的地址,把变量按照区域分类,I、Q、V、M、DB,然后按照区域去读取数据。
2、读取到数据后把值分配给变量对应的类里,如果值有变化的话,更新对应的参数。
实现你的功能其实往往只需要100行代码,剩下的900行都是处理一堆异常情况的。
我们看一下最终的转发效果。
Float类型:
Word类型:
Bool类型
目前还有个问题:
数据是变化刷新的,当数据变化时候可以往modbus里实时写值,但是当某个设备断线后,我们的modbus数据就会停留在最后一次的有效值,无法显示这个PLC的通断状态。或许可以给每个设备的通断状态都设置个coil标注一下,服务器上根据这个来判断。
至此,这个利用C#读取西门子S7系列PLC并转成modbus协议的软件算是基本完成了,本系列的文章结束。其实转发的方式并不限制于modbus,只是modbus稍微简单方便些。
后续打算更一些opcua和mqtt相关的文章,学无止境,且学且更。
如果本系列的文章对你有帮助的话,点个赞或者分享一下呗,工控人不骗工控人。