C# 基于NModbus4的数据读写

本文主要介绍基于开源modbus库NModbus4的数据读写
添加引用

using Modbus.Device;

属性

 private ModbusIpMaster _master;
 private string _ipAddress;
 private TcpClient _tcpClient;

 /// <summary>
 /// 设备IP地址
 /// </summary>
 public string IpAddress { get => _ipAddress; set => _ipAddress = value; }

方法

  1. 打开设备连接
public override OperateResult Open()
{
    try
    {
        _tcpClient = new TcpClient(IPAddress.Parse(_ipAddress).ToString(), 502);
        _master = ModbusIpMaster.CreateIp(_tcpClient);
        return OperateResult.CreateSuccessResult();
    }
    catch (Exception ex)
    {
        return OperateResult.CreateFailedResult(ex.Message);
    }
}
  1. 断开设备连接
public override OperateResult Close()
{
    try
    {
        _tcpClient.Close();
        return OperateResult.CreateSuccessResult();
    }
    catch (Exception ex)
    {
        return OperateResult.CreateFailedResult(ex.Message);
    }
}
  1. 读取单个寄存器
  • 读取单个bool数据
public OperateResult<bool> ReadBool(ushort address)
{
    try
    {
        Validate();
        var buffer = _master.ReadInputs(address, 1);
        return OperateResult.CreateSuccessResult(buffer[0]);
    }
    catch (Exception ex)
    {
        return OperateResult.CreateFailedResult<bool>(ex.Message);
    }
}
  • 读取单个short数据
public OperateResult<short> ReadInt16(ushort address)
{
    try
    {
        Validate();
        var buffer = _master.ReadHoldingRegisters(address, 1);
        var value = buffer[0] <= short.MaxValue ? (short)buffer[0] : (short)(buffer[0] - ushort.MaxValue - 1);
        return OperateResult.CreateSuccessResult(value);
    }
    catch (Exception ex)
    {
        return OperateResult.CreateFailedResult<short>(ex.Message);
    }
}
  • 读取单个int数据
public OperateResult<int> ReadInt32(ushort address)
{
    try
    {
        Validate();
        var buffer = _master.ReadHoldingRegisters((ushort)(address * 2), 2);
        var value = (buffer[1] << 16) + buffer[0];
        return OperateResult.CreateSuccessResult(value);
    }
    catch (Exception ex)
    {
        return OperateResult.CreateFailedResult<int>(ex.Message);
    }
}
  • 读取单个float数据
public OperateResult<float> ReadFloat(ushort address)
{
    try
    {
        Validate();
        var buffer = _master.ReadHoldingRegisters(address, 2);
        var low = ((IEnumerable<byte>)BitConverter.GetBytes(buffer[0]));
        var high = (IEnumerable<byte>)BitConverter.GetBytes(buffer[1]);
        var value = BitConverter.ToSingle(low.Concat(high).ToArray(), 0);
        //var value = ModbusUtility.GetSingle(buffer[1], buffer[0]);
        return OperateResult.CreateSuccessResult(value);
    }
    catch (Exception ex)
    {
        return OperateResult.CreateFailedResult<float>(ex.Message);
    }
}
  • 读取单个double数据
public OperateResult<double> ReadDouble(ushort address)
{
    try
    {
        Validate();
        var buffer = _master.ReadHoldingRegisters(address, 4);
        var b0 = (IEnumerable<byte>)BitConverter.GetBytes(buffer[0]);
        var b1 = (IEnumerable<byte>)BitConverter.GetBytes(buffer[1]);
        var b2 = (IEnumerable<byte>)BitConverter.GetBytes(buffer[2]);
        var b3 = (IEnumerable<byte>)BitConverter.GetBytes(buffer[3]);
        var value = BitConverter.ToDouble(b0.Concat(b1).Concat(b2).Concat(b3).ToArray(), 0);
        //var value = ModbusUtility.GetDouble(buffer[3], buffer[2], buffer[1], buffer[0]);
        return OperateResult.CreateSuccessResult(value);
    }
    catch (Exception ex)
    {
        return OperateResult.CreateFailedResult<double>(ex.Message);
    }
}
  1. 读取多个寄存器
  • 读取指定长度的bool数组数据
 public OperateResult<bool[]> ReadBool(ushort address, ushort length)
 {
     try
     {
         Validate();
         var buffer = _master.ReadInputs(address, length);
         return OperateResult.CreateSuccessResult(buffer);
     }
     catch (Exception ex)
     {
         return OperateResult.CreateFailedResult<bool[]>(ex.Message);
     }
 }
  • 读取指定长度的short数组数据
 public OperateResult<short[]> ReadInt16(ushort address, ushort length)
 {
     try
     {
         Validate();
         var buffer = _master.ReadHoldingRegisters(address, 1);
        
         List<short> values = new List<short>();
         for (int i = 0; i < length; i++)
         {
             var value = buffer[i] <= short.MaxValue ? (short)buffer[i] : (short)(buffer[i] - ushort.MaxValue - 1);
             values.Add(value);
         }
         return OperateResult.CreateSuccessResult(values.ToArray());
     }
     catch (Exception ex)
     {
         return OperateResult.CreateFailedResult<short[]>(ex.Message);
     }
 }
 
  • 读取指定长度的int数组数据
 public OperateResult<int[]> ReadInt32(ushort startAddress, ushort length)
 {
     try
     {
         Validate();
         ushort address = (ushort)(startAddress * 2);
         var buffer = _master.ReadHoldingRegisters(address, (ushort)(length * 2));
         List<int> values = new List<int>();
         for (int i = 0; i < length; i++)
         {
             var value = (buffer[i * 2 + 1] << 16) + buffer[i * 2];
             values.Add(value);
         }
         return OperateResult.CreateSuccessResult(values.ToArray());
     }
     catch (Exception ex)
     {
         return OperateResult.CreateFailedResult<int[]>(ex.Message);
     }
 }
  • 读取指定长度的float数组数据
 public OperateResult<float[]> ReadFloat(ushort address, ushort length)
 {
     try
     {
         Validate();
         var buffer = _master.ReadHoldingRegisters(address, (ushort)(2 * length));
       
         List<float> values = new List<float>();
         for (int i = 0; i < length; i++)
         {
             var low = ((IEnumerable<byte>)BitConverter.GetBytes(buffer[i * 2]));
             var high = (IEnumerable<byte>)BitConverter.GetBytes(buffer[i * 2 + 1]);
             var value = BitConverter.ToSingle(low.Concat(high).ToArray(), 0);
             //var value = ModbusUtility.GetSingle(buffer[1], buffer[0]);
             values.Add(value);
         }
         return OperateResult.CreateSuccessResult(values.ToArray());
     }
     catch (Exception ex)
     {
         return OperateResult.CreateFailedResult<float[]>(ex.Message);
     }
 }
  • 读取指定长度的double数组数据
 public OperateResult<double[]> ReadDouble(ushort address, ushort length)
 {
     try
     {
         Validate();
         var buffer = _master.ReadHoldingRegisters(address, (ushort)(4 * length));

         List<double> values = new List<double>();
         for (int i = 0; i < length; i++)
         {
             var b0 = (IEnumerable<byte>)BitConverter.GetBytes(buffer[4 * i]);
             var b1 = (IEnumerable<byte>)BitConverter.GetBytes(buffer[4 * i + 1]);
             var b2 = (IEnumerable<byte>)BitConverter.GetBytes(buffer[4 * i + 2]);
             var b3 = (IEnumerable<byte>)BitConverter.GetBytes(buffer[4 * i + 3]);
             var value = BitConverter.ToDouble(b0.Concat(b1).Concat(b2).Concat(b3).ToArray(), 0);
             values.Add(value);
         }
         
         return OperateResult.CreateSuccessResult(values.ToArray());
     }
     catch (Exception ex)
     {
         return OperateResult.CreateFailedResult<double[]>(ex.Message);
     }
 }
/// /// 读保持寄存器03 /// /// 数据读取延迟 /// 设备从站地址 /// 数据起始地址 /// 寄存器数量 /// 返回的寄存器数值 /// 返回异常描述 /// 是否读取成功 public bool ReadHoldReg(int timeout, byte slaveAddress, ushort startAddress, ushort regCountIn, out ushort[] holdRegs, out ModbusException ex) /// /// 读输入寄存器04 /// /// 数据读取延迟 /// 设备从站地址 /// 数据地址 /// 寄存器数量 /// 返回的寄存器数值 /// 返回异常描述 /// 是否读取成功 public bool ReadInputReg(int timeout, byte slaveAddress, ushort startAddress, ushort regCountIn, out ushort[] InputRegs, out ModbusException ex) /// /// 写单寄存器(06功能码) /// /// 数据读取延迟 /// 设备从站地址 /// 寄存器地址 /// 寄存器值 /// 返回异常描述 /// 是否写入成功 public bool WriteSingleReg(int timeout, byte slaveAddress, ushort regAdr, ushort regValue, out ModbusException ex) /// /// 写单个线圈(05功能码) /// /// 数据读取延迟 /// 设备从站地址 /// 寄存器地址 /// 寄存器值 /// 返回异常描述 /// 是否写入成功 public bool WriteSingleCoil(int timeout, byte slaveAddress, ushort regAdr, ushort ONorOFF, out ModbusException ex) /// /// 写多寄存器(10功能码) /// /// 数据读取延迟 /// 设备从站地址 /// 寄存器起始地址 /// 寄存器值 /// 返回异常描述 /// 是否写入成功 public bool WriteMutilReg(int timeout, byte slaveAddress, ushort regAdr, ushort[] regValue, out ModbusException ex) ....................
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值