设为首页
收藏本站
PLC技术网
开启辅助访问
切换到宽版
登录
注册哦
只需一步,快速开始
微信扫码登录
门户
Portal
论坛
BBS
导读
Guide
排行榜
Ranklist
搜索
搜索
本版
文章
帖子
用户
PLC论坛-全力打造可编程控制器专业技术论坛
»
论坛
›
工控技术交流区
›
『国外:三菱/西门子/欧姆龙/松下』
›
C#读取西门子S7系列PLC(二)
返回列表
发新帖
[西门子]
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
回复
举报
返回列表
发新帖
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
注册哦
本版积分规则
发表回复
回帖后跳转到最后一页
西家支持与服务
回复楼主
返回列表
『国外:三菱/西门子/欧姆龙/松下』
『国产:台达/汇川/信捷产品交流区』