NModbus4的使用

本文介绍如何使用C#实现Modbus RTU串口通信,包括串口的打开配置、ModbusMaster的创建及读取线圈状态的方法。通过示例代码展示了如何设置串口参数、设置ModbusMaster的超时参数,并提供了同步和异步两种读取线圈状态的方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

步骤1:打开串口

SerialPort port = new SerialPort("COM7")
port.BaudRate = 9600;
port.BaudRate = 9600;
port.DataBits = 8;
port.Parity = Parity.Odd;
port.StopBits = StopBits.One;
port.Open();    

                

步骤二:创建ModbusSerialMaster,设置超时参数

var master = ModbusSerialMaster.CreateRtu(port);
master.Transport.ReadTimeout = 2000;
//其中transport还有重试次数和重试间隔时间,默认是3和250
//master.Transport.Retries + "  " + master.Transport.WaitToRetryMilliseconds;

步骤三:设置协议参数,开始读写

 byte slaveID = 3;
ushort address = 1;
bool[] coils = new bool[8];

coils = master.ReadCoils(slaveID, address, 1);

以上面方式读线圈,超时就会抛出异常。

可选步骤四:以async await方式读写

比如点击按钮之后,调用AcquireStatus 方法

        private async void AcquireStatus(ModbusSerialMaster master)
        {
            byte slaveID = 3;

            ushort address = 1;
            bool[] coils=null;
            master.Transport.ReadTimeout = 2000;
            try {coils=await master.ReadCoilsAsync(slaveID, address, 1); }
            catch (Exception ex)
            {
                MessageBox.Show("your value " + "无返回值");
            }
            
            if (coils != null)
            {
                this.checkBox1.Checked = coils[0];
                MessageBox.Show("your value " + coils[0]);
            }

        }

 

转载于:https://www.cnblogs.com/noigel/p/10671982.html

<think>我们正在学习使用NModbus4库进行开发NModbus4是一个用于Modbus通信协议的.NET开源实现,支持RTU、TCP和ASCII传输模式。下面我将提供一个入门教程,帮助你开始使用NModbus4。 ### 一、环境准备 1. **安装NuGet包** 在Visual Studio中,通过NuGet包管理器安装`NModbus4`(注意:包名可能是`NModbus`,但根据引用[2]和[3]使用的是NModbus4API)。 2. **引用命名空间** 在代码文件中添加必要的引用: ```csharp using NModbus; using NModbus.Serial; // 用于串口通信 using System.IO.Ports; // 串口操作 ``` ### 二、创建Modbus主站(Master) #### 示例1:通过串口(RTU模式)读取保持寄存器 ```csharp using (SerialPort port = new SerialPort("COM2")) { // 配置串口参数(必须与从站设备一致) port.BaudRate = 9600; port.DataBits = 8; port.Parity = Parity.None; port.StopBits = StopBits.One; port.Open(); // 创建Modbus主站 var factory = new ModbusFactory(); IModbusMaster master = factory.CreateRtuMaster(port); // 读取从站(ID=1)的保持寄存器,起始地址0,读取2个寄存器 ushort[] registers = master.ReadHoldingRegisters(1, 0, 2); Console.WriteLine($"寄存器0: {registers[0]}, 寄存器1: {registers[1]}"); // 写入多个寄存器(从地址2开始写入3个值) ushort[] writeData = { 100, 200, 300 }; master.WriteMultipleRegisters(1, 2, writeData); } ``` #### 示例2:通过TCP连接(需引用`System.Net.Sockets`) ```csharp using (TcpClient client = new TcpClient("192.168.1.100", 502)) // 从站IP和端口 { var factory = new ModbusFactory(); IModbusMaster master = factory.CreateMaster(client.GetStream()); // 读取输入寄存器 ushort[] inputs = master.ReadInputRegisters(1, 0, 5); } ``` ### 三、创建Modbus从站(Slave) #### 示例:TCP从站(引用[3]) ```csharp // 创建TCP监听器(端口502) TcpListener listener = new TcpListener(IPAddress.Any, 502); listener.Start(); // 创建Modbus TCP从站(从站ID=1) var factory = new ModbusFactory(); ModbusSlave slave = factory.CreateSlave(1, listener); // 设置数据存储(模拟寄存器值) slave.DataStore = DataStoreFactory.CreateDefaultDataStore(); // 启动从站服务 slave.ListenAsync(); // 异步运行 ``` ### 四、核心概念 1. **功能码支持**: - `ReadCoils` (01) - 读取线圈 - `ReadInputs` (02) - 读取离散输入 - `ReadHoldingRegisters` (03) - 读保持寄存器 - `ReadInputRegisters` (04) - 读输入寄存器 - `WriteSingleCoil` (05) - 写单个线圈 - `WriteSingleRegister` (06) - 写单个寄存器 - `WriteMultipleCoils` (15) - 写多个线圈 - `WriteMultipleRegisters` (16) - 写多个寄存器 2. **数据存储**(从站): - `DataStore` 对象管理从站数据 - 可自定义数据源: ```csharp slave.DataStore.CoilDiscretes.Add(10, true); // 设置线圈地址10为true slave.DataStore.HoldingRegisters[0] = 12345; // 设置保持寄存器地址0的值 ``` ### 五、调试技巧 1. **模拟工具**: - 使用Modbus Slave模拟器(如Modbus Poll)测试主站代码 - 用主站模拟器(如ModScan)测试从站代码 2. **异常处理**: ```csharp try { master.WriteMultipleRegisters(1, 0, new ushort[]{100}); } catch (ModbusException ex) { Console.WriteLine($"Modbus错误: {ex.Message}"); } ``` > 提示:完整API文档参考[NModbus4 GitHub](https://github.com/NModbus/NModbus) --- §§相关问题§§ 1. 如何用NModbus4实现串口通信的超时重试机制? 2. NModbus4从站如何响应自定义功能码? 3. 如何将NModbus4集成到ASP.NET Core应用中? 4. NModbus4支持哪些.NET版本和平台?</think>### NModbus4 入门教程(基于 C#) #### 一、环境准备 1. **安装 NuGet 包** 在 Visual Studio 中安装 NModbus4 包: ```bash Install-Package NModbus4 ``` 2. **引用命名空间** ```csharp using NModbus; using NModbus.Serial; // 串口通信支持 using System.IO.Ports; // 串口操作 ``` --- #### 二、基础使用模式 ##### 1. **创建主站(Master)** - 读取设备数据 ```csharp using (SerialPort port = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One)) { port.Open(); var factory = new ModbusFactory(); IModbusMaster master = factory.CreateRtuMaster(port); // RTU 模式 // 读取保持寄存器(从站ID=1,起始地址0,读取2个寄存器) ushort[] registers = master.ReadHoldingRegisters(slaveAddress: 1, startAddress: 0, numRegisters: 2); Console.WriteLine($"寄存器0: {registers[0]}, 寄存器1: {registers[1]}"); } ``` ##### 2. **创建从站(Slave)** - 模拟设备响应[^3] ```csharp TcpListener listener = new TcpListener(IPAddress.Any, 502); // 监听502端口 listener.Start(); // 创建TCP从站(ID=1) ModbusSlave slave = ModbusTcpSlave.CreateTcp(slaveId: 1, listener); // 初始化数据存储(寄存器/线圈) slave.DataStore = DataStoreFactory.CreateDefaultDataStore(); slave.DataStore.HoldingRegisters[0] = 100; // 设置寄存器初始值 slave.ListenAsync(); // 启动异步监听 ``` --- #### 三、核心功能详解 ##### 1. **读写操作** | 功能 | 方法示例 | 功能码 | |----------------|-----------------------------------|--------| | 读保持寄存器 | `ReadHoldingRegisters(1, 0, 5)` | 0x03 | | 写单个寄存器 | `WriteSingleRegister(1, 2, 255)` | 0x06 | | 读线圈状态 | `ReadCoils(1, 0, 8)` | 0x01 | | 写多个线圈 | `WriteMultipleCoils(1, 0, values)`| 0x0F | ##### 2. **数据转换**(常用方法) ```csharp // 寄存器转浮点数 float temperature = ModbusUtility.GetSingle(registers[0], registers[1]); // 浮点数转寄存器 ushort[] tempRegisters = ModbusUtility.GetFloats(25.5f); ``` ##### 3. **超时与重试配置** ```csharp master.Transport.ReadTimeout = 1500; // 1.5秒超时 master.Transport.Retries = 2; // 失败重试2次 ``` --- #### 四、调试技巧 1. **模拟从站设备** 使用工具 [Modbus Slave Simulator](https://www.modbustools.com/modbus_slave.html) 测试主站代码 2. **串口监控** 使用 [AccessPort](https://www.aggsoft.com/rs232-monitor.htm) 捕获数据帧: ``` [TX] 01 03 00 00 00 02 C4 0B [RX] 01 03 04 00 7B 01 F8 2A D1 ``` --- #### 五、进阶应用 ##### 1. 异步操作(.NET 4.5+) ```csharp var registers = await master.ReadHoldingRegistersAsync(1, 0, 10); ``` ##### 2. 自定义数据存储 ```csharp class CustomDataStore : ISlaveDataStore { public ushort[] HoldingRegisters { get; } = new ushort[100]; // 实现其他接口方法... } slave.DataStore = new CustomDataStore(); ``` > 完整示例代码参考:[GitHub NModbus4 Examples](https://github.com/NModbus/NModbus/tree/master/Samples) --- ### 学习资源推荐 1. **官方文档** [NModbus4 GitHub Wiki](https://github.com/NModbus/NModbus/wiki) 2. **视频教程** [B站:C# Modbus 通信实战](https://www.bilibili.com/video/BV19zPVetEKf)(引用[1]) 3. **书籍参考** 《C#上位机开发入门》(引用[4])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值