Я использую 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]);
}
}
BitConverter.ToSingle()
для перевода их в число с плавающей запятой. Я предполагаю, что вы уже делаете подобное; Можете ли вы добавить какой-нибудь реальный нерабочий код, который вы используете, к своему вопросу? - person sellotape   schedule 23.11.2018BitConvertor.ToSingle()
, но он будет объединять два последовательных регистра, чего я не хочу. Я просто хочу значение одного регистра в float. Может ли перенастройка регистров в канале из программного обеспечения автоматизации на 32-разрядные с 16-разрядных получить меня куда-нибудь? - person Samrat Matte   schedule 23.11.2018