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);
}
答案 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#的方式来做到这一点)。