Modbus 是一种广泛应用于工业领域的通信协议,用于在电子设备之间传输数据。它简单、可靠,支持串行和以太网通信。EasyModbus 是一个用于 .NET 平台的开源库,提供了便捷的接口来实现 Modbus 协议的功能。
本文将详细介绍如何在 C# 项目中使用 EasyModbus 库,实现 Modbus 通信,包括读取和写入数据的具体示例。
在开始使用 EasyModbus 之前,需要将其添加到您的项目中。
通过包管理器控制台安装
打开 “工具” -> “NuGet 包管理器” -> “包管理器控制台”,输入以下命令并回车:
PowerShellInstall-Package EasyModbus

首先,需要创建一个 Modbus 客户端实例,指定目标服务器的 IP 地址和端口号(默认端口为 502)。
C#static void Main(string[] args)
{
ModbusClient modbusClient = new ModbusClient("127.0.0.1", 502);
modbusClient.Connect();
if (modbusClient.Connected) {
Console.WriteLine("Connected to Modbus Server");
}
}

读取线圈状态通常用于获取开关、继电器等数字量的当前状态。
C#static void Main(string[] args)
{
ModbusClient modbusClient = new ModbusClient("127.0.0.1", 502);
modbusClient.Connect();
if (modbusClient.Connected) {
Console.WriteLine("Connected to Modbus Server");
}
// 读取从地址0开始的10个线圈状态
bool[] coils = modbusClient.ReadCoils(0, 10);
// 输出结果
for (int i = 0; i < coils.Length; i++)
{
Console.WriteLine($"Coil {i}: {coils[i]}");
}
}

C#// 读取从地址0开始的5个离散输入状态
bool[] discreteInputs = modbusClient.ReadDiscreteInputs(0, 5);
for (int i = 0; i < discreteInputs.Length; i++)
{
Console.WriteLine($"Discrete Input {i}: {discreteInputs[i]}");
}
保持寄存器用于存储模拟量数据,如传感器读数。
C#// 读取从地址0开始的5个保持寄存器的值
int[] holdingRegisters = modbusClient.ReadHoldingRegisters(0, 5);
for (int i = 0; i < holdingRegisters.Length; i++)
{
Console.WriteLine($"Holding Register {i}: {holdingRegisters[i]}");
}

C#// 读取从地址0开始的5个输入寄存器的值
int[] inputRegisters = modbusClient.ReadInputRegisters(0, 5);
for (int i = 0; i < inputRegisters.Length; i++)
{
Console.WriteLine($"Input Register {i}: {inputRegisters[i]}");
}
C#// 将地址0的线圈状态设为 true
modbusClient.WriteSingleCoil(0, true);
C#// 将从地址0开始的3个线圈状态设置为 true, false, true
bool[] coilValues = { true, false, true };
modbusClient.WriteMultipleCoils(0, coilValues);
C#// 将地址0的保持寄存器值设为1234
modbusClient.WriteSingleRegister(0, 1234);
C#// 将从地址0开始的3个保持寄存器值设置为100, 200, 300
int[] registerValues = { 100, 200, 300 };
modbusClient.WriteMultipleRegisters(0, registerValues);
除了 Modbus TCP,EasyModbus 也支持 Modbus RTU。
C#// 创建串行通信的 Modbus 客户端
ModbusClient modbusClient = new ModbusClient("COM3");
modbusClient.UnitIdentifier = 1; // 从机地址
modbusClient.Baudrate = 9600;
modbusClient.Parity = System.IO.Ports.Parity.None;
modbusClient.StopBits = System.IO.Ports.StopBits.One;
modbusClient.Connect();
使用异步方法可以避免阻塞主线程,提高应用程序的响应速度。
C#// 异步读取保持寄存器
modbusClient.ConnectionTimeout = 5000; // 设定超时时间
Task.Run(() =>
{
int[] holdingRegisters = modbusClient.ReadHoldingRegisters(0, 5);
// 处理读取的数据
});
EasyModbus 提供了事件机制,可以在数据接收后触发特定操作。
C#static ModbusClient modbusClient;
static void Main(string[] args)
{
try
{
modbusClient = new ModbusClient("127.0.0.1", 502);
// 注册事件处理器
modbusClient.SendDataChanged += (sender) => {
Console.WriteLine("发送数据事件触发");
};
modbusClient.ReceiveDataChanged += (sender) => {
Console.WriteLine("接收数据事件触发");
// 打印接收到的原始数据
if (modbusClient.receiveData != null)
{
Console.WriteLine("接收数据: " +
BitConverter.ToString(modbusClient.receiveData));
}
};
// 连接
modbusClient.Connect();
// 显式写入数据
int[] values = new int[] { 123 };
modbusClient.WriteMultipleRegisters(100, values);
// 保持连接
Console.WriteLine("等待事件触发...");
Console.ReadKey();
}
catch (Exception ex)
{
Console.WriteLine($"错误: {ex.Message}");
}
}
在通信完成后,建议关闭连接以释放资源。
C#modbusClient.Disconnect();
通过 EasyModbus 库,您可以轻松地在 C# 项目中实现 Modbus 通信。本文详细介绍了从安装到高级用法的各个方面,希望对您的开发工作有所帮助。
本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!