QModbusTcpClient数据大小

时间:2016-11-20 23:22:59

标签: c++ windows qt5 modbus-tcp

背后的故事:使用QModbusTcpClient我正在尝试从连接到Modbus/TCP网络的设备上读取内容。为此,我在Qt C ++(Qt版本5.7.0)中编写了一个Windows程序(在7和10上测试),它基本上以QModbusClient::sendReadRequest作为参数调用QModbusDataUnit::QModbusDataUnit(RegisterType type, int address, quint16 size),其中 type < / em>是HoldingRegisters地址等于1000(可能是另一个地址,对于此特定问题并不重要), size 是要从设备读取的所需数据的长度。

问题:size小于或等于63个寄存器时,一切正常。每次尝试超出此值都会导致错误,这取决于我正在测试程序的设备,但通常会说无效请求。

试验:

  1. 我使用多个真实设备对其进行了测试,并使用Modbus/TCP simulator获得了相同的结果,即size&lt; = 63 - &gt;好的; size&gt; 63 - &gt;错误
  2. 来自另一方的
  3. Modpoll允许我从size大于63个寄存器的相同设备和模拟器中读取数据块
  4. 一些研究: Here据说,确实有一个限制,但它是256个字节,相当于128个16位寄存器,换句话说 - 以上方式我阅读尝试的极限。

    我的怀疑QModbusTcpClient似乎不允许阅读超过63个寄存器。

    问题:有没有人使用QModbusTcpClient遇到过这样的问题,除了在两次传递中读取数据外,有没有办法克服这个限制?

1 个答案:

答案 0 :(得分:0)

嗯,在我的情况下工作的解决方案就是把这个问题拿在手里然后编写我自己的类来与Modbus设备进行通信。该类继承自QObject,因此信号槽系统仍可使用,但实际功能基于winsock2.hHere是一个示例程序,可以满足我的需求。我偶然发现的另一个有用的来源是this book,来自winsocket 2引用的example program,当然还有Modbus specification。事实证明,这并不是那么困难,并且从我提到的来源获得一些帮助后,我能够解决我已经解决的问题。