代码之家  ›  专栏  ›  技术社区  ›  Rob

如何从这个Modbus地址获得正确的值?

  •  0
  • Rob  · 技术社区  · 11 年前

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

    在我的C#应用程序中,我需要获取这些输出的当前值,这并不像我对Modbus完全陌生那么容易。

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

    从一开始,以下是该模块中两个通道的modbus设置(取自MOXA ioAdmin Tool):

    enter image description here

    地址:

    enter image description here

    下面是另一张来自网络界面的截图:

    enter image description here

    所以我试着这样读这些值:

    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

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

    2 回复  |  直到 11 年前
        1
  •  2
  •   Ronaldo    11 年前

    您的客户端是否正确处理Modbus端接?Modbus是big endian。

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

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

        2
  •  0
  •   Kevin Herron    11 年前

    试着阅读保持寄存器2047,看看你是否得到了你想要的值。。。

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