c# ModbusRtu 读写线圈和寄存器的值
时间: 2024-12-17 09:21:13 浏览: 3
C#Modbus通信案例,包含了ModbusRTU,ModbusTCP,OPC三种Modbus通信案例
在C#中,Modbus RTU是一种常用的工业通信协议,用于远程监控和控制设备。如果你需要通过Modbus RTU协议来读取或写入线圈(Coils)和寄存器(Registers)的值,你需要使用一些库,比如NModbus或HABLib,它们提供了对Modbus协议的支持。
首先,确保你安装了所需的库,然后按照以下步骤操作:
1. **连接设备**: 创建一个ModbusSerialMaster或ModbusTcpMaster实例,这取决于你的设备是RS-485串口还是TCP/IP网络。
```csharp
using NModbus;
// 或者
using HABLib.Modbus.Rtu;
var master = new ModbusSerialMaster(new FileModbusSerialPort("COM1", 9600)); // RS-485
// 或者
var master = new ModbusTcpMaster(new IPEndPoint(IPAddress.Parse("192.168.1.1"), 502)); // TCP/IP
```
2. **读取线圈**: 使用`ReadCoils`方法,传入线圈地址。如果线圈状态为1,则表示接通。
```csharp
ushort coilAddress = 1; // 示例地址
bool isOn = await master.ReadCoil(coilAddress);
```
3. **读取寄存器**: 对于保持寄存器(如16位或32位),可以使用`ReadHoldingRegisters`;对于输入寄存器(例如模拟输入),用`ReadInputRegisters`。同样传递寄存器地址作为参数。
```csharp
ushort regAddress = 100; // 示例地址
ushort[] values = await master.ReadHoldingRegisters(regAddress, 1); // 读取1个寄存器
```
4. **写入线圈或寄存器**: 对于线圈,使用`WriteSingle Coil`方法;对于寄存器,有`WriteSingleRegister`和`WriteMultipleRegisters`。
```csharp
bool newValue = true; // 新的状态
await master.WriteSingleCoil(coilAddress, newValue);
short[] registerValues = { 100 }; // 示例值
await master.WriteMultipleRegisters(regAddress, registerValues);
```
完成操作后别忘了关闭连接:
```csharp
master.Dispose();
```
阅读全文