PDA

Просмотр полной версии : ПЛК 110, NModBus



sgmj
03.02.2015, 13:13
Добрый день.
По форуму искал, но именно такого вопроса не нашел.

Есть 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. А если у меня в этот регистр пишется дробное отрицательное число? Как быть?

Yegor
03.02.2015, 13:38
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(lowOrd erValue).Concat(BitConverter.GetBytes(highOrderVal ue)).ToArray(), 0);
} Ну и вообще BitConverter (https://msdn.microsoft.com/en-us/library/system.bitconverter(v=vs.110).aspx).

sgmj
03.02.2015, 14:29
Yegor, огромное спасибо за указание на готовую функцию!
Про BitConverter знаю, уже хотел писать свой велосипед, используя его.

Остался следующий вопрос: по спецификации ModBus каждый HoldingRegister содержит 2 байта. Зачем тогда в Modbus.Utility.ModbusUtility.GetSingle нужно 2 ushort параметра (highOrderValue, lowOrderValue)? На случай особо больших значений, которые мне может понадобиться размещать в двух HoldingRegister?

Yegor
03.02.2015, 14:41
Потому что «дробные» это 4 байта, а не 2, если речь о тех дробных, что используются повсеместно (real в кодесисе, float в шарпе).

BETEP
04.02.2015, 11:12
пример из
ftp://ftp.icpdas.com/pub/cd/8000cd/napdos/modbus/nmodbus/demo/