如何从此 Modbus 地址获取正确的值?

How to get the correct values from this Modbus address?

我有一个 MOXA Modbus TCP 模块(M-4210 与 NA-4010 网络模块组合,还连接了一些其他模块)作为 2 通道模拟输出,每个电压从 0 到 10伏特。

在我的 C# 应用程序中,我需要获取这些输出的当前值,这并不容易,因为我对整个 Modbus 很陌生。

在我的代码中,我已经有了一个可以正常工作的 modbus tcp 客户端,我通过读取和写入另一个数字输出模块的单个线圈来测试它。然而,模拟输出模块似乎使用寄存器而不是线圈。

从头开始,这些是该模块中两个通道的 modbus 设置(取自 MOXA ioAdmin 工具):

和地址:

这是网络界面的另一个屏幕截图:

所以我尝试读取这样的值:

ModbusClient c = new ModbusClient();
c.Connect("172.17.6.15", 502);
int[] r = c.ReadHoldingRegisters(2048, 1);
for (int i = 0; i < r.Length; i++)
{
    textBox1.Text += r[i].ToString() + System.Environment.NewLine;
}

这段代码returns一个值,变化如下:

我似乎走对了路,但是我不太了解偏移量以及当值返回时如何分离通道。如果有人能对此有所了解,那就太好了,在此先感谢!

尝试阅读 Holding Register 2047 并查看是否获得了您要查找的值...

虽然看起来您要查找的值移动了 1 个字节,而不是 2 个字节,因此您可能需要读取 2047 并请求 2 个寄存器并自己进行移位。很奇怪。

您的客户端是否正确处理了 Modbus 字节顺序? Modbus 是大端。

1140 为 0x474,29696 为 0x7400。 1139 是 0x473,29440 是 0x7300。我可以看到一个模式。看来您的 Modbus 客户端正在将 LSB 设置为 0,并通过将接收到的 LSB 向左移动来获取 MSB。

尝试将通道的值更改为 1141,您可能会在客户端中读取到 29952。这将证实我的怀疑。