【问题标题】:How to get the correct values from this Modbus address?如何从此 Modbus 地址获取正确的值?
【发布时间】:2015-05-15 17:37:51
【问题描述】:

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

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

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

首先,这些是此模块中两个通道的 modbus 设置(取自 MOXA ioAdmin Tool):

和地址:

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

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

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;
}

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

  • 当通道#0设置为1139的(原始)值时,返回的int值为29440

  • 当通道#0设置为1140时,返回值为29696

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

【问题讨论】:

    标签: c# offset modbus addressing modbus-tcp


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      尝试阅读Holding Register 2047,看看你是否得到了你正在寻找的值......

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

      【讨论】:

        猜你喜欢
        • 2015-12-19
        • 2014-12-21
        • 1970-01-01
        • 1970-01-01
        • 2015-04-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-27
        相关资源
        最近更新 更多