C#使用EasyModbus进行通讯
EasyModbus是一个流行的.NET库,用于实现Modbus TCP、RTU和UDP协议通信。以下是使用EasyModbus库的基本指南:
安装EasyModbus
首先,你需要通过NuGet安装EasyModbus库:
- 在Visual Studio中,右键点击你的项目
- 选择"管理NuGet程序包"
- 搜索"EasyModbus"并安装
或者使用Package Manager Console:
Install-PackageEasyModbus基本用法
1. Modbus TCP客户端
usingEasyModbus;// 创建Modbus客户端实例ModbusClientmodbusClient=newModbusClient("127.0.0.1",502);// IP地址和端口try{// 连接到Modbus服务器modbusClient.Connect();// 读取保持寄存器 (功能码03)int[]holdingRegisters=modbusClient.ReadHoldingRegisters(0,10);// 从地址0开始读取10个寄存器// 写入单个寄存器 (功能码06)modbusClient.WriteSingleRegister(0,1234);// 向地址0写入值1234// 写入多个寄存器 (功能码16)int[]valuesToWrite={100,200,300};modbusClient.WriteMultipleRegisters(10,valuesToWrite);// 从地址10开始写入// 读取线圈状态 (功能码01)bool[]coilStatus=modbusClient.ReadCoils(0,5);// 从地址0开始读取5个线圈// 写入单个线圈 (功能码05)modbusClient.WriteSingleCoil(0,true);// 向地址0写入true}catch(Exceptionex){Console.WriteLine($"发生错误:{ex.Message}");}finally{// 断开连接modbusClient.Disconnect();}2. Modbus RTU客户端 (串口通信)
usingEasyModbus;// 创建Modbus RTU客户端ModbusClientmodbusClient=newModbusClient("COM1");// 串口号modbusClient.Baudrate=9600;// 波特率modbusClient.Parity=System.IO.Ports.Parity.None;// 校验位modbusClient.StopBits=System.IO.Ports.StopBits.One;// 停止位try{modbusClient.Connect();// 与TCP类似的操作int[]inputRegisters=modbusClient.ReadInputRegisters(0,5);// ...其他操作}catch(Exceptionex){Console.WriteLine($"发生错误:{ex.Message}");}finally{modbusClient.Disconnect();}3. Modbus服务器
EasyModbus也支持创建Modbus服务器:
usingEasyModbus;// 创建Modbus TCP服务器ModbusServermodbusServer=newModbusServer();modbusServer.Port=502;// 设置端口// 设置寄存器值(服务器模拟)modbusServer.HoldingRegisters[0]=100;modbusServer.HoldingRegisters[1]=200;// 启动服务器modbusServer.Listen();Console.WriteLine("Modbus服务器已启动,按任意键停止...");Console.ReadKey();// 停止服务器modbusServer.StopListening();高级功能
异步操作
// 异步读取保持寄存器int[]registers=awaitTask.Run(()=>modbusClient.ReadHoldingRegisters(0,10));事件处理
modbusClient.DataReceived+=(sender,e)=>{Console.WriteLine($"接收到数据:{BitConverter.ToString(e.Data)}");};超时设置
modbusClient.ConnectionTimeout=5000;// 5秒连接超时注意事项
- 确保防火墙允许Modbus通信(默认端口502)
- 对于RTU模式,确保串口配置与设备匹配
- 处理异常情况,如连接失败、超时等
- 寄存器地址从0开始,但某些设备文档可能从1开始计数,需要注意偏移
完整示例
usingSystem;usingEasyModbus;classProgram{staticvoidMain(string[]args){ModbusClientmodbusClient=newModbusClient("192.168.1.100",502);try{Console.WriteLine("正在连接Modbus服务器...");modbusClient.Connect();// 读取保持寄存器Console.WriteLine("读取保持寄存器...");int[]registers=modbusClient.ReadHoldingRegisters(0,5);for(inti=0;i<registers.Length;i++){Console.WriteLine($"寄存器{i}:{registers[i]}");}// 写入寄存器Console.WriteLine("写入寄存器...");modbusClient.WriteSingleRegister(10,1234);// 验证写入intvalue=modbusClient.ReadHoldingRegisters(10,1)[0];Console.WriteLine($"寄存器10的新值:{value}");}catch(Exceptionex){Console.WriteLine($"错误:{ex.Message}");}finally{modbusClient.Disconnect();Console.WriteLine("连接已关闭");}}}通过以上示例,你应该能够开始在C#项目中使用EasyModbus库进行Modbus通信了。