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


     

    安装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客户端、连接配置信息等。

    IModbusReadWriteService rwService = new ModbusReadWriteService();
    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

     

  • 相关阅读:
    angualr的脏值检测
    使用micronaut创建基于maven的web工程集成jpa实现crud
    React学习笔记
    bp神经网络算法的优缺点,bp神经网络缺点及克服
    spring5上下文对象创建方式
    点赞、收藏必读文章--数据分析的多变量分析
    用友2023届秋招Java笔试-S2卷-编程题详解
    OpenGL 对比度调节
    vue中使用echarts实现省市地图绘制,根据数据显示不同区域颜色,点击省市切换,根据经纬度打点
    MySQL的二进制安装
  • 原文地址:https://www.cnblogs.com/weskynet/p/18206594