C# 使用NModbus4、EasyModbus进行串口ModbusRTU数据收发,立即获取返回响应

2 篇文章 0 订阅

一、先介绍NModbus4,NuGet安装NModbus4稳定版v2.1.0

1.新建类NModbus4Helper.cs

添加命名空间

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)
        {
            try
            {
                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)
        {
            try
            {
                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)
        {
            try
            {
                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)
        {
            try
            {
                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()
        {
            try
            {
                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)
        {
            try
            {
                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)
        {
            try
            {
                lock (_transferLockObj)
                {
                    ushort Lenth = (ushort)(regEndAddr - regStartAddr + 1);
                    int[] rec = modbusClient.ReadHoldingRegisters(regStartAddr, Lenth);
                    return rec;
                }
            }
            catch (Exception ex)
            {
                return null;
            }
        }

  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值