2015-03-13 125 views
0

我有一个MOXA Modbus TCP模块(M-4210与NA-4010网络模块相结合,也有一些其他模块连接),可用作2通道模拟输出,每个模拟输出的电压范围为0到10伏。如何从此Modbus地址获取正确的值?

在我的C#应用​​程序中,我需要获取这些输出的当前值,这并不像我对整个Modbus的新东西那么简单。

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

要从头开始,这是此模块中的两个通道(从MOXA ioAdmin工具采取)的MODBUS设置:

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

我似乎是在正确的轨道上,但我不太明白的偏移和如何分离的信道当值回来。如果有人能够对此提出一些看法,那就太好了!

回答

1

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

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

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

0

尝试读取保持寄存器2047和,看看你得到你正在寻找...

值虽然好像你是1个字节,而不是2转移之后是值那么你可能需要阅读2047并要求2个寄存器并自己进行转换。很奇怪。