XY Graph замедляет всю систему

Простейшие вопросы в области инженерной разработки
Аватара пользователя
jane_wild

Gold
master
master
Сообщения: 495
Зарегистрирован: 30 июн 2016, 02:11
Награды: 1
Версия LabVIEW: 2020
Благодарил (а): 94 раза
Поблагодарили: 18 раз
Контактная информация:

XY Graph замедляет всю систему

Сообщение jane_wild »

Здравствуйте всем. Столкнулась с проблемой обновления XY Graph. Когда количество точек превышает 100000, начинается притормаживание, и чем больше точек, тем оно сильнее.
Samling rate 1000, нужно минимум 100 секунд. Итого получается 100000, но отображать нужно 2 плота - четыре массива по 100000 Как следствие после секунд 50-ти начинается притормаживание...
О структуре программы. Actor Framework. DAQ непрерывно шлет 2D DBL Array. На приемной стороне из этого массива выделяются необходимые четыре 1D массива и накапливаются в FGV с последующим отображением на XY
Т.е. прилетели четыре порции по 100 точек каждая, добавились в FGV к уже имеющимся и вывелись на график. Как только длина масива достигла 100000 в FGV убираются первые 100 точек.
Помимо XY Graph на панели еще с десяток других индикаторов, которые также вместе с графиком начинают скачкообразно обновлятся. Значения как графика, так и индикаторов обновляю используя Set Control Values by Index
Недавно на форуме проскакивала тема, где упоминалась эта функция - решила попробовать. Функция вызывается дважды, один раз для всех индикаторов, второй раз для графика.
Теперь что интересно. Когда начинает притормаживать, то притормаживает все! В том числе и DAQ Actor который шлет данные. Причем притормаживает именно само отображение (отрисовка). iteration индикатор в while loop DAQ (Actor core) наглядно это показывает - вначале обновляется 10 раз в секунду показывая каждую циферку, затем синхронно с графиком и всеми индикаторами начинает обновлятся скачкообразно, скажем раз в пол секунды. Но! считает верно, перепрыгивая через значения значит сообщения посылаются, да и ошибки чтения (переполнения) нет. Если свернуть график в трей (основную фронтальную панель) индикатор снова работает плавно. Из чего я сделала вывод, что виновата именно отрисовка. Копаю дальше, ставлю Case structure с кнопкой на функцию Set Control Values by Index, ну типа обновлять - не обновлять и обнаруживаю, что это не работает! Т.е. я график не обновляю а оно всеравно тормозит. Вообщем мои размышления как учучшить производительность зашли в тупик. Может чего посоветуете?
Life is short. Smile while you still have teeth!
Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
guru
guru
Сообщения: 5540
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Версия LabVIEW: 2015, 2016
Откуда: СССР
Благодарил (а): 32 раза
Поблагодарили: 103 раза

Re: XY Graph замедляет всю систему

Сообщение IvanLis »

jane_wild писал(а): 03 сен 2024, 17:05 Вообщем мои размышления как учучшить производительность зашли в тупик. Может чего посоветуете?
Смысл отображать 100000 точек на контроле размером (допустим) 1000 точек?
Путей несколько, я бы начал с изучения: viewtopic.php?t=10867
Аватара пользователя
jane_wild

Gold
master
master
Сообщения: 495
Зарегистрирован: 30 июн 2016, 02:11
Награды: 1
Версия LabVIEW: 2020
Благодарил (а): 94 раза
Поблагодарили: 18 раз
Контактная информация:

Re: XY Graph замедляет всю систему

Сообщение jane_wild »

Смысл простой. Нужно "поймать" реакцию изменения одного сигнала при воздействии другого. Например медленно увеличивается давление, в какой то момент срабатывает pressure limit switch давая команду на закрытие входного серво клапана. Вот нужно измерить различные зависимости и скорость закрытия от приложенного тока, и время реакции switch, и давление от угла и т.д. и т.п.
Это происходит достаточно быстро, поэтому и sample rate 1000. А вот диапазон времени, когда это все произойдет, достаточно продолжительный, поэтому и 100 секунд. XY удобен тем что потом, нажав на паузу, можно увеличить именно ту область, которую нужно, отбросив все остальное и измерить курсорами все что необходимо

P.S. за ссылку спасибо буду разбираться, только мне кажется что проблема с обновлением (отрисовкой)XY, замеры времени на обработку данных вполне себе удовлетворительные. И почему с Chart таких проблем не наблюдается? Впольне себе выводит четыре канала по 200 тыс точек каждый и "не заикается"
Life is short. Smile while you still have teeth!
Artem.spb

Activity Автор
professor
professor
Сообщения: 3538
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 56 раз
Поблагодарили: 189 раз
Контактная информация:

Re: XY Graph замедляет всю систему

Сообщение Artem.spb »

jane_wild писал(а): 03 сен 2024, 17:05 это не работает! Т.е. я график не обновляю а оно всеравно тормозит.
Это и наводит на мысль, что проблема не в рисовании, а в способе накопления массива.
Я не замечал тормоза на таких выборках, 100к = довольно скромное количество.
Borjomy_1

Activity Professionalism Silver
doctor
doctor
Сообщения: 2249
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Версия LabVIEW: 2009..2020
Откуда: город семи холмов
Благодарил (а): 32 раза
Поблагодарили: 30 раз

Re: XY Graph замедляет всю систему

Сообщение Borjomy_1 »

Я бы сделал следующим образом: закольцованный буфер предварительно выделенного и неизменяемого размера в 100к, где заменяется на каждой итерации только одна точка, а следующая за ней очищается (Nan), а также указатель на конец буфера. Незаполненная часть буфера NaN . И надо в конце физического буфера иметь дубликат значения 0 элемента, чтобы линия не прерывалась.
Также и для Y массива. Тогда из работы будет убрано копирование объемных массивов.

XY Grafh безразлично, в каком направлении будут отрисовываться тренды
Аватара пользователя
alerm

Activity
leader
leader
Сообщения: 687
Зарегистрирован: 02 май 2012, 21:28
Награды: 1
Версия LabVIEW: 20
Благодарил (а): 64 раза
Поблагодарили: 11 раз
Контактная информация:

Re: XY Graph замедляет всю систему

Сообщение alerm »

jane_wild писал(а): 03 сен 2024, 20:56 И почему с Chart таких проблем не наблюдается? Впольне себе выводит четыре канала по 200 тыс точек каждый и "не заикается"
Просто вопрос: а на XY Graph точки отрисовываются?
Аватара пользователя
jane_wild

Gold
master
master
Сообщения: 495
Зарегистрирован: 30 июн 2016, 02:11
Награды: 1
Версия LabVIEW: 2020
Благодарил (а): 94 раза
Поблагодарили: 18 раз
Контактная информация:

Re: XY Graph замедляет всю систему

Сообщение jane_wild »

Artem.spb писал(а): 04 сен 2024, 00:06
jane_wild писал(а): 03 сен 2024, 17:05 это не работает! Т.е. я график не обновляю а оно всеравно тормозит.
Это и наводит на мысль, что проблема не в рисовании, а в способе накопления массива.
Я не замечал тормоза на таких выборках, 100к = довольно скромное количество.
Логически я согласна, но практика говорит что нет. Я наблюдаю выход кластера из FGV (тот который непосредственно подается на Set Control Value by Index) и который дергается синхронно с XY, причем без разницы добавляются новые данные в график или нет. Но стоит свернуть график, как все начинает работать плавно, обновляясь 10 раз в секунду, как и предполагалось. Может функция Set Control Value by Index как то не правильно работает, но переделывать весь проект, чтобы это проверить, особенного желания нет. Вообщем буду думать.
alerm писал(а): 04 сен 2024, 12:59 Просто вопрос: а на XY Graph точки отрисовываются?
Отрисовываются, только кусками, а не плавно
Life is short. Smile while you still have teeth!
Аватара пользователя
alerm

Activity
leader
leader
Сообщения: 687
Зарегистрирован: 02 май 2012, 21:28
Награды: 1
Версия LabVIEW: 20
Благодарил (а): 64 раза
Поблагодарили: 11 раз
Контактная информация:

Re: XY Graph замедляет всю систему

Сообщение alerm »

jane_wild писал(а): 04 сен 2024, 14:07 Отрисовываются, только кусками, а не плавно
Ну для себя давно заметил, что если данных много, то отображение точек необходимо отключать. На работе нет программ захвата экрана, могу вечером сравнение дома сделать.
Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
guru
guru
Сообщения: 5540
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Версия LabVIEW: 2015, 2016
Откуда: СССР
Благодарил (а): 32 раза
Поблагодарили: 103 раза

Re: XY Graph замедляет всю систему

Сообщение IvanLis »

jane_wild писал(а): 04 сен 2024, 14:07 Логически я согласна, но практика говорит что нет.
А Performance and Memory что показывает, наверняка там по разным методам (SubVI) раскидано накопление и отрисовка (если нет, то разнести)?
Можно посмотреть, где именно "тормоз" идет...
ujin1
adviser
adviser
Сообщения: 240
Зарегистрирован: 06 ноя 2020, 15:37
Версия LabVIEW: 19
Благодарил (а): 19 раз
Поблагодарили: 40 раз
Контактная информация:

Re: XY Graph замедляет всю систему

Сообщение ujin1 »

У меня на графике 4-5 значений секундных за 24 часа. Это 432000. Каждую секунду делается запрос к базе данных и добавляются новые значения, старые убираются. Кольцевой буфер. Этот буфер подключен к XY Graf. Т.е данных новых 5-10 значений. График работает 24/7 неделями. Таких TrendViewer обычно включено 2-3. Задержки с течением времени не наблюдаются.
Т.е сам XY Graf с течением времени ресурсов больше не потребляет.
Точки не включены.
Изображение
Аватара пользователя
jane_wild

Gold
master
master
Сообщения: 495
Зарегистрирован: 30 июн 2016, 02:11
Награды: 1
Версия LabVIEW: 2020
Благодарил (а): 94 раза
Поблагодарили: 18 раз
Контактная информация:

Re: XY Graph замедляет всю систему

Сообщение jane_wild »

Нашла бяку :) виновата функция Set Control Value by Index, вернее мои кривые руки и не правильное ее применение. Хотела ее попробовать, ведь help обещает бОльшую производительность, но в моем случае получилось почему то наоборот. Потратила пару часов и переделала проект. Теперь при инициализации программы вместо индексов контролов собрала в массив их references. Индикаторы обновляются по старинке в for loop. И все заработало без всяких тормозов. В оригинальном проекте функция вызывалась трижды в двух override vi, обновление цифровых, аналоговых индикаторов и собственно XY Graph... Видимо есть какие то тонкости ее использования в Actor Frameworks, пишу так, потому что пыталась повторить "тормоза" в обычном VI - Не получилось работает плавно. Я тут нагородила чтобы XY не казался "мертвым"
Set By Idx.PNG
Размер самого VI большой из за константы с 100000 точек из реального проета, поэтоу катринка
Life is short. Smile while you still have teeth!
Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
guru
guru
Сообщения: 5540
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Версия LabVIEW: 2015, 2016
Откуда: СССР
Благодарил (а): 32 раза
Поблагодарили: 103 раза

Re: XY Graph замедляет всю систему

Сообщение IvanLis »

Я стараюсь писать "быстрые" данные в индикаторах использую UserEvent.
В любом случае все индикаторы располагаются в TopLevel.vi (Core.vi) и на самом деле требующих быстрого обновления не так много.
Для каждого такого индикатора создаю отдельный UserEvent, а из методов уже пишу в него.
При этом нет необходимости дергать "Свойства" этого индикатора для обновления данных из метода, что позволяет не блокировать им UI поток.

Стараюсь, но не всегда получается :wink:
Аватара пользователя
jane_wild

Gold
master
master
Сообщения: 495
Зарегистрирован: 30 июн 2016, 02:11
Награды: 1
Версия LabVIEW: 2020
Благодарил (а): 94 раза
Поблагодарили: 18 раз
Контактная информация:

Re: XY Graph замедляет всю систему

Сообщение jane_wild »

Если я правильно поняла, то упрощенно это должно выглядеть так.
Собрать в определенном порядке массив из созданных UE для индикаторов. Далее прилетел от DAQ 2D массив, где я точно знаю в какой последовательности расположены данные и этот порядок должен совпадать с порядком массива из UE. Произвести обработку данных (Filter - RMS - Mean) вообщем кому что нужно... Ну и с помощью for loop генерировать UE для каждого индикатора. Так?
Обновление по индексу мне понравилось тем, что таская саму панель, либо другие окна и это не влияет на обновление - индикаторы не "замерзают" . Согласно Вашему сообщению такой же положительный эффект будет и при использовании UE. Правильно?
Life is short. Smile while you still have teeth!
Аватара пользователя
taras_33

Activity
professional
professional
Сообщения: 393
Зарегистрирован: 31 окт 2009, 18:25
Награды: 1
Версия LabVIEW: 2019
Поблагодарили: 14 раз
Контактная информация:

Re: XY Graph замедляет всю систему

Сообщение taras_33 »

jane_wild писал(а): 05 сен 2024, 15:23 Ну и с помощью for loop генерировать UE для каждого индикатора.
Зачем же для каждого? Можно и одно. После обработки данных соберите обратно в массив - вот его и передавайте - генерируя событие , а в обработчике разбросайте этом масив по индикаторам.
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots.
So far, the Universe is winning!
Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
guru
guru
Сообщения: 5540
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Версия LabVIEW: 2015, 2016
Откуда: СССР
Благодарил (а): 32 раза
Поблагодарили: 103 раза

Re: XY Graph замедляет всю систему

Сообщение IvanLis »

jane_wild писал(а): 05 сен 2024, 15:23 Правильно?
Немного не так....
Предпочитаю все держать под контролем, а у Вас получится при изменении очередности или добавления в массив, все может рухнуть.

Я собираю все UserEvent в отдельный кластер TypeDef, ну и стараюсь группировать хоть как-то все (кластер Ref на элементы панели, кластер Ref на SubPanel и т.д.), так проще поддерживать и модифицировать.
Вот например TopLevel Core (main) и часть его свойств, думаю принцип группировки элементов в свойствах понятен.
Панель имеет только индикатор времени и кнопка для вкл/выкл всплывающих подсказок.
Каждый квадратик пустой это SubPanel. При запуске main запускаются куча Акторов и встраивают свои панели в main.
mainCore.png
Реально здесь 5 разных типов Акторов:
1. Connection - коммуникация и работа с ModBus.
2. Logger - отображение лога событий пользователю.
3. Sound - управление звуковыми событиями.
4. Object - восемь экземпляров.
5. Ping - восемь экземпляров.

Вот например FP Актора который работает с ModBus и встраивается в main (место его думаю понятно).
ModBus.png
На нем отображаются "Состояние соединения" и "Значения на входе", остальное - управление.
При инициализации Актора создаем соответствующие события UserEvent.
Pre Launch.png
В процессе работы, Актор читает данные с устройства и в случае их изменения (это тоже позволяет не дергать лишний раз GUI), отправляет в UserEvent.
ReadDI.png
Здесь все сразу сделано, иногда удобнее создать отдельный метод для обновления значения на индикаторе, типа такого.
Description.png
В Actor Core все необходимые события регистрируются и обрабатываются. Тут обновляем значения индикатора отображающего состояния DI, остальное аналогично.
Core.png
А при остановке Актора, все чистим естественно.
Stop.png
Получается, что я не обновляю значения индикаторов через их свойства, а делаю это напрямую, непосредственно в Core.
Не всегда так получается, например в этом же проекте приходится менять цвет индикатора Description в Акторах Object и Ping через свойства (а его значение через UserEvent), но цвет меняется значительно реже, чем обновляется значение. Да и по другому этого не сделать.

Кроме всего прочего, UserEvent имеет функцию Flush Event и при запаздывании GUI позволяет фильтровать события, например отбросить все предыдущие и отобразить только последние актуальные данные. Но для обработки таких событий, которые могут тормозить все остальное в Actor Core желательно создавать отдельный цикл обработки.
Вот например Object Core, что бы интерфейс не блокировался при вызове меню пользователя, обработка разных событий и меню, разнесены по разным параллельным циклам.
Object_Library_lvlib_Object_Actor_Class_lvclass_Actor_Cored.png

Трудно себя организовать и заставить все это делать, иногда думаешь "по быстренькому набросаю", а потом приходится тратить кучу времени на рефакторинг кода. Так что если сила воли имеется, то нужно делать сразу хорошо, например у меня в main всего одно UserEvent - Stop, но для него создал кластер и при добавлении событий (а их видимо новых уже не будет), закину уже туда.
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Для чайников»