[西门子] C#读取西门子S7系列PLC(二)

[复制链接]
查看69050 | 回复0 | 2024-8-20 10:15:16 | 显示全部楼层 |阅读模式
需求

书接上文:C#读取西门子S7系列PLC

我们在服务器不能直通子系统的PLC的情况下,开发了个小软件把西门子PLC的数据采集到了,到时候这个小软件会放在子系统现场的电脑上,一方面向下采集PLC数据,一方面向上把采集到的数据转发到服务器。

在开发调试期间,加了些断线重连、重新启动通讯的机制,保证这个软件能实时的、正确的读取到数据,不然以后出问题了还得跑现场去重启软件,要是这样的子系统有很多,那岂不是给自己挖坑了?

向下的功能已经弄好了,那么用什么方式把数据向上传出去呢?

想来想去还是用最简单的modbusTcp吧。

我们要把采集到的数据通过modbus的方式传出去,在服务器上通过modbus协议间接的获取源自PLC的数据。

EasyModbus

在之前的文章 OPCDA转ModbusTCP (三)介绍过这个库EasyModbus,用来创建modbus Server和Client,个人感觉用起来还是挺简单方便的,这里再重新介绍一下。





以上是它的官网,有下载链接和代码示例,最新版本(估计也是最后版本了)是V5.6。

从官网上下载dll手动引用 和 在VS的NuGet上安装 版本和效果都是一样的。



官网上的示例代码,可以参考。



西门子PLC基本数据类型

从西门子的官网上,找到了s7-1200的数据类型介绍

basic_type (siemens.com.cn)







根据这个表格我们捋一下数据类型和modbus地址的关系。

(modbus的寄存器是16位,所以PLC里8位长度的数据也只能最低分配1个寄存器)

开关量,在KEPServer里类型是Boolean,modbus里分配1个线圈;

8位有符号,在KEPServer里类型是Char,modbus里分配1个寄存器;

8位无符号,在KEPServer里类型是Byte,modbus里分配1个寄存器;

16位有符号,在KEPServer里类型是Short,modbus里分配1个寄存器;

16位无符号,在KEPServer里类型是Word,modbus里分配1个寄存器;

32位有符号,在KEPServer里类型是Long,modbus里分配2个寄存器;

32位无符号,在KEPServer里类型是DWord,modbus里分配2个寄存器;

32位浮点型。在KEPServer里类型是Float,modbus里分配2个寄存器;

64位浮点型。在KEPServer里类型是Double,modbus里分配4个寄存器;

还有时间类型、字符串类型、数组类型的,我个人很少会遇到,先不考虑了吧。

分配Modbus地址

地址长度已经明确了,下面想想怎么给目前的PLC变量分配modbus地址。

之前我们导入变量的时候,格式是这样的:





不建议在导入变量的时候就分配地址,因为使用者在“导入变量”的时候有随机性,比如他新建10个设备,然后跳着顺序导入点表,或者给设备替换点表,都会造成modbus地址格式比较杂乱,强迫症忍不了。

所以这里在工具栏“保存配置”的时候,给所有变量分配modbus地址。



代码和展示效果





然后重新改造一下我们的点表展示界面,新增个modbus地址列,把分配的地址展示出来。





下一步

好了,现在我们已经把变量的modbus地址分配好了.

下一步就是利用上面我们介绍过的库,新建个modbus Server,然后当我们取到PLC的数据时候,往对应的线圈或者寄存器地址写数据就行。

本次就先到这里吧,后续再更。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册哦

x
您需要登录后才可以回帖 登录 | 注册哦

本版积分规则