Перегружен процессор

Простейшие вопросы в области инженерной разработки
Ответить
AlexOskar
user
user
Сообщения: 95
Зарегистрирован: 05 июл 2016, 21:02
Версия LabVIEW: 12
Контактная информация:

Перегружен процессор

Сообщение AlexOskar »

Здравствуйте форумчане!
Создал VI с несколькими режимами работы, но столкнулся с проблемой - один из режимов очень сильно загружает процессор (колеблется от 88 до 100%). Перепробовал и перечитал много всего, но ничего не помогает (увеличение задержек в цикле только замедляет скорость колебания загрузки процессора). Да и сложного, на мой взгляд, ничего в цикле не вычисляется.
Проблемным является цикл CONTROL LOOP. Если запустить VI в режиме "Автоматическое управление", то начнет работать цикл внутри кейса "Automatic control". С этого момента и начинается сильная загрузка ЦП. При переходе в режим "Ручное управление" (кейс "Manual control") - все становится отлично (загрузка ЦП не более 15%).
Подскажите, пожалуйста, что так сильно грузит ЦП и как это можно поправить?
Последний раз редактировалось AlexOskar 21 июн 2017, 16:06, всего редактировалось 1 раз.
alex3f
beginner
beginner
Сообщения: 26
Зарегистрирован: 23 авг 2016, 09:16
Версия LabVIEW: 2016
Контактная информация:

Re: Перегружен процессор

Сообщение alex3f »

Попробуйте убрать узлы свойств "Галка РУЧ" и "Галка АВТ" из цикла.
Shurik_85
beginner
beginner
Сообщения: 49
Зарегистрирован: 13 апр 2014, 18:53
Версия LabVIEW: 14
Контактная информация:

Re: Перегружен процессор

Сообщение Shurik_85 »

Может стоит как-то синхронизировать между собой значения входных параметров TimeUot функции "Wait on Notification Function", "Wait" во внутреннем и во внешнем цикле. А то они все по 250 мс, и в случае если "Wait on Notification Function" получает уведомление на 250-ой мс (например), то на выполнение остальной части кода внутреннего цикла времени уже нет (т.к. "Wait" уже отмерила свои 250 мс, поскольку запустилась она одновременно с "Wait on Notification Function"), то же касается и "Wait" во внешнем цикле, которая запустилась одновременно с "Case" вашего автомата состояний (здесь состояние только усугубляется, если внутренний цикл прокрутился не один раз). Соответственно, раз время "Wait" истекло, то проц будет пытаться выполнить все (хоть и не сложные) оставшиеся операции за максимально короткое время, и нагружаться на все 100 % как во внутреннем, так и во внешнем цикле.
Кстати, изменение свойств видимости элементов фронтальной панели через узлы свойств тоже нормально добавляет работы процу, особенно если по времени "завал".

Так что как-то нужно как-то ручками синхронизировать работу перечисленных функций:
- может быть явно заставить их работать последовательно;
- может быть подобрать правильные задержки;
- может менять входной параметр функций "Wait" в зависимости от того выполнилось ли условие TimeOut у "Wait on Notification Function", или смотреть выполнять/не выполнять её вообще;
- может гарантировать генерацию уведомлений чаще (не реже), чем раз в 200 мс (меньше 250);
- ...

А вообще если, то как-то не очень запускать "цикл в цикле" при использовании автомата состояний. Не дождался уведомления на текущей итерации - не делай ничего, выйди из кейса и зайди в него же на следующей итерации внешнего цикла. Как-то так.
Artem.spb

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

Re: Перегружен процессор

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

AlexOskar, чем-то системе не нравится ваш кластер Power. Если его спрятать, то загрузка процессора падает.
Может, там есть какая-то скрытая анимация или что-то вроде того. У меня не 100%, но при отображении этого контрола прибавляется процентов 20.
Shurik_85 писал(а):Может стоит как-то синхронизировать между собой значения входных параметров TimeUot функции "Wait on Notification Function", "Wait" во внутреннем и во внешнем цикле. А то они все по 250 мс, и в случае если "Wait on Notification Function" получает уведомление на 250-ой мс (например), то на выполнение остальной части кода внутреннего цикла времени уже нет (т.к. "Wait" уже отмерила свои 250 мс, поскольку запустилась она одновременно с "Wait on Notification Function"), то же касается и "Wait" во внешнем цикле, которая запустилась одновременно с "Case" вашего автомата состояний (здесь состояние только усугубляется, если внутренний цикл прокрутился не один раз). Соответственно, раз время "Wait" истекло, то проц будет пытаться выполнить все (хоть и не сложные) оставшиеся операции за максимально короткое время, и нагружаться на все 100 % как во внутреннем, так и во внешнем цикле..
Вот вообще не так.
"Wait" никоим образом напрямую не задаёт период исполнения цикла. Это функция ОЖИДАНИЕ. Она исполняется, как и все другие, функции параллельно с остальным кодом. И исполняется она равно заданное время (в данном случае 250мс). С той лишь разницей, что она не грузит процессор во время своей работы, в отличие от других функций.
и если что-то там не успевает исполнится в 250 мс, то система не будет пытаться успеть выполнить это в 250 мс.
Пример: пауза 10, а все функции требуют 500 (например, получение данных по сети), цикл будет работать 500мс, и не будет пытаться выкачать данные за 10мс.

Вообще, все функции исполняются максимально быстро с учётом приоритета. Есть время проца - быстро посчиталось, нет - ждёт очереди.

Единственное исключения в работе "Wait", влияющее на цикл - это пауза=0, в этом случае исполнение цикла начинается моментально с получением управления функцией "Wait". В остальных
AlexOskar
user
user
Сообщения: 95
Зарегистрирован: 05 июл 2016, 21:02
Версия LabVIEW: 12
Контактная информация:

Re: Перегружен процессор

Сообщение AlexOskar »

Artem.spb писал(а):AlexOskar, чем-то системе не нравится ваш кластер Power. Если его спрятать, то загрузка процессора падает.
Может, там есть какая-то скрытая анимация или что-то вроде того. У меня не 100%, но при отображении этого контрола прибавляется процентов 20.
Да да да! Вчера сам, случайно, заметил что при отображении этого кластера на дисплее загрузка 100%, а следует свернуть приложение - все отлично. В общем это был кластер из UI Control Suite - Metallic Theme и как только заменил его на обычный - все заработало отлично!
Всем спасибо за помощь!!!
Shurik_85
beginner
beginner
Сообщения: 49
Зарегистрирован: 13 апр 2014, 18:53
Версия LabVIEW: 14
Контактная информация:

Re: Перегружен процессор

Сообщение Shurik_85 »

"Wait" никоим образом напрямую не задаёт период исполнения цикла.
Согласен, что-то я тут совсем всё в кучу намешал (и While, и Timed Loop, и Wait, ... ) :dntknw: :crazy:

На счёт
...никоим образом ...
Можно тактировать цикл While с помощью Wait, запустив её параллельно остальному коду цикла, только ограничение на время исполнения цикла она накладывает "снизу", т.е. если остальной код цикла выполняется быстрее, чем время на входе Wait, то цикл "подождёт" до заданного времени паузы. Ну а если на выполнение кода нужно больше времени, чем на входе Wait, то всё так, как описано выше. И да, это влияние не напрямую.
Аватара пользователя
Kosist

Activity Gold
expert
expert
Сообщения: 1236
Зарегистрирован: 21 фев 2011, 23:44
Награды: 2
Версия LabVIEW: 2013-2020
Благодарил (а): 23 раза
Поблагодарили: 30 раз
Контактная информация:

Re: Перегружен процессор

Сообщение Kosist »

Нужно обращаться "к истокам" - вот ведь все расписано - http://digital.ni.com/public.nsf/allkb/ ... 57004DD8E2
Мы делили апельсин - много наших полегло...
Ответить

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