编辑
2025-11-30
C#
00

目录

安装 EasyModbus
基本用法
创建 Modbus 客户端
读取数据
读取线圈(Coils)状态
读取离散输入(Discrete Inputs)
读取保持寄存器(Holding Registers)
读取输入寄存器(Input Registers)
写入数据
写入单个线圈
写入多个线圈
写入单个寄存器
写入多个寄存器
高级用法
使用 Modbus RTU(串行通信)
异步通信
事件处理
结束通信
总结
参考资料

Modbus 是一种广泛应用于工业领域的通信协议,用于在电子设备之间传输数据。它简单、可靠,支持串行和以太网通信。EasyModbus 是一个用于 .NET 平台的开源库,提供了便捷的接口来实现 Modbus 协议的功能。

本文将详细介绍如何在 C# 项目中使用 EasyModbus 库,实现 Modbus 通信,包括读取和写入数据的具体示例。

安装 EasyModbus

在开始使用 EasyModbus 之前,需要将其添加到您的项目中。

  1. 通过包管理器控制台安装

    打开 “工具” -> “NuGet 包管理器” -> “包管理器控制台”,输入以下命令并回车:

PowerShell
Install-Package EasyModbus

image.png

基本用法

创建 Modbus 客户端

首先,需要创建一个 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"); } }

image.png

读取数据

读取线圈(Coils)状态

读取线圈状态通常用于获取开关、继电器等数字量的当前状态。

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]}"); } }

image.png

读取离散输入(Discrete Inputs)

C#
// 读取从地址0开始的5个离散输入状态 bool[] discreteInputs = modbusClient.ReadDiscreteInputs(0, 5); for (int i = 0; i < discreteInputs.Length; i++) { Console.WriteLine($"Discrete Input {i}: {discreteInputs[i]}"); }

读取保持寄存器(Holding Registers)

保持寄存器用于存储模拟量数据,如传感器读数。

C#
// 读取从地址0开始的5个保持寄存器的值 int[] holdingRegisters = modbusClient.ReadHoldingRegisters(0, 5); for (int i = 0; i < holdingRegisters.Length; i++) { Console.WriteLine($"Holding Register {i}: {holdingRegisters[i]}"); }

image.png

读取输入寄存器(Input Registers)

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 RTU(串行通信)

除了 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 许可协议。转载请注明出处!