Modbus是开源的通讯协议,使用简单灵活,相关知识容易获取。实际应用中,常常有将各种RS232、RS485等设备联网,供远程服务器读取的需求,这是采用一台边缘的转换网关,连接多台设备,然后转换为Modbus是一个不错的方案。

之前使用过一个NModbus的C#分支版本NModbus4,使用也比较简单,提供数据锁解决并发问题,提供Master连接数量、读取数据请求次数等监控功能。但NModbus4已经7年多没有更新,测试发现读取数据时,如果长度超出Modbus协议约束的长度,会导致异常造成服务退出,而且这个异常是应用层拦截和屏蔽不了。另外,NModbus4的多从站实现方法较为复杂,使用中就改用为NModbus开源库。

多Slave站测试代码段如下:

using NModbus;
using System;
using System.Net.Sockets;
using System.Windows.Forms;
using System.Net;namespace WindowsFormsApp1
{public partial class Form1 : Form{private TcpListener modbusListener;IModbusSlave slave1;IModbusSlave slave2;public Form1(){InitializeComponent();}private void button1_Click(object sender, EventArgs e){//创建通讯绑定端口modbusListener = new TcpListener(IPAddress.Parse("0.0.0.0"), 502);modbusListener.Start();IModbusFactory factory = new ModbusFactory();IModbusSlaveNetwork modbusSlaveNetwork = factory.CreateSlaveNetwork(modbusListener);//创建两个Slave设备,Id分别为1和2slave1 = factory.CreateSlave(1);slave2 = factory.CreateSlave(2);modbusSlaveNetwork.AddSlave(slave1);modbusSlaveNetwork.AddSlave(slave2);//接受连接modbusSlaveNetwork.ListenAsync();timer1.Enabled = true;}//数据仿真ushort uValue = 0;private void timer1_Tick(object sender, EventArgs e){ushort[] v = new ushort[2];v[0] = (ushort)(uValue++%10000);v[1] = (ushort)(uValue++ % 10000);slave1.DataStore.InputRegisters.WritePoints(0, v);v[0] = (ushort)(uValue++ % 10000+20000);v[1] = (ushort)(uValue++ % 10000 + 20000);slave2.DataStore.InputRegisters.WritePoints(0, v);}}
}

NModbus库的读写方法是基于数组的,这样也变相解决int32,float等数据写入时并发读可以能导致的数据更新异常。 实际应用中,可以读完一个仪表的数据,然后分类(bool和其他,其他包括word、int、float等)写入,同类的一次更新完,使用也比较方便。

用Modscan32测试,Device Id分别使用1和2,可以看到数据明显不同。

需要注意的是,NModbus的地址是从0开始,而NModbus4的地址是从1开始。

相关连接:

GitHub - NModbus/NModbus

C#使用NModbus4读写Modbus数据

C# 使用NModbus 多Slave站编程方法相关推荐

  1. 机械手臂c语言如何编程,一种串联机械手臂的示教编程方法

    一种串联机械手臂的示教编程方法 [技术领域] [0001]本发明涉及一种串联机械手臂的示教编程方法,具体的说是通过体感设备和数据手套检测人的手臂的姿态变化,并且通过计算转换为机器人手臂关节角度的变化, ...

  2. [软件工程]交换编程方法的深入讨论

    下面是交换编程方法在smth上的讨论对话,其中有人提出了相当好的讨论观点. [本篇全文] [回复文章] [本篇作者:qingrun] [回信给作者] [进入讨论区] [返回顶部] 1 发信人: qin ...

  3. 广数980tc3尾座锁定代码_数控车床的编程方法

    要学好数控车床的编程,必须了解数控车床的操作要点,现有教材大多没把数控车床的操作与编程作为一个整体来讲. .1设定数控车床的机床坐标系 机床坐标系是机床固有的坐标系,是制造和调整机床的基础,也是设置工 ...

  4. jwt实战详解--B站编程不良人视频笔记

    文章目录 前言 一.什么是JWT 二.JWT能做什么 1.授权 2.信息交换 三.为什么使用JWT 四.JWT的结构是什么 五.使用JWT 1.引入依赖 2.生成token 3.根据令牌和签名解析数据 ...

  5. 编程方法课程学习心得

    今天终于把<编程方法>的课程视频看完了,从下载课程到现在,断断续续学习了将近一个月,每一节课都有仔细的看完,用一个字总结的话就是 好! 这门课的课程代号是CS106A,是一门计算机的编程基 ...

  6. b站编程课程资源汇总

    b站编程课程资源汇总 一.总结 一句话总结: b站的编程资源很多,而且很良心 二.编程课程资源汇总 b站看到的,分享给大家 https://www.bilibili.com/video/av50680 ...

  7. 【Groovy】MOP 元对象协议与元编程 ( 方法委托 | 批量方法委托 )

    文章目录 一.批量方法委托 二.完整代码示例 一.批量方法委托 在上一篇博客 [Groovy]MOP 元对象协议与元编程 ( 方法委托 | 正常方法调用 | 方法委托实现 | 代码示例 ) 中 , 将 ...

  8. 【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 @Mixin 注解进行方法注入 | Mixin 混合多个类优先级分析 )

    文章目录 一.使用 Mixin 混合进行方法注入 二.Mixin 混合多个类优先级分析 一.使用 Mixin 混合进行方法注入 在上一篇博客 [Groovy]MOP 元对象协议与元编程 ( 方法注入 ...

  9. 【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 ExpandoMetaClass 进行方法注入 )

    文章目录 一.使用 ExpandoMetaClass 进行方法注入 三.完整代码示例 一.使用 ExpandoMetaClass 进行方法注入 在 [Groovy]MOP 元对象协议与元编程 ( 方法 ...

最新文章

  1. Spring 在 xml配置文件 或 annotation 注解中 运用Spring EL表达式
  2. 信息系统项目管理师:第9章:项目人力资源管理-历年真题
  3. 2021阿里巴巴大数据技术公开课第一季:外部工具连接SaaS模式云数仓MaxCompute实战
  4. Linux网络编程 之 广播(五)
  5. Spark常用函数讲解之键值RDD转换
  6. MySql数据类型介绍
  7. div 文字 input 垂直居中
  8. ThreadLocal类学习笔记
  9. AndroidStudio开发环境安装及配置
  10. matlab 数学 应用论文,MATLAB在高等数学课程中的应用(图文)
  11. 这电商代运营公司两月打造一个带泪的超级单品
  12. 系统集成项目管理工程师备考资料(口袋应试第二版)14
  13. 无法加入域--隶属于域、工作组选项为灰色
  14. unity 游戏内实现3连击动画(状态机)
  15. 使用IPMI安装操作系统--超微服务器为例,以及ipmivier安装与使用
  16. 虎牙在全球 DNS 秒级生效上的实践
  17. 李宏毅机器学习2022 HW1
  18. 密室逃脱2碧绿色房间攻略
  19. 2021年西交大计基题目解析(第12周)
  20. 计算机专业3.6的绩点是什么水平,绩点3.5算什么水平

热门文章

  1. IT风投的一个典型案例--阿里巴巴
  2. python打印字符串格式_Python字符串三种格式化输出
  3. 计算机英语网络电话ppt,被用来做英语
  4. 对计算机行业未来的看法_对行业的未来
  5. Python解题 - CSDN周赛第36期
  6. Java配置Path和JAVA_HOME(windows)
  7. 波特率与定时器初值关系
  8. OTP 动态口令验证
  9. matlab遗传算法先收敛后发散,【改进自适应遗传算法的性能分析】 遗传算法matlab程序...
  10. 【生物信息学】现在及未来,学习规划及入门