当前位置: 首页 > news >正文

modbusRTU通信简单实现(使用NModbus4通信库)

本文实现ModbusRTU通信,使用的是NModbus4通信库,使用 Modbus Slave是一个模拟Modbus协议从机的上位机软件,主要用于模拟测试跟其他主机设备通信的过程。与之成套存在的另一个软件--Modbus Poll,则是模拟Modbus协议主机的上位机软件。

 一、了解并使用Modbus Slave和Configure Virtual Serial Port Driver软件

modbus Slave最少也要下载有Configure Virtual Serial Port Driver软件配套才能正常模拟从机和上机通信。

1.打开Configure Virtual Serial Port Driver并添加虚拟com端口,一次添加两个COM端口,

一次可以添加两个端口,我添加了com1和com2两个端口。

在电脑设备管理器->端口中查看是否新加了两个端口:

带有Virtual Serial Portd的就是模拟的COM端口

 2.了解并使用Modbus Slave软件进行从机数据模拟

点击Setup配置请求信息(设置串口基本参数)

3.Modbus Slave串口参数配置详情

 

 4.Modbus Slave连接并创建数据

点击Conntion配置连接信息,这里我知道使用RTU通信方式就好了,其他使用默认参数。

 

点击ok我们就连接模拟串口成功了 

双击寄存器值列表就可以向指定寄存器写入值了 

二、控制台项目通过NModbus4通信

1.创建控制台项目,并添加NModbus4和System.IO.Ports两个包

2.创建  SerialPort实例通信端口设置为COM1端口,SerialPort类是专用来做串口通信的

   打开串口连接  向COM1端口发出请求SerialPort serialPort = new SerialPort("COM1");//设置串口基本参数serialPort.BaudRate = 9600;serialPort.DataBits = 8;serialPort.StopBits=StopBits.One;serialPort.Parity = Parity.None;serialPort.Open();

3.进行寄存器读取ReadHoldingRegisters 代表03功能码,读取输出寄存器

            // 创建 Modbus RTU 客户端实例  ModbusSerialMaster master = ModbusSerialMaster.CreateRtu(serialPort);// 设置从设备地址  ushort startAddress = 0; // 起始地址为0  ushort numberOfCoils = 10; // 要读取的线圈数量为10  //ReadHoldingRegisters 就是03功能码读取方式,1代表的是机子名,0到10代表读取的范围//发起请求ushort[] values= master.ReadHoldingRegisters(1, startAddress, numberOfCoils);Console.WriteLine("读取0到10寄存器的数据打印");//数据处理for (int i = 0; i < values.Length; i++){Console.WriteLine(values[i]);}

 4.写单个输出寄存器WriteSingleRegister代表功能码06

// 设置从设备地址和要写入的寄存器地址及值  ushort slaveAddress = 1; // 从设备地址  ushort startAddress = 0; // 起始地址  ushort valueToWrite = 123; // 要写入的寄存器值  // 将值写入从设备的寄存器中  master.WriteSingleRegister(slaveAddress, startAddress, valueToWrite); 

上述:就是我通过NModbus4通信库实现读取输出寄存器写入输出寄存器。

总结用NModbus4库与Modbus RTU从设备进行通信操作如下:

  1. 打开串口连接:使用SerialPort类打开与Modbus RTU从设备的串口连接。需要设置串口参数,如波特率、数据位、校验位和停止位等。
  2. 创建Modbus RTU客户端实例:使用ModbusSerialMaster类的CreateRtu方法创建一个Modbus RTU客户端实例,该实例将用于与从设备进行通信。
  3. 设置从设备地址:通过设置slaveAddress属性来指定要与之通信的从设备的地址。
  4. 读取输入线圈:使用ReadCoils方法读取从设备的输入线圈的状态。需要指定从设备地址和起始地址以及要读取的线圈数量。
  5. 读取输出寄存器:使用ReadHoldingRegisters方法读取从设备的输出寄存器的值。需要指定从设备地址和起始地址以及要读取的寄存器数量。
  6. 读取输入寄存器:使用ReadInputRegisters方法读取从设备的输入寄存器的值。需要指定从设备地址和起始地址以及要读取的寄存器数量。
  7. 写单个输出线圈:使用WriteSingleCoil方法将单个输出线圈的状态写入从设备。需要指定从设备地址和要写入的线圈地址以及线圈状态。
  8. 写单个输出寄存器:使用WriteSingleRegister方法将单个输出寄存器的值写入从设备。需要指定从设备地址和要写入的寄存器地址以及要写入的值。
  9. 写多个输出线圈:使用WriteMultipleCoils方法将多个输出线圈的状态写入从设备。需要指定从设备地址和起始地址以及要写入的线圈状态数组。
  10. 写多个输出寄存器:使用WriteMultipleRegisters方法将多个输出寄存器的值写入从设备。需要指定从设备地址和起始地址以及要写入的寄存器值数组。

以上步骤演示了如何在C#中使用NModbus4库与Modbus RTU从设备进行通信,并读取或写入从设备的不同数据类型。根据实际需求,可以选择使用不同的方法来读取或写入Modbus RTU从设备的数据。

 

相关文章:

  • 【喵叔闲扯】--迪米特法则
  • 23111708[含文档+PPT+源码等]计算机毕业设计基于javaweb的旅游网站前台与后台旅景点
  • 元宇宙3D云展厅应用到汽车销售的方案及特点
  • DAO和增删改查通用方法-BasicDao
  • PON网络应用场景
  • Jupyter Notebook的下载安装与使用教程_Python数据分析与可视化
  • 一文看分布式锁
  • Node.js中的Buffer和Stream
  • CTF-PWN-堆- 【off-by-one】
  • 「Verilog学习笔记」实现3-8译码器①
  • MySQL存储架构
  • YoloV8改进策略:聚焦线性注意力重构YoloV8
  • 黑马程序员微服务 第五天课程 分布式搜索引擎2
  • 【详解】堡垒机和vpn是一个东西吗
  • 移远EC600U-CN开发板 11.17
  • (三)从jvm层面了解线程的启动和停止
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • uni-app项目数字滚动
  • vagrant 添加本地 box 安装 laravel homestead
  • Vue学习第二天
  • 工作中总结前端开发流程--vue项目
  • 诡异!React stopPropagation失灵
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 坑!为什么View.startAnimation不起作用?
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 前端之Sass/Scss实战笔记
  • 删除表内多余的重复数据
  • 深度学习中的信息论知识详解
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 找一份好的前端工作,起点很重要
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • (+4)2.2UML建模图
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • .net core 连接数据库,通过数据库生成Modell
  • .NET MVC之AOP
  • .net 后台导出excel ,word
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地中转一个自定义的弱事件(可让任意 CLR 事件成为弱事件)
  • .netcore 如何获取系统中所有session_如何把百度推广中获取的线索(基木鱼,电话,百度商桥等)同步到企业微信或者企业CRM等企业营销系统中...
  • /etc/sudoers (root权限管理)
  • ?php echo ?,?php echo Hello world!;?
  • @value 静态变量_Python彻底搞懂:变量、对象、赋值、引用、拷贝
  • [ NOI 2001 ] 食物链
  • [ 云计算 | AWS ] AI 编程助手新势力 Amazon CodeWhisperer:优势功能及实用技巧
  • [ACTF2020 新生赛]Upload 1
  • [Android Pro] Notification的使用
  • [ASP]青辰网络考试管理系统NES X3.5
  • [AutoSar]BSW_OS 01 priority ceiling protocol(PCP)