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从设备的数据。

相关推荐
白帽小阳9 小时前
我的AI辅助开发工具链2026版:从编码到部署的全栈智能实践
网络·人工智能·学习·安全·自动化
衣舞晨风10 小时前
什么样的 AI 网关算是一个好网关
网络·人工智能·网关·ai·大模型·ai网关
Keepingrun10 小时前
http登录和授权
网络·网络协议·http
Sirius Wu10 小时前
OpenClaw 并发安全完整详解
网络·人工智能·安全·ai·架构·aigc
rcms1527026921811 小时前
AMAT 0190-27952-04 终端服务器
网络
海外数字观察家11 小时前
品未云:博兹瓦纳华商批发零售一体化 ERP,破解本土软件适配难题|CSDN 技术分享
大数据·网络·人工智能·博兹瓦纳进销存系统·博兹瓦纳收银系统·博兹瓦纳erp系统·博兹瓦纳仓库管理系统
段一凡-华北理工大学12 小时前
AI Agent 从入门到封神:24 讲打造你的超级智能体~系列文章23:从Demo到上线:Agent应用的架构设计、性能优化与成本控制实战
运维·网络·人工智能·性能优化·高炉炼铁·工业智能体
leagsoft_100312 小时前
从“策略看不清”到“风险可收敛”:某高端精密制造企业的网络安全策略治理实践
网络·web安全·制造
paopaokaka_luck12 小时前
基于Springboot3+Vue3的宠物殡葬管理系统(webSocket实时通讯、接入腾讯地图、支付宝沙盒支付、Echarts图形化分析)
java·开发语言·网络·后端
承渊政道12 小时前
【从零开始大模型开发与微调:基于PyTorch与ChatGLM】(从退化问题到信息高速公路:ResNet残差网络实战拆解)
网络·人工智能·pytorch·深度学习·resnet·chatglm·卷积