我有一个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
我似乎走在正确的轨道上,但我不太了解偏移量以及在价值回归时如何分离频道。如果有人能够对此有所了解,那将是非常好的,在此先感谢!
答案 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个寄存器并自己进行移位。很奇怪。