Проблема с вложенным циклом Timed Loop
-
- advanced
- Сообщения: 170
- Зарегистрирован: 18 июл 2019, 13:53
- Версия LabVIEW: 2020
- Откуда: Россия, Ижевск
- Благодарил (а): 33 раза
- Контактная информация:
Проблема с вложенным циклом Timed Loop
Добрый день.
Вопрос по организации вложенных циклов.
Есть внешний цикл, который должен работать до прерывания по кнопке.
И есть внутренний цикл, который должен отработать строго определённое время T1.
Завершение работы внутреннего цикла осуществляется когда время работы цикла становится больше Т1.
После завершения внутреннего цикла должен быть произведён расчёт и сохранение данных и начаться новый внутренний цикл в рамках итерации внешнего цикла.
То есть, каждая итерация внешнего цикла должна начинаться только после завершения работы внутреннего цикла.
И так до тех пор, пока не будет прерван внешний цикл.
Внутренний цикл я организовал типа Timed Loop, а внешний - как While Loop.
Первая итерация внешнего цикла завершается, как и положено, по завершению работы внутреннего цикла. А вот дальше начинаются проблемы.
Проверка прерывания внутреннего цикла реализована для параметра "Actual End [i-1]", а начиная со 2-ой итерации он принимает значение 0 и второе значение с нарастанием.
Почему этот параметр наращивает своё значение, хотя вроде должен расти только до 5000, а потом при новом запуске внутреннего цикла начинать с 0?
Вопрос по организации вложенных циклов.
Есть внешний цикл, который должен работать до прерывания по кнопке.
И есть внутренний цикл, который должен отработать строго определённое время T1.
Завершение работы внутреннего цикла осуществляется когда время работы цикла становится больше Т1.
После завершения внутреннего цикла должен быть произведён расчёт и сохранение данных и начаться новый внутренний цикл в рамках итерации внешнего цикла.
То есть, каждая итерация внешнего цикла должна начинаться только после завершения работы внутреннего цикла.
И так до тех пор, пока не будет прерван внешний цикл.
Внутренний цикл я организовал типа Timed Loop, а внешний - как While Loop.
Первая итерация внешнего цикла завершается, как и положено, по завершению работы внутреннего цикла. А вот дальше начинаются проблемы.
Проверка прерывания внутреннего цикла реализована для параметра "Actual End [i-1]", а начиная со 2-ой итерации он принимает значение 0 и второе значение с нарастанием.
Почему этот параметр наращивает своё значение, хотя вроде должен расти только до 5000, а потом при новом запуске внутреннего цикла начинать с 0?
-
- professor
- Сообщения: 3404
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 175 раз
- Контактная информация:
Re: Проблема с вложенным циклом Timed Loop
Исходно ненужные навороты.
Зачем внутренний цикл? Подождать 5 сек? тогда зачем каждую итерацию запрашивать счётчик? При этом все значения всё равно выкидываются.
счётчик будет получен в ЛЮБОЙ момент в течение 1 сек периода цикла, так что измерения будут очень сильно скакать.
Ну и кнопка стопа. Уверен, после её нажатия приходится ждать 6-10 сек до завершения программы, т.к. внутренний цикл "зачем-то" делает ещё один ход.
Зачем внутренний цикл? Подождать 5 сек? тогда зачем каждую итерацию запрашивать счётчик? При этом все значения всё равно выкидываются.
счётчик будет получен в ЛЮБОЙ момент в течение 1 сек периода цикла, так что измерения будут очень сильно скакать.
Ну и кнопка стопа. Уверен, после её нажатия приходится ждать 6-10 сек до завершения программы, т.к. внутренний цикл "зачем-то" делает ещё один ход.
тут я совсем не понял. Почему он 0 со второй итерации? Это же "время" окончания предыдущей итерации и обнуляться не должноа начиная со 2-ой итерации он принимает значение 0 и второе значение с нарастанием. Почему этот параметр наращивает своё значение, хотя вроде должен расти только до 5000, а потом при новом запуске внутреннего цикла начинать с 0?
-
- advanced
- Сообщения: 170
- Зарегистрирован: 18 июл 2019, 13:53
- Версия LabVIEW: 2020
- Откуда: Россия, Ижевск
- Благодарил (а): 33 раза
- Контактная информация:
Re: Проблема с вложенным циклом Timed Loop
>> Исходно ненужные навороты.
VI сильно упрощена. Убрал то, что, как мне показалось, не имело отношение к проблеме.
>>Зачем внутренний цикл? Подождать 5 сек?
Я называю это время интегрирования. За это время надо собрать данные о движении вала энкодера и выдать на ПЧ управляющее воздействие, которое зависит от скорости перемещения и позиции которую выдаёт энкодер и рассчитывается по сложным формулам. Затем снова 5 сек собирать данные и т.д.
>>Ну и кнопка стопа. Уверен, после её нажатия приходится ждать 6-10 сек до завершения программы, т.к. внутренний цикл "зачем-то" делает ещё один ход.
Это мой косяк. По кнопке Стоп надо как-то прерывать внутренний цикл.
>>тут я совсем не понял. Почему он 0 со второй итерации? Это же "время" окончания предыдущей итерации и обнуляться не должно
Как я себе представляю работу вложенных циклов в данном случае:
Первая итерация внешнего цикла:
- внутренний цикл работает до тех пор, пока значение параметра "Actual End [i-1]" меньше времени интегрирования. Затем внутренний цикл прерывается;
Это отрабатывает как я ожидаю.
Начинается вторая итерация внешнего цикла.
- тут он как то странно отрабатывает, так как на панели значение параметра "Actual End [i-1]" показывает с нарастанием. При каждой следующей итерации внешнего цикла значение параметра увеличивается;
В общем, мне надо следующее:
- каждая итерация внешнего цикла должна начинаться только после завершения внутреннего цикла. А период работы внутреннего цикла определяется временем интегрирования.
VI сильно упрощена. Убрал то, что, как мне показалось, не имело отношение к проблеме.
>>Зачем внутренний цикл? Подождать 5 сек?
Я называю это время интегрирования. За это время надо собрать данные о движении вала энкодера и выдать на ПЧ управляющее воздействие, которое зависит от скорости перемещения и позиции которую выдаёт энкодер и рассчитывается по сложным формулам. Затем снова 5 сек собирать данные и т.д.
>>Ну и кнопка стопа. Уверен, после её нажатия приходится ждать 6-10 сек до завершения программы, т.к. внутренний цикл "зачем-то" делает ещё один ход.
Это мой косяк. По кнопке Стоп надо как-то прерывать внутренний цикл.
>>тут я совсем не понял. Почему он 0 со второй итерации? Это же "время" окончания предыдущей итерации и обнуляться не должно
Как я себе представляю работу вложенных циклов в данном случае:
Первая итерация внешнего цикла:
- внутренний цикл работает до тех пор, пока значение параметра "Actual End [i-1]" меньше времени интегрирования. Затем внутренний цикл прерывается;
Это отрабатывает как я ожидаю.
Начинается вторая итерация внешнего цикла.
- тут он как то странно отрабатывает, так как на панели значение параметра "Actual End [i-1]" показывает с нарастанием. При каждой следующей итерации внешнего цикла значение параметра увеличивается;
В общем, мне надо следующее:
- каждая итерация внешнего цикла должна начинаться только после завершения внутреннего цикла. А период работы внутреннего цикла определяется временем интегрирования.
-
IvanLis
- guru
- Сообщения: 5464
- Зарегистрирован: 02 дек 2009, 17:44
- Награды: 7
- Версия LabVIEW: 2015, 2016
- Откуда: СССР
- Благодарил (а): 28 раз
- Поблагодарили: 87 раз
Re: Проблема с вложенным циклом Timed Loop
А не будет более верным, не считывать по одному отсчету (во внутреннем цикле), а сразу накопить массив отсчетов и их обработать (по страшно сложной формуле)...
Только если обработка действительно ресурсоемкая, то делать это нужно в параллельном цикле, иначе Вы должны гарантировать, что за время накопления следующей партии отсчетов, вычисления и отображение будут закончены и программа готова принять следующую партию для обработки.
Только если обработка действительно ресурсоемкая, то делать это нужно в параллельном цикле, иначе Вы должны гарантировать, что за время накопления следующей партии отсчетов, вычисления и отображение будут закончены и программа готова принять следующую партию для обработки.
Знание нескольких принципов освобождает от знания многих фактов!
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
-
- professor
- Сообщения: 3404
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 175 раз
- Контактная информация:
Re: Проблема с вложенным циклом Timed Loop
Что вы называете сбором данных? получение одной точки? Тогда цикл не нужен.="rsv" писал(а): Я называю это время интегрирования. За это время надо собрать данные о движении вала энкодера и выдать на ПЧ управляющее воздействие, которое зависит от скорости перемещения и позиции которую выдаёт энкодер и рассчитывается по сложным формулам. Затем снова 5 сек собирать данные и т.д.
Если нужен массив, то проще, как написал Иван, запросить сразу его опять же без всяких внутренних циклов.
1) кнопку можно перенести во внутренний цикл 2) можно жестоко где-то на стороне пристрелить задачу, тогда функция чтения прекратит ожидание отсчётов.>>Ну и кнопка стопа. Уверен, после её нажатия приходится ждать 6-10 сек до завершения программы, т.к. внутренний цикл "зачем-то" делает ещё один ход.
Это мой косяк. По кнопке Стоп надо как-то прерывать внутренний цикл.
Ещё раз: это НЕ странно, это так и задумано.- тут он как то странно отрабатывает, так как на панели значение параметра "Actual End [i-1]" показывает с нарастанием. При каждой следующей итерации внешнего цикла значение параметра увеличивается;
Есть системный таймер мс (ф-ия tick count тоже его выдаёт). Это значение того самого таймера в момент завершения предыдущей итерации. Никто вам таймер не сбросит. Правда, я не понял, как умудряется работать первая итерация.
Это как бы самом собой происходит. Вы не сможете начать вторую итерацию до завершения первой, т.е до выполнения всего кода внутри циклаВ общем, мне надо следующее:
- каждая итерация внешнего цикла должна начинаться только после завершения внутреннего цикла.
А тут у вас опять показания не сходятся.А период работы внутреннего цикла определяется временем интегрирования.
Вам период внутреннего или внешнего = времени интегрирования?
Точек (значений) счётчика за это "время интегрирования" вам сколько можно накопить?
-
- advanced
- Сообщения: 170
- Зарегистрирован: 18 июл 2019, 13:53
- Версия LabVIEW: 2020
- Откуда: Россия, Ижевск
- Благодарил (а): 33 раза
- Контактная информация:
Re: Проблема с вложенным циклом Timed Loop
Было бы верным, если бы не надо было контролировать направление (по изменению угла поворота). А направление надо контролировать непрерывно, поэтому без цикла я не смог обойтись.>>А не будет более верным, не считывать по одному отсчету (во внутреннем цикле), а сразу накопить массив отсчетов
-
- advanced
- Сообщения: 170
- Зарегистрирован: 18 июл 2019, 13:53
- Версия LabVIEW: 2020
- Откуда: Россия, Ижевск
- Благодарил (а): 33 раза
- Контактная информация:
Re: Проблема с вложенным циклом Timed Loop
Я понимаю что это значение таймера в момент завершения предыдущей итерации. До меня не доходит следующее - когда начинается новая итерация внешнего цикла, внутренний цикл должен начать отсчёт с 0 и до тех пор, пока время фактического завершения итерации не станет больше времени интегрирования. А на самом деле он начинает отсчёт с времени завершения предыдущей итерации. Получается, что таймер работает пока работает vI. Так?>>Это значение того самого таймера в момент завершения предыдущей итерации. Никто вам таймер не сбросит.
Неточно выразился.>>А тут у вас опять показания не сходятся. Вам период внутреннего или внешнего = времени интегрирования?
Одна итерация внешнего цикла = время работы внутреннего цикла = время интегрирования.
-
- professor
- Сообщения: 3404
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 175 раз
- Контактная информация:
Re: Проблема с вложенным циклом Timed Loop
Про необходимое количество точек на выходе внутреннего цикла вы так и не сознались.="rsv" писал(а):Было бы верным, если бы не надо было контролировать направление (по изменению угла поворота). А направление надо контролировать непрерывно, поэтому без цикла я не смог обойтись.>>А не будет более верным, не считывать по одному отсчету (во внутреннем цикле), а сразу накопить массив отсчетов
до сих пор я был уверен, что таймер работает всё время, пока работает комп. По крайнем мере tick counter возвращает именно мс с момента последнего включения компа.Я понимаю что это значение таймера в момент завершения предыдущей итерации. До меня не доходит следующее - когда начинается новая итерация внешнего цикла, внутренний цикл должен начать отсчёт с 0 и до тех пор, пока время фактического завершения итерации не станет больше времени интегрирования. А на самом деле он начинает отсчёт с времени завершения предыдущей итерации. Получается, что таймер работает пока работает vI. Так?
Что там происходит с таймированными циклами - не уверен.
-
- advanced
- Сообщения: 170
- Зарегистрирован: 18 июл 2019, 13:53
- Версия LabVIEW: 2020
- Откуда: Россия, Ижевск
- Благодарил (а): 33 раза
- Контактная информация:
Re: Проблема с вложенным циклом Timed Loop
Даже не знаю что сказать про количество точек. Вся обработка данных во внутреннем цикле заключается в непрерывном (в смысле, максимально частом) определении направления.>>Про необходимое количество точек на выходе внутреннего цикла вы так и не сознались.
После завершения внутреннего цикла надо иметь 2 числа - угол поворота на момент завершения цикла и точное время за которое этот угол достигнут. Но для этого точки не надо.
Зря я упростил блок-диаграмму... Зато когда объяснял что и зачем, то сам лучше понял что и зачем :)
Вот поясняю то, что я вижу (приложил скрин и VI).>>до сих пор я был уверен, что таймер работает всё время, пока работает комп. По крайнем мере tick counter возвращает именно мс с момента последнего включения компа.
>>Что там происходит с таймированными циклами - не уверен.
Преобразовал время окончания итерации в секунды и вывожу на панель. В первую итерацию внешнего цикла значение контрола "Actual End [i-1]" меняется с частотой в 1 сек (1, 2, 3, 4, 5). Всё логично.
А начиная со 2-ой операции значения быстро мелькают, причём явно видно два значения. Первое - 0, а второе увеличивается с нарастанием (время в секундах начиная с запуски Vi). А я ожидал увидеть то же самое, что в 1-ой итерации.
- Вложения
-
- EncoderRT_forum_2.vi
- (53.77 КБ) 92 скачивания
-
- professor
- Сообщения: 3404
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 175 раз
- Контактная информация:
Re: Проблема с вложенным циклом Timed Loop
А оно точно нужно? И 1 раз в сек вы называете максимально частым?="rsv" писал(а): Вся обработка данных во внутреннем цикле заключается в непрерывном (в смысле, максимально частом) определении направления.
Именно, что не надо, для этого даже цикл не нужен. У вас есть "угол" и время, Зачем внутреннее вычисление?После завершения внутреннего цикла надо иметь 2 числа - угол поворота на момент завершения цикла и точное время за которое этот угол достигнут. Но для этого точки не надо.
Снова повторяю: что мешает задать частоту опроса и запрашивать с DAQ сразу массив точек за 5 сек? Тогда и код стане проще, и
рисуйте на chart, будет понятно, что там за значения. Падение в 0 выглядит очень странно(приложил скрин и VI).
Преобразовал время окончания итерации в секунды и вывожу на панель. В первую итерацию внешнего цикла значение контрола "Actual End [i-1]" меняется с частотой в 1 сек (1, 2, 3, 4, 5). Всё логично.
А начиная со 2-ой операции значения быстро мелькают, причём явно видно два значения. Первое - 0, а второе увеличивается с нарастанием (время в секундах начиная с запуски Vi). А я ожидал увидеть то же самое, что в 1-ой итерации.
Счётчик мегагерцовый точно в норме? Зачем мегагерцовый для измерения секунд?
И ещё одно "кстати". Ваш внутернний цикл работает вовсе не 5, а 6 сек. Потому что остановка происходит после того, как предыдущий завершился после пятой сек. После этого работает шестой, получает новую точку, и только потом (через ещё 1 сек) он тормозит.
-
- advanced
- Сообщения: 170
- Зарегистрирован: 18 июл 2019, 13:53
- Версия LabVIEW: 2020
- Откуда: Россия, Ижевск
- Благодарил (а): 33 раза
- Контактная информация:
Re: Проблема с вложенным циклом Timed Loop
Точно нужно. Рабочий режим: время интегрирования ~100 мс, контроль направления вращения ~1 мс.>>А оно точно нужно? И 1 раз в сек вы называете максимально частым?
Я не понимаю Вашу идею.>>Снова повторяю: что мешает задать частоту опроса и запрашивать с DAQ сразу массив точек за 5 сек? Тогда и код стане проще, и
Цикл нужен для контроля направления вращения. Если бы не это, то можно было бы без цикла с заданным интервалом получать текущий угол поворота. Зачем нужен массив, я не понимаю.
Что такое chart?>>рисуйте на chart
Тут тоже не понимаю. Период цикла - 1 мс. После того, как фактическое время окончания итерации превысит 5 сек, то должна отработать максимум 1 итерация. То есть 5 с + 1 мс и цикл закончится. Разве не так?>>И ещё одно "кстати". Ваш внутернний цикл работает вовсе не 5, а 6 сек. Потому что остановка происходит после того, как предыдущий завершился после пятой сек. После этого работает шестой, получает новую точку, и только потом (через ещё 1 сек) он тормозит.
-
- user
- Сообщения: 94
- Зарегистрирован: 28 июл 2019, 13:16
- Версия LabVIEW: 19
- Благодарил (а): 2 раза
- Поблагодарили: 3 раза
- Контактная информация:
Re: Проблема с вложенным циклом Timed Loop
В текущем состоянии у Вас 2 задачи, которые необходимо выполнять с разной периодичностью.
Напрашивается простая схема с 2 параллельными циклами, с необходимым способом синхронизации и передачи данных между циклами.
Цикл вложенный в цикл может иметь неопределенное время исполнения в зависимости от настройки таймеров и режима Timed Loop.
Опять же в цикле сбора на данный момент не видно зависимости времени выполнения от угла поворота.
Напрашивается простая схема с 2 параллельными циклами, с необходимым способом синхронизации и передачи данных между циклами.
Цикл вложенный в цикл может иметь неопределенное время исполнения в зависимости от настройки таймеров и режима Timed Loop.
Опять же в цикле сбора на данный момент не видно зависимости времени выполнения от угла поворота.
-
- professor
- Сообщения: 3404
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 175 раз
- Контактная информация:
Re: Проблема с вложенным циклом Timed Loop
="rsv" писал(а):Точно нужно. Рабочий режим: время интегрирования ~100 мс, контроль направления вращения ~1 мс.>>А оно точно нужно? И 1 раз в сек вы называете максимально частым?
МИЛЛИсекунда?
вы уверены, что "on demand" запросы к оборудованию обеспечивают период 1мс?
И это противоречит предыдущемуВот совсем не логично, что значение меняется раз в сек, а период у вас якобы 1 мс.В первую итерацию внешнего цикла значение контрола "Actual End [i-1]" меняется с частотой в 1 сек (1, 2, 3, 4, 5). Всё логично.
На таких скоростях вам точно надо разделять сбор и обработку данных.
Вы его прям на ходу регулируете? Или "контроль" это всего лишь знание того, как оно крутилось, и достаточно восстановить это после?Цикл нужен для контроля направления вращения. Если бы не это, то можно было бы без цикла с заданным интервалом получать текущий угол поворота. Зачем нужен массив, я не понимаю.
Если да, то опять же сбор массивом и обработка в другом месте
графикЧто такое chart?>>рисуйте на chart
Вы окончательно запутались в своих показаниях, разведчик из вас так себе, хоть информацию и скрываете :)Тут тоже не понимаю. Период цикла - 1 мс. После того, как фактическое время окончания итерации превысит 5 сек, то должна отработать максимум 1 итерация. То есть 5 с + 1 мс и цикл закончится. Разве не так?>>И ещё одно "кстати". Ваш внутернний цикл работает вовсе не 5, а 6 сек. Потому что остановка происходит после того, как предыдущий завершился после пятой сек. После этого работает шестой, получает новую точку, и только потом (через ещё 1 сек) он тормозит.
то период внутреннего 1 мс, то 1 с. То "время интегрирования ~100 мс", то 5 сек.
Что же на самом деле?
Впрочем, не важно. Чартом проверьте, что реально на выходе терминала.
И если время действительно 100 мс/1 мс, то совершенно точно выносите обработку в другое место
-
- advanced
- Сообщения: 170
- Зарегистрирован: 18 июл 2019, 13:53
- Версия LabVIEW: 2020
- Откуда: Россия, Ижевск
- Благодарил (а): 33 раза
- Контактная информация:
Re: Проблема с вложенным циклом Timed Loop
Ага. Напрашивается. Только не удалось создать 2 виртуальных канала на одно физическое устройство.>>В текущем состоянии у Вас 2 задачи, которые необходимо выполнять с разной периодичностью.
>>Напрашивается простая схема с 2 параллельными циклами, с необходимым способом синхронизации и передачи данных между циклами.
Я над этим работаю :)>>Цикл вложенный в цикл может иметь неопределенное время исполнения в зависимости от настройки таймеров и режима Timed Loop.
Ещё один косяк. Для расчёта частоты надо использовать не текущее значение угла поворота, а разницу между текущим и предыдущим значениями.>>Опять же в цикле сбора на данный момент не видно зависимости времени выполнения от угла поворота.
На остальное я позже отвечу :)
-
taras_33
- professional
- Сообщения: 392
- Зарегистрирован: 31 окт 2009, 18:25
- Награды: 1
- Версия LabVIEW: 2019
- Поблагодарили: 13 раз
- Контактная информация:
Re: Проблема с вложенным циклом Timed Loop
Вот не пойму зачем читать по одной точке и издеваться над железом?
Устанавливаете частоту опроса скажем 5000 раз в секунду, далее рассчитываете количество точек читаемое за раз в зависимости от частоты обновления.
Скажем хотите чтобы индикаторы обновлялись 10 раз в секунду - тогда интервал между точками 200 микросекунд ( 1/5000 ), значит нужно прочитать 500 точек. (500 х 0.0002 = 0.1)
Вообщем посмотрите скриншот. 10 раз в секунду вы имеете массив углов, а зная время между соседними отсчетами легко определить скорость и направление вращения.
Устанавливаете частоту опроса скажем 5000 раз в секунду, далее рассчитываете количество точек читаемое за раз в зависимости от частоты обновления.
Скажем хотите чтобы индикаторы обновлялись 10 раз в секунду - тогда интервал между точками 200 микросекунд ( 1/5000 ), значит нужно прочитать 500 точек. (500 х 0.0002 = 0.1)
Вообщем посмотрите скриншот. 10 раз в секунду вы имеете массив углов, а зная время между соседними отсчетами легко определить скорость и направление вращения.
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!
So far, the Universe is winning!
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение