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. SAP PM入门系列22 - IH06 Display Functional Location
  2. JavaScript引擎研究与C、C++与互调用(转)
  3. vue 给iframe设置src_vue项目iframe的传值问题
  4. 这个「化学家」登上Nature封面:工作007,8天完成近700次实验,还设计出新催化剂...
  5. 美国不要求计算机背景的学校,美国哪些院校计算机专业不需要CS背景
  6. 在apache访问日志中统计统计前十名pv
  7. 获取html滚动条位置,pc和移动端获取滚动条的位置
  8. 《Programming WPF》翻译 第7章 4.转换
  9. 计算机专业未来希望,中国人才最紧缺的6个大学专业,希望你不要错过。
  10. 资金严重短缺 法拉第未来把洛杉矶总部都卖了
  11. Perl的特殊变量汇总
  12. 《Splunk智能运维实战》——第1章 游戏时间——导入数据 1.1 简介
  13. Mosquitto搭建Android推送服务番外篇一:各种报错解决
  14. 构建大型网站架构服务器集群(转)
  15. windows下用notepad++配置go语言开发环境
  16. opencv调取摄像头
  17. C8051单片机在交流变频调速系统中的应用(收集)
  18. idea Process finished with exit code -1073741819 (0xC0000005)
  19. 「MRC干货」如何快速构建一台高精度AGV
  20. 用静息态fMRI映射人脑多巴胺能影像

热门文章

  1. 【论文阅读】目标检测中的分类回归特征解耦
  2. mysql 弱口令暴力破解本地渗透测试
  3. QLineEdit输入时自动切换到英文输入法
  4. DBCP连接池使用方法
  5. 通用管理后台系统 spring-boot-plus2 (自研)
  6. 使用paddlehub制作酷炫视频
  7. 【实战+源码】RGB-D移动抓取服务机器人(三)——3D目标识别定位(相机标定、ORK、linemod、find_object_2d/3d)
  8. 数据库实验-创建创建学生表
  9. Simulink仿真:基于Matlab Simulink的光伏系统最大功率点跟踪控制算法研究
  10. php项目引入vue,怎样实现Vue项目中使用Vux