using SharpModbus;
using System;
using System.Collections.Generic;
using System.Text;
namespace MES.Utility.Network
{
public class ModbusHelper : IDisposable
{
public delegate void OnSendedData(byte[] bytes, string hexString);
public event OnSendedData OnSended;
public delegate void OnRecivedData(byte[] bytes, string hexString);
public event OnRecivedData OnRecived;
private object _lock = new object();
private ModbusMaster master;
private byte slaveId;
public ModbusHelper(string ip, int port)
{
master = ModbusMaster.TCP(ip, port);
master.OnSended += Master_OnSended; ;
master.OnRecived += Master_OnRecived; ;
slaveId = 1;
}
public ModbusHelper(string ip, int port, byte slaveId)
{
master = ModbusMaster.TCP(ip, port);
master.OnSended += Master_OnSended;
master.OnRecived += Master_OnRecived;
this.slaveId = slaveId;
}
public ModbusHelper(SerialSettings setting, int timeout, byte slaveId)
{
master = ModbusMaster.RTU(setting, timeout);
master.OnSended += Master_OnSended;
master.OnRecived += Master_OnRecived;
this.slaveId = slaveId;
}
#region ushort INT16 操作
///
/// 读取一个地址
///
/// 地址
/// 传递:数据值
/// bool 读取成功还是失败
public bool ReadHoldRegisterInt16(int address, out ushort value)
{
return ReadHoldRegisterInt16(slaveId, address, out value);
}
///
/// 读取一个地址
///
/// 从站Id
/// 地址
/// 传递:数据值
/// bool 读取成功还是失败
public bool ReadHoldRegisterInt16(byte slaveId, int address, out ushort value)
{
bool flag = ReadHoldRegistersInt16(slaveId, address, 1, out ushort[] values);
value = flag ? values[0] : (ushort)0;
return flag;
}
///
/// 读取某个地址连续N个数据
///
/// 地址
/// 读取的数量
/// 传递:数据值
/// bool 读取成功还是失败
public bool ReadHoldRegistersInt16(int address, int count, out ushort[] value)
{
return ReadHoldRegistersInt16(slaveId, address, count, out value);
}
///
/// 读取某个地址连续N个数据
///
///
///
///
///
///
public bool ReadHoldRegistersInt16(byte slaveId, int address, int count, out ushort[] value)
{
lock (_lock)
try
{
value = master.ReadHoldingRegisters(slaveId, (ushort)address, (ushort)count);
return true;
}
catch
{
value = null;
return false;
}
}
///
/// 写入一个地址
///
/// 地址
/// 写入的数据
/// bool 写入成功还是失败
public bool WriteHoldRegisterInt16(int address, ushort value)
{
return WriteHoldRegisterInt16(slaveId, address, value);
}
///
/// 写入一个地址
///
///
///
///
///
public bool WriteHoldRegisterInt16(byte slaveId, int address, ushort value)
{
return WriteHoldRegistersInt16(slaveId, address, new ushort[] { value });
}
///
/// 写入一个地址
///
///
///
///
public bool WriteHoldRegistersInt16(int address, ushort[] value)
{
return WriteHoldRegistersInt16(slaveId, address, value);
}
///
/// 写入一个地址
///
///
///
///
///
public bool WriteHoldRegistersInt16(byte slaveId, int address, ushort[] value)
{
lock (_lock)
try
{
master.WriteRegisters(slaveId, (ushort)address, value);
return true;
}
catch
{
return false;
}
}
#endregion
#region int INT32 操作
///
/// 读取一个地址
///
/// 地址
/// 传递:数据值
/// bool 读取成功还是失败
public bool ReadHoldRegisterInt32(int address, out int value)
{
return ReadHoldRegisterInt32(slaveId, address, out value);
}
///
/// 读取一个地址
///
/// 从站Id
/// 地址
/// 传递:数据值
/// bool 读取成功还是失败
public bool ReadHoldRegisterInt32(byte slaveId, int address, out int value)
{
bool flag = ReadHoldRegistersInt32(slaveId, address, 1, out int[] values);
value = flag ? values[0] : 0;
return flag;
}
///
/// 读取一个地址
///
/// 地址
/// int32数据的数量,不是地址数
/// 传递:数据值
/// bool 读取成功还是失败
public bool ReadHoldRegistersInt32(int address, int count, out int[] value)
{
return ReadHoldRegistersInt32(slaveId, address, count, out value);
}
///
/// 读取一个地址
///
/// 从站Id
/// 地址
/// int32数据的数量,不是地址数
/// 传递:数据值
/// bool 读取成功还是失败
public bool ReadHoldRegistersInt32(byte slaveId, int address, int count, out int[] value)
{
lock (_lock)
try
{
List valueList = new List();
ushort[] values = master.ReadHoldingRegisters(slaveId, (ushort)address, (ushort)(2 * count));
for (int i = 0; i < values.Length; i += 2)
{
valueList.Add(ConvertRegistersToInt(new ushort[] { values[i], values[i + 1] }));
}
value = valueList.ToArray();
return true;
}
catch
{
value = null;
return false;
}
}
//
/// 写入一个地址
///
///
///
///
public bool WriteHoldRegisterInt32(int address, int value)
{
return WriteHoldRegisterInt32(slaveId, address, value);
}
///
///
///
/// 从站Id
/// 地址
/// 数据
/// bool 写入成功还是失败
public bool WriteHoldRegisterInt32(byte slaveId, int address, int value)
{
return WriteHoldRegistersInt32(slaveId, address, new int[] { value });
}
//
/// 写入一个地址
///
/// 地址
/// 数据
///
public bool WriteHoldRegistersInt32(int address, int[] values)
{
return WriteHoldRegistersInt32(slaveId, address, values);
}
///
/// 写入一个地址
///
/// 从站Id
/// 地址
/// 数据
///
public bool WriteHoldRegistersInt32(byte slaveId, int address, int[] values)
{
lock (_lock)
try
{
List list = new List();
foreach (int value in values)
{
ushort[] ushortValues = ConvertIntToRegisters(value);
list.AddRange(ushortValues);
}
master.WriteRegisters(slaveId, (ushort)address, list.ToArray());
return true;
}
catch
{
return false;
}
}
#endregion
#region long INT64 操作
///
/// 读取一个地址
///
/// 地址
/// 传递:数据值
/// bool 读取成功还是失败
public bool ReadHoldRegisterInt64(int address, out long value)
{
return ReadHoldRegisterInt64(slaveId, address, out value);
}
///
/// 读取一个地址
///
/// 从站Id
/// 地址
/// 传递:数据值
/// bool 读取成功还是失败
public bool ReadHoldRegisterInt64(byte slaveId, int address, out long value)
{
bool flag = ReadHoldRegistersInt64(slaveId, address, 1, out long[] values);
value = flag ? values[0] : 0;
return flag;
}
///
/// 读取一个地址
///
/// 地址
/// int32数据的数量,不是地址数
/// 传递:数据值
/// bool 读取成功还是失败
public bool ReadHoldRegistersInt64(int address, int count, out long[] value)
{
return ReadHoldRegistersInt64(slaveId, address, count, out value);
}
///
/// 读取一个地址
///
/// 从站Id
/// 地址
/// int32数据的数量,不是地址数
/// 传递:数据值
/// bool 读取成功还是失败
public bool ReadHoldRegistersInt64(byte slaveId, int address, int count, out long[] value)
{
lock (_lock)
try
{
List valueList = new List();
ushort[] values = master.ReadHoldingRegisters(slaveId, (ushort)address, (ushort)(4 * count));
for (int i = 0; i < values.Length; i += 4)
{
valueList.Add(ConvertRegistersToLong(new ushort[] { values[i], values[i + 1], values[i + 2], values[i + 3] }));
}
value = valueList.ToArray();
return true;
}
catch
{
value = null;
return false;
}
}
//
/// 写入一个地址
///
///
///
///
public bool WriteHoldRegisterInt64(int address, long value)
{
return WriteHoldRegisterInt64(slaveId, address, value);
}
///
///
///
/// 从站Id
/// 地址
/// 数据
/// bool 写入成功还是失败
public bool WriteHoldRegisterInt64(byte slaveId, int address, long value)
{
return WriteHoldRegistersInt64(slaveId, address, new long[] { value });
}
//
/// 写入一个地址
///
/// 地址
/// 数据
///
public bool WriteHoldRegistersInt64(int address, long[] values)
{
return WriteHoldRegistersInt64(slaveId, address, values);
}
///
/// 写入一个地址
///
/// 从站Id
/// 地址
/// 数据
///
public bool WriteHoldRegistersInt64(byte slaveId, int address, long[] values)
{
lock (_lock)
try
{
List list = new List();
foreach (int value in values)
{
ushort[] ushortValues = ConvertLongToRegisters(value);
list.AddRange(ushortValues);
}
master.WriteRegisters(slaveId, (ushort)address, list.ToArray());
return true;
}
catch
{
return false;
}
}
#endregion
#region Float 32位数据操作
///
/// 读取一个地址
///
/// 地址
/// 数据
///
public bool ReadHoldRegisterFloat(int address, out float value)
{
return ReadHoldRegisterFloat(slaveId, address, out value);
}
///
/// 读取一个地址
///
/// 从站Id
/// 地址
///
///
public bool ReadHoldRegisterFloat(byte slaveId, int address, out float value)
{
bool flag = ReadHoldRegistersFloat(slaveId, address, 1, out float[] values);
value = flag ? (float)values[0] : (float)0;
return flag;
}
///
/// 读取一个地址
///
/// 地址
/// float数据的数量,不是地址数
///
///
public bool ReadHoldRegistersFloat(int address, int count, out float[] value)
{
return ReadHoldRegistersFloat(slaveId, address, count, out value);
}
///
/// 读取一个地址
///
/// 从站Id
/// 地址
/// float数据的数量,不是地址数
///
///
public bool ReadHoldRegistersFloat(byte slaveId, int address, int count, out float[] value)
{
lock (_lock)
try
{
List valueList = new List();
ushort[] values = master.ReadHoldingRegisters(slaveId, (ushort)address, (ushort)(2 * count));
for (int i = 0; i < values.Length; i += 2)
{
valueList.Add(ConvertRegistersToFloat(values));
}
value = valueList.ToArray();
return true;
}
catch
{
value = null;
return false;
}
}
///
/// 写入地址
///
/// 地址
/// 数据
///
public bool WriteHoldRegisterFloat(int address, float value)
{
return WriteHoldRegisterFloat(slaveId, address, value);
}
///
/// 写入地址
///
/// 从站Id
/// 地址
/// 数据
///
public bool WriteHoldRegisterFloat(byte slaveId, int address, float value)
{
return WriteHoldRegistersFloat(slaveId, address, new float[] { value });
}
///
/// 写入地址
///
/// 地址
/// 数据
///
public bool WriteHoldRegistersFloat(int address, float[] values)
{
return WriteHoldRegistersFloat(slaveId, address, values);
}
///
/// 写入地址
///
/// 从站Id
/// 地址
/// 数据
///
public bool WriteHoldRegistersFloat(byte slaveId, int address, float[] values)
{
lock (_lock)
try
{
List list = new List();
foreach (float value in values)
{
list.AddRange(ConvertFloatToRegisters(value));
//byte[] bytes = BitConverter.GetBytes(value);
//ushort value1 = BitConverter.ToUInt16(new byte[] { bytes[0], bytes[1] }, 0);
//ushort value2 = BitConverter.ToUInt16(new byte[] { bytes[2], bytes[3] }, 0);
//list.Add(value1);
//list.Add(value2);
}
master.WriteRegisters(slaveId, (ushort)address, list.ToArray());
return true;
}
catch
{
return false;
}
}
#endregion
#region Double 64位操作
///
/// 读取一个地址
///
/// 地址
/// 数据
///
public bool ReadHoldRegisterDouble(int address, out double value)
{
return ReadHoldRegisterDouble(slaveId, address, out value);
}
///
/// 读取一个地址
///
/// 从站Id
/// 地址
///
///
public bool ReadHoldRegisterDouble(byte slaveId, int address, out double value)
{
bool flag = ReadHoldRegistersDouble(slaveId, address, 1, out double[] values);
value = flag ? (double)values[0] : (double)0;
return flag;
}
///
/// 读取一个地址
///
/// 地址
/// float数据的数量,不是地址数
///
///
public bool ReadHoldRegistersDouble(int address, int count, out double[] value)
{
return ReadHoldRegistersDouble(slaveId, address, count, out value);
}
///
/// 读取一个地址
///
/// 从站Id
/// 地址
/// float数据的数量,不是地址数
///
///
public bool ReadHoldRegistersDouble(byte slaveId, int address, int count, out double[] value)
{
lock (_lock)
try
{
List valueList = new List();
ushort[] values = master.ReadHoldingRegisters(slaveId, (ushort)address, (ushort)(4 * count));
for (int i = 0; i < values.Length; i += 4)
{
valueList.Add(ConvertRegistersToDouble(values));
}
value = valueList.ToArray();
return true;
}
catch
{
value = null;
return false;
}
}
///
/// 写入地址
///
/// 地址
/// 数据
///
public bool WriteHoldRegisterDouble(int address, double value)
{
return WriteHoldRegisterDouble(slaveId, address, value);
}
///
/// 写入地址
///
/// 从站Id
/// 地址
/// 数据
///
public bool WriteHoldRegisterDouble(byte slaveId, int address, double value)
{
return WriteHoldRegistersDouble(slaveId, address, new double[] { value });
}
///
/// 写入地址
///
/// 地址
/// 数据
///
public bool WriteHoldRegistersDouble(int address, double[] values)
{
return WriteHoldRegistersDouble(slaveId, address, values);
}
///
/// 写入地址
///
/// 从站Id
/// 地址
/// 数据
///
public bool WriteHoldRegistersDouble(byte slaveId, int address, double[] values)
{
lock (_lock)
try
{
List list = new List();
foreach (double value in values)
{
list.AddRange(ConvertDoubleToRegisters(value));
}
master.WriteRegisters(slaveId, (ushort)address, list.ToArray());
return true;
}
catch
{
return false;
}
}
#endregion
#region 字符串操作
///
/// 读取字符串
///
/// 地址
/// 字符串总长度(不是地址长度,一个地址两个字符)
///
///
public bool ReadHoldRegisterString(int address, int length, out string str)
{
return ReadHoldRegisterString(slaveId, address, length, Encoding.ASCII, out str);
}
///
/// 读取字符串
///
/// 地址
/// 字符串总长度(不是地址长度,一个地址两个字符)
///
///
public bool ReadHoldRegisterString(int address, int length, Encoding encoding, out string str)
{
return ReadHoldRegisterString(slaveId, address, length, encoding, out str);
}
///
/// 读取字符串
///
/// 从站Id
/// 地址
/// 字符串总长度(不是地址长度,一个地址两个字符)
///
///
public bool ReadHoldRegisterString(byte slaveId, int address, int length, out string str)
{
return ReadHoldRegisterString(slaveId, address, length, Encoding.ASCII, out str);
}
///
/// 读取字符串
///
/// 从站Id
/// 地址
/// 字符串总长度(不是地址长度,一个地址两个字符)
///
///
public bool ReadHoldRegisterString(byte slaveId, int address, int length, Encoding encoding, out string str)
{
lock (_lock)
try
{
int count = length / 2 + length % 2;
ushort[] values = master.ReadHoldingRegisters(slaveId, (ushort)address, (ushort)(count));
str = ConvertRegistersToString(values, length, encoding);
return true;
}
catch
{
str = "";
return false;
}
}
///
/// 写入字符串
///
/// 地址
/// 字符串总长度(不是地址长度,一个地址两个字符)
/// 字符串内容
///
public bool WriteHoldRegisterString(int address, int length, string str)
{
return WriteHoldRegisterString(slaveId, address, length, str, Encoding.ASCII);
}
public bool WriteHoldRegisterString(int address, int length, string str, Encoding encoding)
{
return WriteHoldRegisterString(slaveId, address, length, str, encoding);
}
///
/// 写入字符串
///
/// 从站Id
/// 地址
/// 字符串总长度(不是地址长度,一个地址两个字符)
/// 字符串内容
///
public bool WriteHoldRegisterString(byte slaveId, int address, int length, string str)
{
lock (_lock)
try
{
ushort[] value = ConvertStringToRegisters(str, length, Encoding.ASCII);
master.WriteRegisters(slaveId, (ushort)address, value);
return true;
}
catch
{
return false;
}
}
///
/// 写入字符串
///
/// 从站Id
/// 地址
/// 字符串总长度(不是地址长度,一个地址两个字符)
/// 字符串内容
///
public bool WriteHoldRegisterString(byte slaveId, int address, int length, string str, Encoding encoding)
{
lock (_lock)
try
{
ushort[] value = ConvertStringToRegisters(str, length, encoding);
master.WriteRegisters(slaveId, (ushort)address, value);
return true;
}
catch
{
return false;
}
}
#endregion
#region 通用操作,线圈,输入寄存器等操作
public bool ReadCoil(ushort address, out bool value)
{
return ReadCoil(slaveId, address, out value); //there is no code for single read
}
public bool ReadCoil(byte slave, ushort address, out bool value)
{
bool flag = ReadCoils(slave, address, 1, out bool[] values);
value = flag ? values[0] : false;
return flag;
}
public bool ReadCoils(ushort address, ushort count, out bool[] values)
{
return ReadCoils(slaveId, address, count, out values);
}
public bool ReadCoils(byte slave, ushort address, ushort count, out bool[] values)
{
lock (_lock)
{
try
{
values = master.ReadCoils(slave, address, count);
return true;
}
catch
{
values = null;
return false;
}
}
}
public bool WriteCoil(ushort address, bool value)
{
return WriteCoil(slaveId, address, value);
}
public bool WriteCoil(byte slave, ushort address, bool value)
{
lock (_lock)
try
{
master.WriteCoils(slave, address, value);
return true;
}
catch
{
return false;
}
}
public bool WriteCoils(ushort address, params bool[] values)
{
return WriteCoils(slaveId, address, values);
}
public bool WriteCoils(byte slave, ushort address, params bool[] values)
{
lock (_lock)
{
try
{
master.WriteCoils(slave, address, values);
return true;
}
catch
{
return false;
}
}
}
public bool ReadInput(ushort address, ushort count, out bool value)
{
return ReadInput(slaveId, address, out value);
}
public bool ReadInput(byte slave, ushort address, out bool value)
{
bool flag = ReadInputs(slave, address, 1, out bool[] values); //there is no code for single read
value = flag ? values[0] : false;
return flag;
}
public bool ReadInputs(ushort address, ushort count, out bool[] values)
{
return ReadInputs(slaveId, address, count, out values);
}
public bool ReadInputs(byte slave, ushort address, ushort count, out bool[] values)
{
lock (_lock)
{
try
{
values = master.ReadInputs(slave, address, count);
return true;
}
catch
{
values = null;
return false;
}
}
}
public bool ReadInputRegister(ushort address, out ushort value)
{
return ReadInputRegister(slaveId, address, out value);
}
public bool ReadInputRegister(byte slave, ushort address, out ushort value)
{
bool flag = ReadInputRegisters(slave, address, 1, out ushort[] values);
value = flag ? values[0] : (ushort)0;
return flag;
}
public bool ReadInputRegisters(ushort address, ushort count, out ushort[] values)
{
return ReadInputRegisters(slaveId, address, count, out values);
}
public bool ReadInputRegisters(byte slave, ushort address, ushort count, out ushort[] values)
{
lock (_lock)
{
try
{
values = master.ReadInputRegisters(slave, address, count);
return true;
}
catch
{
values = null;
return false;
}
}
}
public bool ReadHoldingRegister(ushort address, out ushort value)
{
return ReadHoldingRegister(slaveId, address, out value);
}
public bool ReadHoldingRegister(byte slave, ushort address, out ushort value)
{
bool flag = ReadHoldingRegisters(slave, address, 1, out ushort[] values);
value = flag ? values[0] : (ushort)0;
return flag;
}
public bool ReadHoldingRegisters(ushort address, ushort count, out ushort[] values)
{
return ReadHoldingRegisters(slaveId, address, count, out values);
}
public bool ReadHoldingRegisters(byte slave, ushort address, ushort count, out ushort[] values)
{
lock (_lock)
try
{
values = master.ReadHoldingRegisters(slave, address, count);
return true;
}
catch
{
values = null;
return false;
}
}
public bool WriteRegister(ushort address, ushort value)
{
return WriteRegister(slaveId, address, value);
}
public bool WriteRegister(byte slave, ushort address, ushort value)
{
lock (_lock)
try
{
master.WriteRegister(slave, address, value);
return true;
}
catch
{
return false;
}
}
public bool WriteRegisters(ushort address, params ushort[] values)
{
return WriteRegisters(slaveId, address, values);
}
public bool WriteRegisters(byte slave, ushort address, params ushort[] values)
{
lock (_lock)
try
{
master.WriteRegisters(slave, address, values);
return true;
}
catch
{
return false;
}
}
#endregion
public void Dispose()
{
master.OnSended -= Master_OnSended;
master.OnRecived -= Master_OnRecived;
master.Dispose();
}
#region 数据转换功能
#region PLC寄存器与字符串数据转换
public static string ConvertRegistersToString(ushort[] registers, int stringLength, Encoding encoding)
{
byte[] result = new byte[stringLength];
byte[] registerResult = new byte[2];
for (int i = 0; i < stringLength / 2; i++)
{
registerResult = BitConverter.GetBytes(registers[i]);
result[i * 2] = registerResult[0];
result[i * 2 + 1] = registerResult[1];
}
return encoding.GetString(result).Trim('\0').Trim();
}
///
///
///
///
/// 字符串长度
///
public static ushort[] ConvertStringToRegisters(string str, int count, Encoding encoding)
{
//需要多少地址
int addressCount = count / 2 + count % 2;
//这些地址共有多少字节
byte[] bytesList = new byte[addressCount * 2];
//将字符串拆成字节数组
byte[] bytes = encoding.GetBytes(str);
//依次放入byteList中
for (int i = 0; i < bytesList.Length; i++)
{
//要考虑数组越界的情况
if (i >= bytes.Length)
{
bytesList[i] = 0x00;
}
else
{
bytesList[i] = bytes[i];
}
}
//封装ushort
List shortList = new List();
for (int i = 0; i < bytesList.Length; i += 2)
{
//将字节数组转为int存入list
shortList.Add(BitConverter.ToUInt16(new byte[] { bytesList[i], bytesList[i + 1] }, 0));
}
return shortList.ToArray();
}
#endregion
#region PLC寄存器与Double数据转换
public static double ConvertRegistersToDouble(ushort[] registers)
{
if (registers.Length != 4)
throw new ArgumentException("Input Array length invalid - Array langth must be '4'");
ushort highRegister = registers[3];
ushort highLowRegister = registers[2];
ushort lowHighRegister = registers[1];
ushort lowRegister = registers[0];
byte[] highRegisterBytes = BitConverter.GetBytes(highRegister);
byte[] highLowRegisterBytes = BitConverter.GetBytes(highLowRegister);
byte[] lowHighRegisterBytes = BitConverter.GetBytes(lowHighRegister);
byte[] lowRegisterBytes = BitConverter.GetBytes(lowRegister);
byte[] longBytes = {
lowRegisterBytes[0],
lowRegisterBytes[1],
lowHighRegisterBytes[0],
lowHighRegisterBytes[1],
highLowRegisterBytes[0],
highLowRegisterBytes[1],
highRegisterBytes[0],
highRegisterBytes[1]
};
return BitConverter.ToDouble(longBytes, 0);
}
public static ushort[] ConvertDoubleToRegisters(double doubleValue)
{
byte[] doubleBytes = BitConverter.GetBytes(doubleValue);
byte[] highRegisterBytes = { doubleBytes[6], doubleBytes[7] };
byte[] highLowRegisterBytes = { doubleBytes[4], doubleBytes[5] };
byte[] lowHighRegisterBytes = { doubleBytes[2], doubleBytes[3] };
byte[] lowRegisterBytes = { doubleBytes[0], doubleBytes[1] };
ushort[] returnValue =
{
BitConverter.ToUInt16(lowRegisterBytes,0),
BitConverter.ToUInt16(lowHighRegisterBytes,0),
BitConverter.ToUInt16(highLowRegisterBytes,0),
BitConverter.ToUInt16(highRegisterBytes,0)
};
return returnValue;
}
#endregion
#region PLC寄存器与INT64数据转换
public static float ConvertRegistersToFloat(ushort[] registers)
{
if (registers.Length != 2)
throw new ArgumentException("Input Array length invalid - Array langth must be '2'");
ushort highRegister = registers[1];
ushort lowRegister = registers[0];
byte[] highRegisterBytes = BitConverter.GetBytes(highRegister);
byte[] lowRegisterBytes = BitConverter.GetBytes(lowRegister);
byte[] floatBytes = {
lowRegisterBytes[0],
lowRegisterBytes[1],
highRegisterBytes[0],
highRegisterBytes[1]
};
return BitConverter.ToSingle(floatBytes, 0);
}
public static ushort[] ConvertFloatToRegisters(float floatValue)
{
byte[] floatBytes = BitConverter.GetBytes(floatValue);
byte[] highRegisterBytes = { floatBytes[2], floatBytes[3] };
byte[] lowRegisterBytes = { floatBytes[0], floatBytes[1] };
ushort[] returnValue = { BitConverter.ToUInt16(lowRegisterBytes, 0), BitConverter.ToUInt16(highRegisterBytes, 0) };
return returnValue;
}
#endregion
#region PLC寄存器与INT64数据转换
public static long ConvertRegistersToLong(ushort[] registers)
{
if (registers.Length != 4)
throw new ArgumentException("Input Array length invalid - Array langth must be '4'");
ushort highRegister = registers[3];
ushort highLowRegister = registers[2];
ushort lowHighRegister = registers[1];
ushort lowRegister = registers[0];
byte[] highRegisterBytes = BitConverter.GetBytes(highRegister);
byte[] highLowRegisterBytes = BitConverter.GetBytes(highLowRegister);
byte[] lowHighRegisterBytes = BitConverter.GetBytes(lowHighRegister);
byte[] lowRegisterBytes = BitConverter.GetBytes(lowRegister);
byte[] longBytes = {
lowRegisterBytes[0],
lowRegisterBytes[1],
lowHighRegisterBytes[0],
lowHighRegisterBytes[1],
highLowRegisterBytes[0],
highLowRegisterBytes[1],
highRegisterBytes[0],
highRegisterBytes[1]
};
return BitConverter.ToInt64(longBytes, 0);
}
public static ushort[] ConvertLongToRegisters(long longValue)
{
byte[] longBytes = BitConverter.GetBytes(longValue);
byte[] highRegisterBytes = { longBytes[6], longBytes[7] };
byte[] highLowRegisterBytes = { longBytes[4], longBytes[5] };
byte[] lowHighRegisterBytes = { longBytes[2], longBytes[3] };
byte[] lowRegisterBytes = { longBytes[0], longBytes[1] };
ushort[] returnValue =
{
BitConverter.ToUInt16(lowRegisterBytes,0),
BitConverter.ToUInt16(lowHighRegisterBytes,0),
BitConverter.ToUInt16(highLowRegisterBytes,0),
BitConverter.ToUInt16(highRegisterBytes,0)
};
return returnValue;
}
#endregion
#region PLC寄存器与INT32数据转换
public static int ConvertRegistersToInt(ushort[] registers)
{
if (registers.Length != 2)
throw new ArgumentException("Input Array length invalid - Array langth must be '2'");
ushort highRegister = registers[1];
ushort lowRegister = registers[0];
byte[] highRegisterBytes = BitConverter.GetBytes(highRegister);
byte[] lowRegisterBytes = BitConverter.GetBytes(lowRegister);
byte[] doubleBytes = {
lowRegisterBytes[0],
lowRegisterBytes[1],
highRegisterBytes[0],
highRegisterBytes[1]
};
return BitConverter.ToInt32(doubleBytes, 0);
}
public static ushort[] ConvertIntToRegisters(int intValue)
{
byte[] doubleBytes = BitConverter.GetBytes(intValue);
byte[] highRegisterBytes = { doubleBytes[2], doubleBytes[3] };
byte[] lowRegisterBytes = { doubleBytes[0], doubleBytes[1] };
ushort[] returnValue = { BitConverter.ToUInt16(lowRegisterBytes, 0), BitConverter.ToUInt16(highRegisterBytes, 0) };
return returnValue;
}
#endregion
#endregion
private void Master_OnRecived(byte[] bytes, string hexString)
{
OnRecived?.Invoke(bytes, hexString);
}
private void Master_OnSended(byte[] bytes, string hexString)
{
OnSended?.Invoke(bytes, hexString);
}
}
}