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