Выполнить каждый ответ QTModbus в другом потоке - PullRequest
1 голос
/ 29 января 2020

Я занимаюсь разработкой приложения Modbus. Отправка запросов на чтение, как этот немного медленный.

Я хотел бы выполнить каждый readReady в своем собственном потоке. Как я мог это сделать? Или, может быть, это «плохая практика»?

Я пытался использовать QtConcurrent :: run в readReady слоте, но это не очень помогает.

Ответы [ 2 ]

1 голос
/ 29 января 2020

При использовании Modbus RTU по последовательному соединению для отправки запроса сначала нужно дождаться получения ответа от предыдущего.

Вы не можете отправлять несколько запросов одновременно, последовательное соединение не может управлять конфликтами, которые это генерирует.

Было бы возможно использовать Modbus / TCP, пока ведомые устройства могут обрабатывать очередь запросов , но не все устройства могут это сделать.

1 голос
/ 29 января 2020

Не думаю, что проблема связана с readReady().

Как только QModbusClient::sendReadRequest() завершено, вы вызываете обратный вызов readReady(). Вы не можете go быстрее, чем время, необходимое для запроса до конца sh.

Если мы посмотрим на QModbusClient документацию , мы можем увидеть это примечание:

Примечание: QModbusClient ставит в очередь запросы, которые он получает. Количество запросов, выполняемых параллельно, зависит от протокола. Например, протокол HTTP на настольных платформах выдает 6 запросов параллельно для одной комбинации хост / порт.

Как вы упомянули, у вас "много запросов одновременно" это может объяснить вашу проблему.

На самом деле я считаю, что очередь, которую вы заметили, касается не вызовов readyRead(), а стороны QModbusClient.

Использование многопоточности для обратные вызовы не помогли бы, так как вы не можете «поставить телегу впереди лошади»:)

...