C#读取西门子S7系列PLC(三)

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相关的文章,学无止境,且学且更。


如果本系列的文章对你有帮助的话,点个赞或者分享一下呗,工控人不骗工控人。

发布于 2023-01-16 09:53 ・IP 属地河南