2016-11-20 7 views
0

История: Использование QModbusTcpClient Я пытаюсь прочитать содержимое с устройства, подключенного к сети Modbus/TCP. Для этой цели я написал программу для Windows (проверено на 7 и 10) в Qt C++ (Qt версии 5.7.0), который по существу называет QModbusClient::sendReadRequest с QModbusDataUnit::QModbusDataUnit(RegisterType type, int address, quint16 size) в качестве параметра, где тип является HoldingRegisters, адрес приравнивает к 1000 (может быть другим адресом, это не важно для данной конкретной проблемы) и размер - это длина требуемых данных, которые необходимо считывать с устройства.Ограничение в размере данных QModbusTcpClient

Вопрос: Все работает хорошо, когда size меньше или равна 63 регистров. Каждая попытка выйти за пределы этого значения приводит к ошибке, которая зависит от устройства, с которым я тестирую программу, но обычно говорит недействительный запрос.

Тесты:

  1. Я испытал это с несколькими устройствами и реальными с Modbus/TCP simulator получения тех же результатов, т.е. size < = 63 -> в порядке; size> 63 -> ошибка
  2. Modpoll с другой стороны позволяет мне читать порцию данных из одних и тех же устройств и симулятора с size больше, чем 63 регистров

Некоторые исследования:Here говорится, что на самом деле существует ограничение, но это 256 байт, что равно 128 16-разрядным регистрам, другими словами - путь выше предела моих попыток чтения.

Мои подозрения: Похоже, что QModbusTcpClient не позволяет чтение более чем 63 регистров.

Вопрос: Кто-нибудь испытал такую ​​проблему, используя QModbusTcpClient и есть ли способ преодолеть это ограничение, помимо чтения данных на двух проходах?

ответ

0

Ну, решение, которое работало в моем случае, - взять дело в свои руки и написать собственный класс для общения с устройствами Modbus. Класс наследуется от QObject, поэтому система сигнальных слотов все еще находится в распоряжении, однако фактическая функциональность основана на winsock2.h. Here - образец программы, которая выполняет работу за то, что мне нужно. Другими полезными источниками, которые я наткнулся, являются this book, example program из ссылки winsocket 2 и, конечно, Modbus specification. Оказалось, что это не так сложно и с небольшой помощью из источников, о которых я упоминал, я смог решить проблему, которая у меня была.