Я использую NModbus4 для чтения 16-битного регистра, в котором уже есть значение с плавающей запятой.Я получаю это значение с плавающей точкой непосредственно из соответствующего программного обеспечения с регистрами, настроенными для этих значений с плавающей точкой.Эта конфигурация регистра помогает мне получить записанное значение в моей консольной программе, используя NModbus4.
Вопрос довольно прост.Nmodbus возвращает ushort[]
для регистров хранения, и я хочу получить значение с плавающей запятой при чтении из ответа.
Да, я попытался прочитать два 16-разрядных регистра и объединить их, чтобы получить плавающее значение (32-разрядное), и НЕТ, я не получаю желаемых результатов.
Например, 2.3e-007
приводит к 0
, а число больше ushort
, тип данных приводит к 32767
.Может быть, мне нужно что-то изменить в библиотеке (NModbus4).Просто какой-нибудь намек поможет.Пожалуйста, кто-нибудь может мне помочь?
Вот мой фрагмент кода:
TcpClient masterTcpClient = new TcpClient(address.ToString(), portNo);
ModbusIpMaster master = ModbusIpMaster.CreateIp(masterTcpClient);//Created master
ushort[] inputs = null;
inputs = master.ReadHoldingRegisters(slaveId, startAddress, numInputs);//Read Registers
GetRegistersByNModbus(inputs, startAddress);//Convert registers to float
private static void GetRegistersByNModbus(ushort[] inputs, ushort startAddress)
{
List<float> floatList = new List<float>();
for (int i = 0; i < inputs.Length;)
{
float temp = ModbusUtility.GetSingle(inputs[i++], inputs[i++]);
floatList.Add(temp);
}
float[] floatArray = floatList.ToArray();
int startReg = int.Parse(startAddress.ToString());
for (int i = 0, j = startReg; i < floatArray.Length; i++, startAddress += 2)
{
Console.WriteLine("Register {0}={1}", startAddress, floatArray[i]);
}
}