本文主要介绍基于开源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; }
方法
- 打开设备连接
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);
}
}
- 断开设备连接
public override OperateResult Close()
{
try
{
_tcpClient.Close();
return OperateResult.CreateSuccessResult();
}
catch (Exception ex)
{
return OperateResult.CreateFailedResult(ex.Message);
}
}
- 读取单个寄存器
- 读取单个
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);
}
}
- 读取多个寄存器
- 读取指定长度的
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);
}
}