История позади: Используя QModbusTcpClient
Я пытаюсь прочитать содержимое с устройства, подключенного к Modbus/TCP
сеть. Для этого я написал программу для Windows (протестированную на 7 и 10) на Qt C ++ (Qt версия 5.7.0), которая по сути вызывает QModbusClient::sendReadRequest
с QModbusDataUnit::QModbusDataUnit(RegisterType type, int address, quint16 size)
в качестве параметра, где тип является HoldingRegisters
, адрес равно 1000
(может быть другой адрес, это не важно для этого конкретного вопроса) и размер длина желаемых данных, которые будут считаны с устройства.
Проблема: Все хорошо работает когда size
меньше или равно 63
регистры. Каждая попытка выйти за пределы этого значения приводит к ошибке, которая зависит от устройства, с которым я тестирую программу, но обычно говорит о недопустимом запросе.
тесты:
Modbus/TCP
size
<знак равно 63
-> хорошо; size
>63
-> ошибкаModpoll
с другой стороны, позволяет мне прочитать блок данных с тех же устройств и симулятора с size
лучше чем 63
регистрыНекоторые исследования: Вот утверждается, что ограничение действительно есть, но оно составляет 256 байт, что равно 128 16-битным регистрам, другими словами — намного выше предела моих попыток чтения.
Мое подозрение: Похоже, что QModbusTcpClient
не позволяет читать больше, чем 63
регистры.
Вопрос: Кто-нибудь сталкивался с такой проблемой, используя QModbusTcpClient
и есть ли способ преодолеть это ограничение, кроме чтения данных за два прохода?
Что ж, решение, которое сработало в моем случае, заключается в том, чтобы взять дело в свои руки и написать свой собственный класс для связи с устройствами Modbus. Класс наследуется от QObject
Таким образом, система слотов сигналов все еще в распоряжении, однако фактическая функциональность основана на winsock2.h
, Вот это пример программы, которая делает то, что мне нужно. Другие полезные источники, на которые я наткнулся, это эта книга, пример программы из ссылки Winsocket 2 и, конечно, Спецификация Modbus. Оказалось, что это не так сложно, и с небольшой помощью из источников, которые я упомянул, я смог решить проблему, с которой столкнулся.
Других решений пока нет …