Проблема с вложенным циклом Timed Loop

Простейшие вопросы в области инженерной разработки
rsv
advanced
advanced
Сообщения: 170
Зарегистрирован: 18 июл 2019, 13:53
Версия LabVIEW: 2020
Откуда: Россия, Ижевск
Благодарил (а): 33 раза
Контактная информация:

Проблема с вложенным циклом Timed Loop

Сообщение rsv »

Добрый день.
Вопрос по организации вложенных циклов.
Есть внешний цикл, который должен работать до прерывания по кнопке.
И есть внутренний цикл, который должен отработать строго определённое время T1.
Завершение работы внутреннего цикла осуществляется когда время работы цикла становится больше Т1.
После завершения внутреннего цикла должен быть произведён расчёт и сохранение данных и начаться новый внутренний цикл в рамках итерации внешнего цикла.
То есть, каждая итерация внешнего цикла должна начинаться только после завершения работы внутреннего цикла.
И так до тех пор, пока не будет прерван внешний цикл.
Внутренний цикл я организовал типа Timed Loop, а внешний - как While Loop.
Первая итерация внешнего цикла завершается, как и положено, по завершению работы внутреннего цикла. А вот дальше начинаются проблемы.
Проверка прерывания внутреннего цикла реализована для параметра "Actual End [i-1]", а начиная со 2-ой итерации он принимает значение 0 и второе значение с нарастанием.
Почему этот параметр наращивает своё значение, хотя вроде должен расти только до 5000, а потом при новом запуске внутреннего цикла начинать с 0?
Вложения
Вложенные циклы.JPG
Artem.spb

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

Re: Проблема с вложенным циклом Timed Loop

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

Исходно ненужные навороты.
Зачем внутренний цикл? Подождать 5 сек? тогда зачем каждую итерацию запрашивать счётчик? При этом все значения всё равно выкидываются.
счётчик будет получен в ЛЮБОЙ момент в течение 1 сек периода цикла, так что измерения будут очень сильно скакать.
Ну и кнопка стопа. Уверен, после её нажатия приходится ждать 6-10 сек до завершения программы, т.к. внутренний цикл "зачем-то" делает ещё один ход.
а начиная со 2-ой итерации он принимает значение 0 и второе значение с нарастанием. Почему этот параметр наращивает своё значение, хотя вроде должен расти только до 5000, а потом при новом запуске внутреннего цикла начинать с 0?
тут я совсем не понял. Почему он 0 со второй итерации? Это же "время" окончания предыдущей итерации и обнуляться не должно
rsv
advanced
advanced
Сообщения: 170
Зарегистрирован: 18 июл 2019, 13:53
Версия LabVIEW: 2020
Откуда: Россия, Ижевск
Благодарил (а): 33 раза
Контактная информация:

Re: Проблема с вложенным циклом Timed Loop

Сообщение rsv »

>> Исходно ненужные навороты.
VI сильно упрощена. Убрал то, что, как мне показалось, не имело отношение к проблеме.

>>Зачем внутренний цикл? Подождать 5 сек?
Я называю это время интегрирования. За это время надо собрать данные о движении вала энкодера и выдать на ПЧ управляющее воздействие, которое зависит от скорости перемещения и позиции которую выдаёт энкодер и рассчитывается по сложным формулам. Затем снова 5 сек собирать данные и т.д.

>>Ну и кнопка стопа. Уверен, после её нажатия приходится ждать 6-10 сек до завершения программы, т.к. внутренний цикл "зачем-то" делает ещё один ход.
Это мой косяк. По кнопке Стоп надо как-то прерывать внутренний цикл.

>>тут я совсем не понял. Почему он 0 со второй итерации? Это же "время" окончания предыдущей итерации и обнуляться не должно
Как я себе представляю работу вложенных циклов в данном случае:
Первая итерация внешнего цикла:
- внутренний цикл работает до тех пор, пока значение параметра "Actual End [i-1]" меньше времени интегрирования. Затем внутренний цикл прерывается;
Это отрабатывает как я ожидаю.
Начинается вторая итерация внешнего цикла.
- тут он как то странно отрабатывает, так как на панели значение параметра "Actual End [i-1]" показывает с нарастанием. При каждой следующей итерации внешнего цикла значение параметра увеличивается;

В общем, мне надо следующее:
- каждая итерация внешнего цикла должна начинаться только после завершения внутреннего цикла. А период работы внутреннего цикла определяется временем интегрирования.
Аватара пользователя
IvanLis

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

Re: Проблема с вложенным циклом Timed Loop

Сообщение IvanLis »

А не будет более верным, не считывать по одному отсчету (во внутреннем цикле), а сразу накопить массив отсчетов и их обработать (по страшно сложной формуле)... :crazy:
Только если обработка действительно ресурсоемкая, то делать это нужно в параллельном цикле, иначе Вы должны гарантировать, что за время накопления следующей партии отсчетов, вычисления и отображение будут закончены и программа готова принять следующую партию для обработки.
Artem.spb

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

Re: Проблема с вложенным циклом Timed Loop

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

="rsv" писал(а): Я называю это время интегрирования. За это время надо собрать данные о движении вала энкодера и выдать на ПЧ управляющее воздействие, которое зависит от скорости перемещения и позиции которую выдаёт энкодер и рассчитывается по сложным формулам. Затем снова 5 сек собирать данные и т.д.
Что вы называете сбором данных? получение одной точки? Тогда цикл не нужен.
Если нужен массив, то проще, как написал Иван, запросить сразу его опять же без всяких внутренних циклов.
>>Ну и кнопка стопа. Уверен, после её нажатия приходится ждать 6-10 сек до завершения программы, т.к. внутренний цикл "зачем-то" делает ещё один ход.
Это мой косяк. По кнопке Стоп надо как-то прерывать внутренний цикл.
1) кнопку можно перенести во внутренний цикл
loop.png
loop.png (10.47 КБ) 3140 просмотров
2) можно жестоко где-то на стороне пристрелить задачу, тогда функция чтения прекратит ожидание отсчётов.
- тут он как то странно отрабатывает, так как на панели значение параметра "Actual End [i-1]" показывает с нарастанием. При каждой следующей итерации внешнего цикла значение параметра увеличивается;
Ещё раз: это НЕ странно, это так и задумано.
Есть системный таймер мс (ф-ия tick count тоже его выдаёт). Это значение того самого таймера в момент завершения предыдущей итерации. Никто вам таймер не сбросит. Правда, я не понял, как умудряется работать первая итерация.
В общем, мне надо следующее:
- каждая итерация внешнего цикла должна начинаться только после завершения внутреннего цикла.
Это как бы самом собой происходит. Вы не сможете начать вторую итерацию до завершения первой, т.е до выполнения всего кода внутри цикла
А период работы внутреннего цикла определяется временем интегрирования.
А тут у вас опять показания не сходятся.
Вам период внутреннего или внешнего = времени интегрирования?
Точек (значений) счётчика за это "время интегрирования" вам сколько можно накопить?
rsv
advanced
advanced
Сообщения: 170
Зарегистрирован: 18 июл 2019, 13:53
Версия LabVIEW: 2020
Откуда: Россия, Ижевск
Благодарил (а): 33 раза
Контактная информация:

Re: Проблема с вложенным циклом Timed Loop

Сообщение rsv »

>>А не будет более верным, не считывать по одному отсчету (во внутреннем цикле), а сразу накопить массив отсчетов
Было бы верным, если бы не надо было контролировать направление (по изменению угла поворота). А направление надо контролировать непрерывно, поэтому без цикла я не смог обойтись.
rsv
advanced
advanced
Сообщения: 170
Зарегистрирован: 18 июл 2019, 13:53
Версия LabVIEW: 2020
Откуда: Россия, Ижевск
Благодарил (а): 33 раза
Контактная информация:

Re: Проблема с вложенным циклом Timed Loop

Сообщение rsv »

>>Это значение того самого таймера в момент завершения предыдущей итерации. Никто вам таймер не сбросит.
Я понимаю что это значение таймера в момент завершения предыдущей итерации. До меня не доходит следующее - когда начинается новая итерация внешнего цикла, внутренний цикл должен начать отсчёт с 0 и до тех пор, пока время фактического завершения итерации не станет больше времени интегрирования. А на самом деле он начинает отсчёт с времени завершения предыдущей итерации. Получается, что таймер работает пока работает vI. Так?
>>А тут у вас опять показания не сходятся. Вам период внутреннего или внешнего = времени интегрирования?
Неточно выразился.
Одна итерация внешнего цикла = время работы внутреннего цикла = время интегрирования.
Artem.spb

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

Re: Проблема с вложенным циклом Timed Loop

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

="rsv" писал(а):
>>А не будет более верным, не считывать по одному отсчету (во внутреннем цикле), а сразу накопить массив отсчетов
Было бы верным, если бы не надо было контролировать направление (по изменению угла поворота). А направление надо контролировать непрерывно, поэтому без цикла я не смог обойтись.
Про необходимое количество точек на выходе внутреннего цикла вы так и не сознались.
Я понимаю что это значение таймера в момент завершения предыдущей итерации. До меня не доходит следующее - когда начинается новая итерация внешнего цикла, внутренний цикл должен начать отсчёт с 0 и до тех пор, пока время фактического завершения итерации не станет больше времени интегрирования. А на самом деле он начинает отсчёт с времени завершения предыдущей итерации. Получается, что таймер работает пока работает vI. Так?
до сих пор я был уверен, что таймер работает всё время, пока работает комп. По крайнем мере tick counter возвращает именно мс с момента последнего включения компа.
Что там происходит с таймированными циклами - не уверен.
rsv
advanced
advanced
Сообщения: 170
Зарегистрирован: 18 июл 2019, 13:53
Версия LabVIEW: 2020
Откуда: Россия, Ижевск
Благодарил (а): 33 раза
Контактная информация:

Re: Проблема с вложенным циклом Timed Loop

Сообщение rsv »

>>Про необходимое количество точек на выходе внутреннего цикла вы так и не сознались.
Даже не знаю что сказать про количество точек. Вся обработка данных во внутреннем цикле заключается в непрерывном (в смысле, максимально частом) определении направления.
После завершения внутреннего цикла надо иметь 2 числа - угол поворота на момент завершения цикла и точное время за которое этот угол достигнут. Но для этого точки не надо.

Зря я упростил блок-диаграмму... Зато когда объяснял что и зачем, то сам лучше понял что и зачем :)
>>до сих пор я был уверен, что таймер работает всё время, пока работает комп. По крайнем мере tick counter возвращает именно мс с момента последнего включения компа.
>>Что там происходит с таймированными циклами - не уверен.
Вот поясняю то, что я вижу (приложил скрин и VI).
Преобразовал время окончания итерации в секунды и вывожу на панель. В первую итерацию внешнего цикла значение контрола "Actual End [i-1]" меняется с частотой в 1 сек (1, 2, 3, 4, 5). Всё логично.
А начиная со 2-ой операции значения быстро мелькают, причём явно видно два значения. Первое - 0, а второе увеличивается с нарастанием (время в секундах начиная с запуски Vi). А я ожидал увидеть то же самое, что в 1-ой итерации.
Вложения
02_Вложенные циклы.JPG
EncoderRT_forum_2.vi
(53.77 КБ) 91 скачивание
Artem.spb

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

Re: Проблема с вложенным циклом Timed Loop

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

="rsv" писал(а): Вся обработка данных во внутреннем цикле заключается в непрерывном (в смысле, максимально частом) определении направления.
А оно точно нужно? И 1 раз в сек вы называете максимально частым?
После завершения внутреннего цикла надо иметь 2 числа - угол поворота на момент завершения цикла и точное время за которое этот угол достигнут. Но для этого точки не надо.
Именно, что не надо, для этого даже цикл не нужен. У вас есть "угол" и время, Зачем внутреннее вычисление?

Снова повторяю: что мешает задать частоту опроса и запрашивать с DAQ сразу массив точек за 5 сек? Тогда и код стане проще, и
(приложил скрин и VI).
Преобразовал время окончания итерации в секунды и вывожу на панель. В первую итерацию внешнего цикла значение контрола "Actual End [i-1]" меняется с частотой в 1 сек (1, 2, 3, 4, 5). Всё логично.
А начиная со 2-ой операции значения быстро мелькают, причём явно видно два значения. Первое - 0, а второе увеличивается с нарастанием (время в секундах начиная с запуски Vi). А я ожидал увидеть то же самое, что в 1-ой итерации.
рисуйте на chart, будет понятно, что там за значения. Падение в 0 выглядит очень странно
Счётчик мегагерцовый точно в норме? Зачем мегагерцовый для измерения секунд?
И ещё одно "кстати". Ваш внутернний цикл работает вовсе не 5, а 6 сек. Потому что остановка происходит после того, как предыдущий завершился после пятой сек. После этого работает шестой, получает новую точку, и только потом (через ещё 1 сек) он тормозит.
rsv
advanced
advanced
Сообщения: 170
Зарегистрирован: 18 июл 2019, 13:53
Версия LabVIEW: 2020
Откуда: Россия, Ижевск
Благодарил (а): 33 раза
Контактная информация:

Re: Проблема с вложенным циклом Timed Loop

Сообщение rsv »

>>А оно точно нужно? И 1 раз в сек вы называете максимально частым?
Точно нужно. Рабочий режим: время интегрирования ~100 мс, контроль направления вращения ~1 мс.
>>Снова повторяю: что мешает задать частоту опроса и запрашивать с DAQ сразу массив точек за 5 сек? Тогда и код стане проще, и
Я не понимаю Вашу идею.
Цикл нужен для контроля направления вращения. Если бы не это, то можно было бы без цикла с заданным интервалом получать текущий угол поворота. Зачем нужен массив, я не понимаю.
>>рисуйте на chart
Что такое chart?
>>И ещё одно "кстати". Ваш внутернний цикл работает вовсе не 5, а 6 сек. Потому что остановка происходит после того, как предыдущий завершился после пятой сек. После этого работает шестой, получает новую точку, и только потом (через ещё 1 сек) он тормозит.
Тут тоже не понимаю. Период цикла - 1 мс. После того, как фактическое время окончания итерации превысит 5 сек, то должна отработать максимум 1 итерация. То есть 5 с + 1 мс и цикл закончится. Разве не так?
ujin
user
user
Сообщения: 94
Зарегистрирован: 28 июл 2019, 13:16
Версия LabVIEW: 19
Благодарил (а): 2 раза
Поблагодарили: 3 раза
Контактная информация:

Re: Проблема с вложенным циклом Timed Loop

Сообщение ujin »

В текущем состоянии у Вас 2 задачи, которые необходимо выполнять с разной периодичностью.
Напрашивается простая схема с 2 параллельными циклами, с необходимым способом синхронизации и передачи данных между циклами.
Цикл вложенный в цикл может иметь неопределенное время исполнения в зависимости от настройки таймеров и режима Timed Loop.
Опять же в цикле сбора на данный момент не видно зависимости времени выполнения от угла поворота.
Artem.spb

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

Re: Проблема с вложенным циклом Timed Loop

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

="rsv" писал(а):
>>А оно точно нужно? И 1 раз в сек вы называете максимально частым?
Точно нужно. Рабочий режим: время интегрирования ~100 мс, контроль направления вращения ~1 мс.
МИЛЛИсекунда?
вы уверены, что "on demand" запросы к оборудованию обеспечивают период 1мс?
И это противоречит предыдущему
В первую итерацию внешнего цикла значение контрола "Actual End [i-1]" меняется с частотой в 1 сек (1, 2, 3, 4, 5). Всё логично.
Вот совсем не логично, что значение меняется раз в сек, а период у вас якобы 1 мс.
На таких скоростях вам точно надо разделять сбор и обработку данных.
Цикл нужен для контроля направления вращения. Если бы не это, то можно было бы без цикла с заданным интервалом получать текущий угол поворота. Зачем нужен массив, я не понимаю.
Вы его прям на ходу регулируете? Или "контроль" это всего лишь знание того, как оно крутилось, и достаточно восстановить это после?
Если да, то опять же сбор массивом и обработка в другом месте
>>рисуйте на chart
Что такое chart?
график
>>И ещё одно "кстати". Ваш внутернний цикл работает вовсе не 5, а 6 сек. Потому что остановка происходит после того, как предыдущий завершился после пятой сек. После этого работает шестой, получает новую точку, и только потом (через ещё 1 сек) он тормозит.
Тут тоже не понимаю. Период цикла - 1 мс. После того, как фактическое время окончания итерации превысит 5 сек, то должна отработать максимум 1 итерация. То есть 5 с + 1 мс и цикл закончится. Разве не так?
Вы окончательно запутались в своих показаниях, разведчик из вас так себе, хоть информацию и скрываете :)
то период внутреннего 1 мс, то 1 с. То "время интегрирования ~100 мс", то 5 сек.
Что же на самом деле?
Впрочем, не важно. Чартом проверьте, что реально на выходе терминала.
И если время действительно 100 мс/1 мс, то совершенно точно выносите обработку в другое место
rsv
advanced
advanced
Сообщения: 170
Зарегистрирован: 18 июл 2019, 13:53
Версия LabVIEW: 2020
Откуда: Россия, Ижевск
Благодарил (а): 33 раза
Контактная информация:

Re: Проблема с вложенным циклом Timed Loop

Сообщение rsv »

>>В текущем состоянии у Вас 2 задачи, которые необходимо выполнять с разной периодичностью.
>>Напрашивается простая схема с 2 параллельными циклами, с необходимым способом синхронизации и передачи данных между циклами.
Ага. Напрашивается. Только не удалось создать 2 виртуальных канала на одно физическое устройство.
>>Цикл вложенный в цикл может иметь неопределенное время исполнения в зависимости от настройки таймеров и режима Timed Loop.
Я над этим работаю :)
>>Опять же в цикле сбора на данный момент не видно зависимости времени выполнения от угла поворота.
Ещё один косяк. Для расчёта частоты надо использовать не текущее значение угла поворота, а разницу между текущим и предыдущим значениями.

На остальное я позже отвечу :)
Аватара пользователя
taras_33

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

Re: Проблема с вложенным циклом Timed Loop

Сообщение taras_33 »

Вот не пойму зачем читать по одной точке и издеваться над железом?
Устанавливаете частоту опроса скажем 5000 раз в секунду, далее рассчитываете количество точек читаемое за раз в зависимости от частоты обновления.
Скажем хотите чтобы индикаторы обновлялись 10 раз в секунду - тогда интервал между точками 200 микросекунд ( 1/5000 ), значит нужно прочитать 500 точек. (500 х 0.0002 = 0.1)
Вообщем посмотрите скриншот.
Encoder.png
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!
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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