-
ПЛК 110, NModBus
Добрый день.
По форуму искал, но именно такого вопроса не нашел.
Есть 110ый, планирую его опрашивать с использованием приложения, написанного на шарпе с использованием библиотеки NModbus.
Пока играюсь с эмулятором Modbus slave - устройства: задаю разные значения и считываю их из своего приложения. Например, так:
System.String ipAddress = "127.0.0.1";
System.Int32 tcpPort = 502;
TcpClient tcpClient = new TcpClient();
tcpClient.Connect(ipAddress, tcpPort);
Modbus.Device.ModbusIpMaster master = Modbus.Device.ModbusIpMaster.CreateIp(tcpClient);
System.Byte slaveID = 1;
System.UInt16 startAddress = 0;
System.UInt16 numOfPoints = 2;
System.UInt16[] holdingRegister = master.ReadHoldingRegisters(slaveID, startAddress, numOfPoints);
Вот описание функции ReadHoldingRegisters: ushort[] ReadHoldingRegisters(byte slaveAddress, ushort startAddress, ushort numberOfPoints)
Откуда видим тип возвращаемого значения - ushort. А если у меня в этот регистр пишется дробное отрицательное число? Как быть?
-
Modbus.Utility.ModbusUtility:
Код:
/// <summary>
/// Converts two UInt16 values into a IEEE 32 floating point format
/// </summary>
/// <param name="highOrderValue">High order ushort value</param>
/// <param name="lowOrderValue">Low order ushort value</param>
/// <returns>IEEE 32 floating point value</returns>
public static float GetSingle(ushort highOrderValue, ushort lowOrderValue)
{
return BitConverter.ToSingle(BitConverter.GetBytes(lowOrderValue).Concat(BitConverter.GetBytes(highOrderValue)).ToArray(), 0);
}
Ну и вообще BitConverter.
-
Yegor, огромное спасибо за указание на готовую функцию!
Про BitConverter знаю, уже хотел писать свой велосипед, используя его.
Остался следующий вопрос: по спецификации ModBus каждый HoldingRegister содержит 2 байта. Зачем тогда в Modbus.Utility.ModbusUtility.GetSingle нужно 2 ushort параметра (highOrderValue, lowOrderValue)? На случай особо больших значений, которые мне может понадобиться размещать в двух HoldingRegister?
-
Потому что «дробные» это 4 байта, а не 2, если речь о тех дробных, что используются повсеместно (real в кодесисе, float в шарпе).
-
Вложений: 1