如何使用c#从modbus RTU rs323读取浮点数据

时间:2018-05-21 10:43:40

标签: c# .net

i'm expected like this我正在运行以下代码。它运行成功,但没有在浮点中显示准确值。 我需要处理float数据类型的内存寄存器 请任何人都可以告诉我如何从modbus中获得价值 my output is that 我有一台PLC通过Modbus RTU(RS485)连接到PC。在PLC和PC之间我有一个RS485-RS232-USB转换器。

mb.Open(lstPorts.SelectedItem.ToString(), 
        Convert.ToInt32(lstBaudrate.SelectedItem.ToString()),
        8, 
        Parity.None, 
        StopBits.One

  case "Float":
                    for (int i = 0; i < enter code here(pollLength / 2); i++)
                    {
                        int intValue = (int)values[2 * i];
                        intValue <<= 16;
                        intValue += (int)values[2 * i + 1];
                        itemString = "[" + Convert.ToString(pollStart + 2 * i + 40001) + "] , MB[" +
                            Convert.ToString(pollStart + 2 * i) + "] = " +
                            (BitConverter.ToSingle(BitConverter.GetBytes(intValue), 0)).ToString();
                        DoGUIUpdate(itemString);
                    }

1 个答案:

答案 0 :(得分:0)

有两种方法可以将WORD / DWORD转换为FLOAT。

第一个是考虑它已经是你收到的浮动值,所以应用一些转换,因为你做得很好。因此,如果它是错误的,您可以尝试反转第一个和第二个字节:

int intValue = (int)values[2 * i] + (int)values[2 * i + 1]<<16;

第二个选项是查看传感器的 max min 值,以及是否不应将其视为比例转换。即:intValue * (max - min)/OxFFFFFFFF + min。您只能从PLC的文档中知道...

我通常不信任的另一点是RS485-RS232-USB转换器。当转换器无法正确检索数据包时,我发现了很多情况。这意味着它可以以不同于PLC传输的数据刷新数据。

我建议您探索另一种读取数据的方法,例如一些流数据。 (我不知道C#的方式来做到这一点)。

相关问题