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

时间:2015-03-13 09:32:21

标签: c# offset modbus addressing modbus-tcp

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

答案 0 :(得分:1)

您的客户端是否正确处理Modbus endianess? Modbus是大端。

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

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

答案 1 :(得分:0)

尝试阅读保留寄存器2047,看看你是否得到了你正在寻找的价值......

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