C#使用EasyModbus进行通讯的实现示例
作者:*Major*-莙工科技有限公司
EasyModbus是一个流行的.NET库,用于实现Modbus TCP、RTU和UDP协议通信,本文就来介绍一下C#使用EasyModbus进行通讯的实现示例,感兴趣的可以了解一下
EasyModbus是一个流行的.NET库,用于实现Modbus TCP、RTU和UDP协议通信。
一 安装EasyModbus

二 ModbusRTU-串口连接
// 创建Modbus RTU客户端
ModbusClient modbusClient = new ModbusClient("COM10"); // 串口号
modbusClient.Baudrate = 9600; // 波特率
modbusClient.Parity = System.IO.Ports.Parity.None; // 校验位
modbusClient.StopBits = System.IO.Ports.StopBits.One; // 停止位
modbusClient.Connect();
三 ModbusTCP-网口连接
// 创建Modbus客户端实例
ModbusClient modbusClient = new ModbusClient("127.0.0.1", 502); // IP地址和端口
// 连接到Modbus服务器
modbusClient.Connect();
四 读取多个输出线圈
// 读取线圈状态 (功能码01)
bool[] coilStatus = modbusClient.ReadCoils(0, 5); // 从地址0开始读取5个线圈
五 写入单个线圈
// 写入单个线圈 (功能码05)
modbusClient.WriteSingleCoil(0, true); // 向地址0写入true
六 读取保持寄存器
// 读取保持寄存器 (功能码03)
int[] holdingRegisters = modbusClient.ReadHoldingRegisters(0, 10); // 从地址0开始读取10个寄存器
七 读取输入寄存器
int[] inputRegisters = modbusClient.ReadInputRegisters(0, 5);
八 写入单个输出寄存器
modbusClient.WriteSingleRegister(0, 1234);
九 写入多个输出寄存器
// 写入多个寄存器 (功能码16)
int[] valuesToWrite = { 100, 200, 300 };
modbusClient.WriteMultipleRegisters(0, valuesToWrite); // 从地址0开始写入
基本用法
1. Modbus TCP客户端
using EasyModbus;
// 创建Modbus客户端实例
ModbusClient modbusClient = new ModbusClient("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 (Exception ex)
{
Console.WriteLine($"发生错误: {ex.Message}");
}
finally
{
// 断开连接
modbusClient.Disconnect();
}
2. Modbus RTU客户端 (串口通信)
using EasyModbus;
// 创建Modbus RTU客户端
ModbusClient modbusClient = new ModbusClient("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 (Exception ex)
{
Console.WriteLine($"发生错误: {ex.Message}");
}
finally
{
modbusClient.Disconnect();
}
3. Modbus服务器
EasyModbus也支持创建Modbus服务器:
using EasyModbus;
// 创建Modbus TCP服务器
ModbusServer modbusServer = new ModbusServer();
modbusServer.Port = 502; // 设置端口
// 设置寄存器值(服务器模拟)
modbusServer.HoldingRegisters[0] = 100;
modbusServer.HoldingRegisters[1] = 200;
// 启动服务器
modbusServer.Listen();
Console.WriteLine("Modbus服务器已启动,按任意键停止...");
Console.ReadKey();
// 停止服务器
modbusServer.StopListening();
高级功能
异步操作
// 异步读取保持寄存器 int[] registers = await Task.Run(() => modbusClient.ReadHoldingRegisters(0, 10));
事件处理
modbusClient.DataReceived += (sender, e) =>
{
Console.WriteLine($"接收到数据: {BitConverter.ToString(e.Data)}");
};
超时设置
modbusClient.ConnectionTimeout = 5000; // 5秒连接超时
注意事项
- 确保防火墙允许Modbus通信(默认端口502)
- 对于RTU模式,确保串口配置与设备匹配
- 处理异常情况,如连接失败、超时等
- 寄存器地址从0开始,但某些设备文档可能从1开始计数,需要注意偏移
完整示例
using System;
using EasyModbus;
class Program
{
static void Main(string[] args)
{
ModbusClient modbusClient = new ModbusClient("192.168.1.100", 502);
try
{
Console.WriteLine("正在连接Modbus服务器...");
modbusClient.Connect();
// 读取保持寄存器
Console.WriteLine("读取保持寄存器...");
int[] registers = modbusClient.ReadHoldingRegisters(0, 5);
for (int i = 0; i < registers.Length; i++)
{
Console.WriteLine($"寄存器 {i}: {registers[i]}");
}
// 写入寄存器
Console.WriteLine("写入寄存器...");
modbusClient.WriteSingleRegister(10, 1234);
// 验证写入
int value = modbusClient.ReadHoldingRegisters(10, 1)[0];
Console.WriteLine($"寄存器10的新值: {value}");
}
catch (Exception ex)
{
Console.WriteLine($"错误: {ex.Message}");
}
finally
{
modbusClient.Disconnect();
Console.WriteLine("连接已关闭");
}
}
}
通过以上示例,你应该能够开始在C#项目中使用EasyModbus库进行Modbus通信了。
到此这篇关于C#使用EasyModbus进行通讯的实现示例的文章就介绍到这了,更多相关C# EasyModbus通讯内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
