0

我有一个 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

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

4

2 回答 2

2

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

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

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

于 2015-03-23T11:28:50.840 回答
0

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

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

于 2015-03-14T13:29:37.973 回答