如果我使用NModbus4在其中获取浮点值,如何读取16位寄存器

时间:2018-11-23 06:04:18

标签: c# modbus-tcp

我正在使用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]);
        }
    }

0 个答案:

没有答案