我应该如何访问这些 (Enron Modbus) 寄存器?

How should I access these (Enron Modbus) registers?

在使用 OMNI Flow 计算机时,我 运行 遇到了一个我无法真正解决问题的问题。 我正在尝试使用 NModbus.

访问 32 bits IEEE floating points number

我如何获得一个号码:

  1. 使用 ReadHoldingRegisters(byte slaveAddress, ushort StartAddress, ushort numberOfPoints)numberOfPoints = 2 读取 2 个寄存器。
  2. 像这样将我读取的 2 个 ushorts 转换为 1 个浮点数:
    private static float ToFloat(ushort[] data)
        {
            var bArray = new byte[4];
            BitConverter.GetBytes(data[0]).CopyTo(bArray, 2);
            BitConverter.GetBytes(data[1]).CopyTo(bArray, 0);
            return BitConverter.ToSingle(bArray, 0);
        }
  1. 在我的代码中使用这个浮点数。

我已经尝试过这种方法,它似乎适用于我读取的大部分数据,但现在我在读取点时遇到了问题(我得到了意想不到的值,但无法确定原因)并且想确保这不是由于寻址;积分是这样 运行ged :



其中一个地址相当于32位信息,而通常会使用2个不同的寄存器。我的设备有一个名为 Modicon modbus compatible 的参数,这让我研究了它默认使用的协议类型,结果发现它是 Enron Modbus.



根据这一点文档(特别是下框)

The starting address of the variable still applies

这意味着如果我切换到通常的 Modicon Modbus,我将访问 2 个寄存器而只使用一个点?例如,如果我想读取前两个浮点数,我需要读取从地址 8080 开始的 2 个寄存器,然后再读取 2 个从地址 8081 开始的寄存器。通常我会从地址 8082 开始读取第二个点。

我应该如何访问这些寄存器?此外,即使文档另有说明,寻址中是否存在偏移量?如果在使用 NModbus 时,我要使用 ReadMultipleRegisters 方法读取 2 个寄存器,它会 return 正确的值吗?

经过几次测试后,我注意到我可以通过使用 ReadHoldingRegisters(byte slaveAddress, ushort address, ushort numberOfPoints)numberOfPoints = 2 从寄存器中读取正确的值,而如果我尝试使用 [=12= 则出现错误] 因为我的设备发回 8 个字节的数据而不是 4 个字节。这与说明

的文档一致

You cannot read or write a partial variable

而且由于每个浮点数都是 32 位寄存器的形式,所以我不能读取少于 2 个 ushorts。

此外,我发现,要从特定寄存器(无论是浮点数还是布尔值)读取一个值,我必须使用一个减 1 的地址。例如,如果我想读取该值在寄存器 8080 中,在我的代码中我实际上应该读取寄存器 8079。

我感觉寻址中存在偏移,但我没想到会这样。