Оптимизировать запросы Modbus - PullRequest
       16

Оптимизировать запросы Modbus

0 голосов
/ 11 сентября 2018

У меня есть QMap<int, MyData>, где ключ - это адрес регистра Modbus, а MyData - моя собственная структура, содержащая некоторую информацию, не важную для этого вопроса.

Набор ключей может быть довольно большим(скажем 2000 значений) с некоторыми из них закрывают друг друга.Например:

1, 2, 3, 4, 7, 23, 24, 25, 40, 41, 43, ...

Моя цель - получить QList<QPair<int,int>>, где элементы класса QPair представляют собой нижнюю и верхнюю границы каждого запроса Modbus, который я отправлю.Этот список должен быть оптимизирован для объединения последовательных значений или значений, «очень близких» друг другу.Это должно уменьшить количество запросов Modbus с компромиссом с количеством запрошенных данных.

В приведенном выше примере я хотел бы:

[1, 7], [23, 25], [40, 43]  

Я собираюсь установитьпара ограничений, чтобы дать вес для каждого запроса.Запрос данных с адреса с 1 по 7 стоит от 1 до 4, а затем только 7, но это не так, если 7 было 16 ... Еще одним ограничением является максимальная длина одного запроса: даже если есть много последовательныхадреса, которые они должны быть разбиты на сегменты длиной N.

Я спрашиваю некоторые рекомендации, как подходить к такой проблеме.

Что я думал до сих пор.Создайте второй массив с разницей между элементом x и x-1:

1, 2, 3, 4, 7, 23, 24, 25, 40, 41, 43, ...
   1, 1, 1, 3, 16,  1,  1, 15,  1, 2, ...

Затем отсканируйте этот массив и найдите любое число ниже «порога веса» (скажем, 4) и создайте первый QPair список, включающий эти адреса:

[1, 7], [23, 25], [40, 43]

Наконец, проверьте длину каждой пары и, если она превышает максимально допустимое значение, разделите ее.

Считаете ли вы разумным подход?Есть какой-нибудь известный алгоритм, который мог бы здесь соответствовать?QMap - хороший выбор?Я использовал это, потому что я собираюсь испустить сигнал, когда я получу каждое значение от Modbus следующим образом:

void dataReceived(int address, quint16 value);

, следовательно, было бы очень легко получить связанный MyData.

1 Ответ

0 голосов
/ 11 сентября 2018

Решение, которое вы считаете великолепным.Это решает проблему в O(n) сложности.С точки зрения сложности не может быть лучше, чем это.Поскольку для построения списка необходимо пройти все элементы.Но ... вы можете сделать это немного быстрее (при условии, что массив отсортирован)

Чтобы построить список QList<QPair<int,int>>, вы делаете три итерации размером n ::100100

1 -Создайте массив с учетом различий.

2 - создайте список, пересекающий массив, созданный на предыдущем шаге

3 - проверьте длину каждой пары и, если она больше, чем максимально допустимое, разбейте ее.

Вы можете сделать это только за одну итерацию (один шаг);Отслеживание переменных начала, конца пары и размера.Если вы найдете значение, которое отличается от "пороговое значение веса " от значения предыдущего значения, или размер больше, чем "maximun допустимый" , тогда -> Добавить пару ксписок и сброс переменных начала, конца и размера со следующим значением.

В любом случае, поскольку в списке не более 2000 значений, это не большая разница.

По поводу вашего другого вопроса.Да, QMap является отличным выбором, поскольку обеспечивает O(1) сложность времени для получения ваших данных.

...