添加命名空间
using Modbus.Device;
using Modbus.Message;
byte _DeviceId = 8;
ModbusMaster master;
/// <summary>
/// 读取单个寄存器
/// </summary>
/// <param name="regAddr"></param>
/// <param name="value"></param>
/// <returns></returns>
public byte[] ReadSingleRegister(ushort regAddr)
ReadHoldingInputRegistersRequest readRegistersReq = new ReadHoldingInputRegistersRequest(0x03, _DeviceId, regAddr, 1);
//获取响应报文
ReadHoldingInputRegistersResponse readRegistersRes = master.ExecuteCustomMessage<ReadHoldingInputRegistersResponse>(readRegistersReq);
return readRegistersRes.ProtocolDataUnit;
catch (Exception ex)
return null;
/// <summary>
/// 读取多个保持型寄存器
/// </summary>
/// <returns></returns>
public Task<byte[]> ReadHoldingRegisters(ushort regStartAddr, ushort regEndAddr)
ushort Lenth = (ushort)(regEndAddr - regStartAddr + 1);
return Task.Run(() =>
ReadHoldingInputRegistersRequest readRegistersReq = new ReadHoldingInputRegistersRequest(0x03, _DeviceId, regStartAddr, Lenth);
//获取响应报文
ReadHoldingInputRegistersResponse readRegistersRes = master.ExecuteCustomMessage<ReadHoldingInputRegistersResponse>(readRegistersReq);
return readRegistersRes.ProtocolDataUnit;
catch (Exception ex)
return null;
public byte[] ReadRegister(ushort regAddr)
ushort Lenth = 1;
ushort[] rec = master.ReadHoldingRegisters(_DeviceId, regAddr, Lenth);
byte[] recByte = new byte[rec.Length];
Buffer.BlockCopy(rec, 0, recByte, 0, rec.Length);
return recByte;
catch (Exception ex)
return null;
public byte[] ReadRegisters(ushort regStartAddr, ushort regEndAddr)
ushort Lenth = (ushort)(regEndAddr - regStartAddr + 1);
ushort[] rec = master.ReadHoldingRegisters(_DeviceId, regStartAddr, Lenth);
byte[] recByte = new byte[rec.Length];
Buffer.BlockCopy(rec, 0, recByte, 0, rec.Length);
return recByte;
catch (Exception ex)
return null;
二、使用EasyModbus,NuGet安装EasyModbusTCP 5.6.0
添加命名空间using EasyModbus;
byte _DeviceId = 8;
ModbusClient modbusClient = null;
object _transferLockObj = new object();
public void OpenSerialPort()
modbusClient = new ModbusClient("COM1");
modbusClient.UnitIdentifier = _DeviceId;
modbusClient.Baudrate = _baudRate;
modbusClient.Parity = Parity.None;
modbusClient.StopBits = StopBits.One;
modbusClient.ConnectionTimeout = 500;
modbusClient.Connect();
catch (Exception ex)
/// <summary>
/// 写入单个寄存器并获取响应
/// </summary>
public byte[] WriteSingleRegister(ushort regAddr, ushort value)
lock (_transferLockObj)
modbusClient.receiveData = null;
modbusClient.WriteSingleRegister(regAddr, value);
byte[] Rec = modbusClient.receiveData;
return Rec;
catch (Exception ex)
return null;
/// <summary>
/// 读取寄存器
/// </summary>
public int[] ReadRegisters(ushort regStartAddr, ushort regEndAddr)
lock (_transferLockObj)
ushort Lenth = (ushort)(regEndAddr - regStartAddr + 1);
int[] rec = modbusClient.ReadHoldingRegisters(regStartAddr, Lenth);
return rec;
catch (Exception ex)
return null;
EasyModbusTCP.NET -
.NET 的
Modbus TCP、
Modbus UDP 和
Modbus RTU 客户端/服务器库行业认可!! 从 PC 或嵌入式系统快速安全地访问许多 PLC 系统和其他工业自动化组件。 从 PLC 读取
数据或向 PLC 写入
数据只需要几行代码。
附加软件工具,例如
Modbus 服务器模拟器,使软件开发变得快速而简单。
从 NuGet 或从以下位置下载库 (*.DLL):
支持的功能代码:
读取线圈 (FC1)
读取离散输入 (FC2)
读取保持寄存器 (FC3)
读取输入寄存器 (FC4)
写单线圈 (FC5)
写单个寄存器 (FC6)
写入多个线圈 (FC15)
写多个寄存器 (FC16)
读/写多个寄存器 (FC23)
Modbus TCP、
Modbus UDP 和
Modbus RTU 客户端/服务器库
一、为什么使用EasyModbus?
之前一直使用开源库NModbus,它是一个非常优秀的Modbus通信类库,偶然机会下我发现了EasyModbus,发现EasyModbus的代码非常精炼、间接,一两行代码就可以创建一个Modbus TCP Client。
EasyModbus官网:http://easymodbustcp.net/en/
二、使用步骤
1.添加引用
在官网下载DLL文件,在项目中添加引用。
代码如下(示例):
using EasyModbus;
2.创建一个Modbus TCP Cli
很久以前,写过一篇C#做Modbus从站的博客C#工控机作为Modbus从站的方法_gaooolianggg的专栏-CSDN博客_c# modbus 从站,当时用的是NModbus,整体使用略微有些繁琐。最近在做项目时,使用了一个更方便的方法,这里分享出来。
这里使用的是EasyModbus。在Nuget程序管理中直接下载安装即可。如果你需要使用从站,只需要非常简单的几行代码
ModbusServer modbusServer = new ModbusServer();...
串口项目使用的协议为Modbus,简介什么的我就不在网络上面班门弄斧了,下面就介绍一下Modbus发送指令的格式,以及我对数据的处理。
关于Modbus的数据传输如下:
Modicon 控制器上的标准 Modbus 端口是使用一个 RS-232 兼容的串行接口,定义了连接器,接线电缆,信号等级,传
输波特率,和奇偶校验,控制器可直接或通过调制解调器(以后简称 Modems)接入总线(网络)。控制器...
要使用Arduino通过Modbus RTU协议传输串口数据,需要进行以下步骤:
1. 确定Modbus RTU通信参数,例如波特率、数据位、停止位和校验位等。
2. 创建Arduino程序,使用Serial库打开串口,设置串口参数。
3. 使用ModbusMaster库或其他Modbus RTU库,将要传输的数据格式化为Modbus RTU协议所需的格式,并通过串口发送数据。
4. 在接收端,使用ModbusSlave库或其他Modbus RTU库,接收并解析从串口接收到的Modbus RTU协议数据,将其转换为可读的格式。
5. 根据需要,使用其他Arduino库或功能处理接收到的数据。
需要注意的是,Modbus RTU协议是一种基于串口通信的协议,因此需要确保Arduino和接收端设备之间的串口连接正确。另外,在使用Modbus RTU协议传输数据时,需要考虑数据的格式和长度等因素,以确保数据的正确性和完整性。