上位机开发福利!快速掌握.NET中的Modbus通信

打印 上一主题 下一主题

主题 919|帖子 919|积分 2757

 
安装nuget包 Wesky.Net.OpenTools  1.0.8或以上版本。支持.net framework 4.6以上版本,以及所有.net core以及以上版本引用。

 
开发一个简单的Winform界面,用来测试使用。如需该winform的demo,可以在公众号【Dotnet Dancer】后台,回复 modbus 即可获取。

 
通信连接之前,可能存在多个客户端。可以写一个modbus客户端的静态数组存储。例如有五个客户端:

 
连接操作剖析:假设有5个连接,此处都使用同一个服务端地址,实际情况请根据本身需要举行调整。连接后的客户端,存储到静态变量内里备用,如允许以本身根据modbus连接序号,来操作差别连接举行通信。

 
读取测试。
例如连接的第一个客户端读取bool类型的值。阐明:IModbusReadWriteService接口假如你是使用依靠注入的形式,可以把它注入进来使用。此处没有使用依靠注入,则直接实例化出来使用。

 
IModbusReadWriteService接口一共提供了以下几种方法。此中,读取类型除了字符串以外,默认都是支持读取批量数据,而不是只读取一个。写入除了bool类型(线圈)和字符串,其他都支持批量写入。

 
例如第二个连接客户端,用来读取short类型数据(C# 的short类型,而不是PLC的short类型,某些plc对short的定义不太一样,请提前做了解)

其他以此类推,都是实例化后的读写对象,使用读取差别的函数来实现差别的写入数据类型的结果。例如下面示例:ReadInt32代表读取Int32类型的数据。参数内里,address是装备地址,或者PLC的寄存器地址等;length是读取的长度,长度单位为byte的长度,而不是地址个数。第三个参数,内里包括了modbus客户端信息,包括socket客户端、连接配置信息等。
  1. IModbusReadWriteService rwService = new ModbusReadWriteService();
  2. var result = rwService.ReadInt32(address, length, modbusTcpClients[2]);
复制代码
 
客户端参数实体类如下。MessageCode是消息码头部,假如是同一个PLC或者服务端,客户端连接该服务端举行读写消息时候,必须不一样,否则会导致modbus服务端不知道是谁请求的。这个也可以当做是唯一标识符,modbus服务端用来识别是哪个客户端发的消息的。

 
假如想了解modbus的一些细节,可以参考我之前的文章《Modbus TCP协议剖析、仿真环境以及基于.NET实现底子通信》,该文章讲解了协议规则、通信上的避坑阐明、仿真环境使用,以及bool线圈的读写操作。链接地址:
https://mp.weixin.qq.com/s/VLlwYCaxwqyhv2Os0hPS5g
 
写入操作。写入线圈操作:

写入操作,方法为Write开头,后面接写入什么类型的值。第一个参数是写入地址,第二个参数是写入的值,第三个参数代表传入连接的客户端。
例如写入,写入支持批量写入,传入对应类型的数组,地址提供第一个地址即可,批量写入会自动在后面的地址累计写入。以下是简单参考,例如循环内里写入数据每次累加1,然后传入方法内里举行写入。

 
假如只写入一个,那就传一个数组元素即可:

 
使用以上方式,测试一款使用modbus协议的某品牌系列PLC期间的读写效率日记,供参考:

 我写的可能比力一般,谢谢大佬们来围观~ 也欢迎关注个人公众号:Dotnet Dancer
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

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

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

西河刘卡车医

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表