我应该如何访问这些 (Enron Modbus) 寄存器?
How should I access these (Enron Modbus) registers?
在使用 OMNI Flow 计算机时,我 运行 遇到了一个我无法真正解决问题的问题。
我正在尝试使用 NModbus
.
访问 32 bits IEEE floating points number
我如何获得一个号码:
- 使用
ReadHoldingRegisters(byte slaveAddress, ushort StartAddress, ushort numberOfPoints)
和 numberOfPoints = 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);
}
- 在我的代码中使用这个浮点数。
我已经尝试过这种方法,它似乎适用于我读取的大部分数据,但现在我在读取点时遇到了问题(我得到了意想不到的值,但无法确定原因)并且想确保这不是由于寻址;积分是这样 运行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。
我感觉寻址中存在偏移,但我没想到会这样。
在使用 OMNI Flow 计算机时,我 运行 遇到了一个我无法真正解决问题的问题。
我正在尝试使用 NModbus
.
32 bits IEEE floating points number
我如何获得一个号码:
- 使用
ReadHoldingRegisters(byte slaveAddress, ushort StartAddress, ushort numberOfPoints)
和numberOfPoints = 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);
}
- 在我的代码中使用这个浮点数。
我已经尝试过这种方法,它似乎适用于我读取的大部分数据,但现在我在读取点时遇到了问题(我得到了意想不到的值,但无法确定原因)并且想确保这不是由于寻址;积分是这样 运行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。
我感觉寻址中存在偏移,但我没想到会这样。