简单实现C#与西门PLC的Modbus TCP通讯方法

文摘   2024-10-21 20:01   广东  

"三阶段"优秀工程师之路

1、基础阶段:博途PLC技术。

2、中级阶段:博途与C#高级语言技术。

3、高级阶段:PLC标准化编程方法。

标准化方法之路!

      上次看到大家对C#与西门子PLC通过S7通讯的例子饶有兴趣,今天趁热打铁来写一个C#与PLC实现modbusTcp通讯的例子。

链接如下:

简单实现C#与西门PLC的S7通讯方法

       C#与PLC通讯可做客户端也可做服务器,这个要看项目需求,这里上位机用来做客户端。

      此项目中除了用到NModbus4通讯库,还用到了thinger.DataConvertLib数据转换库,此库能极为方便的实现各种数据类型和高低字节的切换,做上位机的小伙伴务必熟练掌握,用时信手拈来。


第一步:还以WinFrom项目为例,创建一个基于.Net Framework框架的项目, 这里选择.Net Framework4.7.2。


在窗口设计器中设计以下窗口


第二步:NuGet中有很多针对modbus的通讯库,这里选用NModbus4通讯库,在NuGet中安装NModbus4库,版本为2.1.0。


代码总览:在开始代码部分之前我们先来总览一下程序结构。


第三步:双击连接按钮,在点击按钮事件中添加以下代码。


第四步:双击断开连接按钮,在点击按钮事件中添加以下代码。


第五步:双击读取单个按钮,在点击按钮事件中添加以下代码,这里读取出来的是一个16进制数。


第六步:双击写入单个按钮,在点击按钮事件中添加以下代码,这里输入的是10进制数,C#会将其转为ushort类型写入到寄存器中。


第七步:有了读写单个的经验我们尝试着把读写多个写复杂一些,读写一下float数据。

双击读取多个按钮,在点击按钮事件中添加以下代码。在这个方法中先拿到起始地址和读取个数文本,通过这两个数据将读取到的ushort数据放在ushort数组readData中。再将这个ushort数组两两合并成一个32位float类型的数组readDataf,最后将高低字节更改为ABCD形式,最终显示在读取文本框上。


第八步:双击写入多个按钮,在点击按钮事件中添加以下代码。

这一步通过识别写入多个文本框中“\r”回车键 ,将输入的float数据存放在float型数组ff中,最后将每一个float数据拆分成DCBA形式的ushort类型,最后写入到寄存器中。


第九步:PLC程序编写。

验证阶段在1200PLC程序中插入mb_server程序块、创建TCON_IP_v4数据类型、创建数据区(相信大家对西门子PLC做modbusTcp服务器已经烂熟于心)并做好连接,下载/运行/监控程序。启动C#程序,输入正确的IP和端口号,点击连接PLC,发现连接状态变成了“连接成功”。PLC中状态码变为16#7006。



第十步:程序测试

在C#程序中输入起始地址为0,在写入值文本框中输入255,点击写入单个按钮,数据成功写入到了PLC中。



随后点击读取单个,看到读取文本框成功读取到了刚刚写入到PLC中的数据。


写入多个的验证起始地址从1开始,连续写入6个16位数据(3个float型数据),点击写入按钮后发现PLC中对应地址的数据发生了变化。



随后将读取个数文本框中改为10,点击读取多个按钮,读取文本框中成功读取到写入的数据和为0的数据。


自此便成功的实现了C#与西门子1200PLC的modbusTcp通讯。


总结:

与“优秀者”同行!

让技术学习更简单!


工程师作者的微信

非诚勿扰


      C#程序源码获取:朋友圈转发文章,获得5个赞,可以向“博途之友”索要C#程序的源代码,“博途之友”微信号在文章的最下面。


PLC标准化的学习方法:从混沌到有所感悟和理解的过程

PLC标准化的技术方法:标准化包括哪些技术点?技术点之间的关系是怎样的?

PLC标准化的技术路线讲解视频:S88标准、技术架构和不断迭代

博途群讨论:两个群对C#和SCL语言的讨论,终于把SCL语言应用总结清楚了

群交流的价值:6年西门子精英群的群友真实反馈

书友之约:博途PLC书籍3大配套资源发布

加入博途之友,与优秀工程师有约

 芮老师的书籍(京东和当当可以购买) 


博途之友
本公众号由西门子博途PLC产品经理、《西门子S7-1200 PLC编程及应用》和《西门子S7-1500 PLC编程及应用》书籍主编负责管理,基于西门子自动化、信息化和数字化为主的技术交流与分享,以技会友。
 最新文章