Как прочитать 16-битный регистр, если я получаю значение с плавающей запятой в нем, используя NModbus4 - PullRequest
0 голосов
/ 23 ноября 2018

Я использую 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]);
        }
    }
...