C# 使用NModbus 多Slave站编程方法
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站编程方法相关推荐
- 机械手臂c语言如何编程,一种串联机械手臂的示教编程方法
一种串联机械手臂的示教编程方法 [技术领域] [0001]本发明涉及一种串联机械手臂的示教编程方法,具体的说是通过体感设备和数据手套检测人的手臂的姿态变化,并且通过计算转换为机器人手臂关节角度的变化, ...
- [软件工程]交换编程方法的深入讨论
下面是交换编程方法在smth上的讨论对话,其中有人提出了相当好的讨论观点. [本篇全文] [回复文章] [本篇作者:qingrun] [回信给作者] [进入讨论区] [返回顶部] 1 发信人: qin ...
- 广数980tc3尾座锁定代码_数控车床的编程方法
要学好数控车床的编程,必须了解数控车床的操作要点,现有教材大多没把数控车床的操作与编程作为一个整体来讲. .1设定数控车床的机床坐标系 机床坐标系是机床固有的坐标系,是制造和调整机床的基础,也是设置工 ...
- jwt实战详解--B站编程不良人视频笔记
文章目录 前言 一.什么是JWT 二.JWT能做什么 1.授权 2.信息交换 三.为什么使用JWT 四.JWT的结构是什么 五.使用JWT 1.引入依赖 2.生成token 3.根据令牌和签名解析数据 ...
- 编程方法课程学习心得
今天终于把<编程方法>的课程视频看完了,从下载课程到现在,断断续续学习了将近一个月,每一节课都有仔细的看完,用一个字总结的话就是 好! 这门课的课程代号是CS106A,是一门计算机的编程基 ...
- b站编程课程资源汇总
b站编程课程资源汇总 一.总结 一句话总结: b站的编程资源很多,而且很良心 二.编程课程资源汇总 b站看到的,分享给大家 https://www.bilibili.com/video/av50680 ...
- 【Groovy】MOP 元对象协议与元编程 ( 方法委托 | 批量方法委托 )
文章目录 一.批量方法委托 二.完整代码示例 一.批量方法委托 在上一篇博客 [Groovy]MOP 元对象协议与元编程 ( 方法委托 | 正常方法调用 | 方法委托实现 | 代码示例 ) 中 , 将 ...
- 【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 @Mixin 注解进行方法注入 | Mixin 混合多个类优先级分析 )
文章目录 一.使用 Mixin 混合进行方法注入 二.Mixin 混合多个类优先级分析 一.使用 Mixin 混合进行方法注入 在上一篇博客 [Groovy]MOP 元对象协议与元编程 ( 方法注入 ...
- 【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 ExpandoMetaClass 进行方法注入 )
文章目录 一.使用 ExpandoMetaClass 进行方法注入 三.完整代码示例 一.使用 ExpandoMetaClass 进行方法注入 在 [Groovy]MOP 元对象协议与元编程 ( 方法 ...
最新文章
- Spring 在 xml配置文件 或 annotation 注解中 运用Spring EL表达式
- 信息系统项目管理师:第9章:项目人力资源管理-历年真题
- 2021阿里巴巴大数据技术公开课第一季:外部工具连接SaaS模式云数仓MaxCompute实战
- Linux网络编程 之 广播(五)
- Spark常用函数讲解之键值RDD转换
- MySql数据类型介绍
- div 文字 input 垂直居中
- ThreadLocal类学习笔记
- AndroidStudio开发环境安装及配置
- matlab 数学 应用论文,MATLAB在高等数学课程中的应用(图文)
- 这电商代运营公司两月打造一个带泪的超级单品
- 系统集成项目管理工程师备考资料(口袋应试第二版)14
- 无法加入域--隶属于域、工作组选项为灰色
- unity 游戏内实现3连击动画(状态机)
- 使用IPMI安装操作系统--超微服务器为例,以及ipmivier安装与使用
- 虎牙在全球 DNS 秒级生效上的实践
- 李宏毅机器学习2022 HW1
- 密室逃脱2碧绿色房间攻略
- 2021年西交大计基题目解析(第12周)
- 计算机专业3.6的绩点是什么水平,绩点3.5算什么水平