0

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

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

测试:

  1. 我已经用几个真实的设备和一个Modbus/TCP 模拟器测试了这个,得到了相同的结果,即size<= 63-> 好的;size> 63-> 错误
  2. Modpoll从另一边,我可以从相同的设备和模拟器中读取size大于63寄存器的数据块

一些研究: 这里说,确实有一个限制,但它是 256 字节,相当于 128 个 16 位寄存器,换句话说 - 远高于我的读取尝试限制。

我的怀疑:似乎QModbusTcpClient不允许读取多个63寄存器。

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

4

1 回答 1

0

好吧,在我的案例中有效的解决方案是将问题掌握在我手中并编写我自己的类来与 Modbus 设备进行通信。该类继承自QObject,因此信号槽系统仍然可以使用,但实际功能基于winsock2.h. 是一个示例程序,它可以完成我需要的工作。我偶然发现的另一个有用的资源是这本书,来自 winsocket 2 参考的示例程序,当然还有Modbus 规范。事实证明,这并不是那么困难,并且在我提到的来源的一点帮助下,我能够解决我遇到的问题。

于 2016-11-22T04:41:00.507 回答