添加命名空间

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协议传输数据时,需要考虑数据的格式和长度等因素,以确保数据的正确性和完整性。