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

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

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

Postby rsv on 21 Jan 2020, 14:20

Добрый день.
Вопрос по организации вложенных циклов.
Есть внешний цикл, который должен работать до прерывания по кнопке.
И есть внутренний цикл, который должен отработать строго определённое время T1.
Завершение работы внутреннего цикла осуществляется когда время работы цикла становится больше Т1.
После завершения внутреннего цикла должен быть произведён расчёт и сохранение данных и начаться новый внутренний цикл в рамках итерации внешнего цикла.
То есть, каждая итерация внешнего цикла должна начинаться только после завершения работы внутреннего цикла.
И так до тех пор, пока не будет прерван внешний цикл.
Внутренний цикл я организовал типа Timed Loop, а внешний - как While Loop.
Первая итерация внешнего цикла завершается, как и положено, по завершению работы внутреннего цикла. А вот дальше начинаются проблемы.
Проверка прерывания внутреннего цикла реализована для параметра "Actual End [i-1]", а начиная со 2-ой итерации он принимает значение 0 и второе значение с нарастанием.
Почему этот параметр наращивает своё значение, хотя вроде должен расти только до 5000, а потом при новом запуске внутреннего цикла начинать с 0?
Attachments
Вложенные циклы.JPG
rsv
junior
junior
 
Posts: 68
Joined: 18 Jul 2019, 13:53
LabVIEW Version: 2018
Karma: 0

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

Postby Artem.spb on 21 Jan 2020, 17:16

Исходно ненужные навороты.
Зачем внутренний цикл? Подождать 5 сек? тогда зачем каждую итерацию запрашивать счётчик? При этом все значения всё равно выкидываются.
счётчик будет получен в ЛЮБОЙ момент в течение 1 сек периода цикла, так что измерения будут очень сильно скакать.
Ну и кнопка стопа. Уверен, после её нажатия приходится ждать 6-10 сек до завершения программы, т.к. внутренний цикл "зачем-то" делает ещё один ход.

а начиная со 2-ой итерации он принимает значение 0 и второе значение с нарастанием. Почему этот параметр наращивает своё значение, хотя вроде должен расти только до 5000, а потом при новом запуске внутреннего цикла начинать с 0?
тут я совсем не понял. Почему он 0 со второй итерации? Это же "время" окончания предыдущей итерации и обнуляться не должно
Artem.spb
expert
expert
 
Posts: 1731
Joined: 31 Jul 2011, 23:05
Medals: 2
Activity (1) Автор (1)
LabVIEW Version: 12,14,15
Karma: 270
CLD hardware I/O VIP freelance

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

Postby rsv on 22 Jan 2020, 07:58

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

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

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

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

В общем, мне надо следующее:
- каждая итерация внешнего цикла должна начинаться только после завершения внутреннего цикла. А период работы внутреннего цикла определяется временем интегрирования.
rsv
junior
junior
 
Posts: 68
Joined: 18 Jul 2019, 13:53
LabVIEW Version: 2018
Karma: 0

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

Postby IvanLis on 22 Jan 2020, 08:11

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




User avatar
IvanLis
professor
professor
 
Posts: 4864
Joined: 02 Dec 2009, 17:44
Location: СССР
Medals: 7
Activity (2) Professionalism (1) Tutorials (1) Gold (1) Man of the year 2012 (1)
Автор (1)
LabVIEW Version: 2015, 2016
Karma: 787
hardware VIP bloggers teachers

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

Postby Artem.spb on 22 Jan 2020, 12:25

[quote=="rsv"]
Я называю это время интегрирования. За это время надо собрать данные о движении вала энкодера и выдать на ПЧ управляющее воздействие, которое зависит от скорости перемещения и позиции которую выдаёт энкодер и рассчитывается по сложным формулам. Затем снова 5 сек собирать данные и т.д.[/quote]
Что вы называете сбором данных? получение одной точки? Тогда цикл не нужен.
Если нужен массив, то проще, как написал Иван, запросить сразу его опять же без всяких внутренних циклов.

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

1) кнопку можно перенести во внутренний цикл
loop.png
loop.png (10.47 KiB) Viewed 716 times

2) можно жестоко где-то на стороне пристрелить задачу, тогда функция чтения прекратит ожидание отсчётов.

- тут он как то странно отрабатывает, так как на панели значение параметра "Actual End [i-1]" показывает с нарастанием. При каждой следующей итерации внешнего цикла значение параметра увеличивается;
Ещё раз: это НЕ странно, это так и задумано.
Есть системный таймер мс (ф-ия tick count тоже его выдаёт). Это значение того самого таймера в момент завершения предыдущей итерации. Никто вам таймер не сбросит. Правда, я не понял, как умудряется работать первая итерация.

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

А период работы внутреннего цикла определяется временем интегрирования.
А тут у вас опять показания не сходятся.
Вам период внутреннего или внешнего = времени интегрирования?
Точек (значений) счётчика за это "время интегрирования" вам сколько можно накопить?
Artem.spb
expert
expert
 
Posts: 1731
Joined: 31 Jul 2011, 23:05
Medals: 2
Activity (1) Автор (1)
LabVIEW Version: 12,14,15
Karma: 270
CLD hardware I/O VIP freelance

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

Postby rsv on 22 Jan 2020, 13:24

>>А не будет более верным, не считывать по одному отсчету (во внутреннем цикле), а сразу накопить массив отсчетов

Было бы верным, если бы не надо было контролировать направление (по изменению угла поворота). А направление надо контролировать непрерывно, поэтому без цикла я не смог обойтись.
rsv
junior
junior
 
Posts: 68
Joined: 18 Jul 2019, 13:53
LabVIEW Version: 2018
Karma: 0

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

Postby rsv on 22 Jan 2020, 13:38

>>Это значение того самого таймера в момент завершения предыдущей итерации. Никто вам таймер не сбросит.

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

>>А тут у вас опять показания не сходятся. Вам период внутреннего или внешнего = времени интегрирования?

Неточно выразился.
Одна итерация внешнего цикла = время работы внутреннего цикла = время интегрирования.
rsv
junior
junior
 
Posts: 68
Joined: 18 Jul 2019, 13:53
LabVIEW Version: 2018
Karma: 0

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

Postby Artem.spb on 22 Jan 2020, 16:30

[quote=="rsv"]>>А не будет более верным, не считывать по одному отсчету (во внутреннем цикле), а сразу накопить массив отсчетов

Было бы верным, если бы не надо было контролировать направление (по изменению угла поворота). А направление надо контролировать непрерывно, поэтому без цикла я не смог обойтись.[/quote]
Про необходимое количество точек на выходе внутреннего цикла вы так и не сознались.

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

до сих пор я был уверен, что таймер работает всё время, пока работает комп. По крайнем мере tick counter возвращает именно мс с момента последнего включения компа.
Что там происходит с таймированными циклами - не уверен.
Artem.spb
expert
expert
 
Posts: 1731
Joined: 31 Jul 2011, 23:05
Medals: 2
Activity (1) Автор (1)
LabVIEW Version: 12,14,15
Karma: 270
CLD hardware I/O VIP freelance

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

Postby rsv on 23 Jan 2020, 10:44

>>Про необходимое количество точек на выходе внутреннего цикла вы так и не сознались.

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

Зря я упростил блок-диаграмму... Зато когда объяснял что и зачем, то сам лучше понял что и зачем :)

>>до сих пор я был уверен, что таймер работает всё время, пока работает комп. По крайнем мере tick counter возвращает именно мс с момента последнего включения компа.
>>Что там происходит с таймированными циклами - не уверен.

Вот поясняю то, что я вижу (приложил скрин и VI).
Преобразовал время окончания итерации в секунды и вывожу на панель. В первую итерацию внешнего цикла значение контрола "Actual End [i-1]" меняется с частотой в 1 сек (1, 2, 3, 4, 5). Всё логично.
А начиная со 2-ой операции значения быстро мелькают, причём явно видно два значения. Первое - 0, а второе увеличивается с нарастанием (время в секундах начиная с запуски Vi). А я ожидал увидеть то же самое, что в 1-ой итерации.
Attachments
02_Вложенные циклы.JPG
EncoderRT_forum_2.vi
(53.77 KiB) Downloaded 16 times
rsv
junior
junior
 
Posts: 68
Joined: 18 Jul 2019, 13:53
LabVIEW Version: 2018
Karma: 0

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

Postby Artem.spb on 23 Jan 2020, 13:11

[quote=="rsv"] Вся обработка данных во внутреннем цикле заключается в непрерывном (в смысле, максимально частом) определении направления.[/quote]
А оно точно нужно? И 1 раз в сек вы называете максимально частым?

После завершения внутреннего цикла надо иметь 2 числа - угол поворота на момент завершения цикла и точное время за которое этот угол достигнут. Но для этого точки не надо.
Именно, что не надо, для этого даже цикл не нужен. У вас есть "угол" и время, Зачем внутреннее вычисление?

Снова повторяю: что мешает задать частоту опроса и запрашивать с DAQ сразу массив точек за 5 сек? Тогда и код стане проще, и

(приложил скрин и VI).
Преобразовал время окончания итерации в секунды и вывожу на панель. В первую итерацию внешнего цикла значение контрола "Actual End [i-1]" меняется с частотой в 1 сек (1, 2, 3, 4, 5). Всё логично.
А начиная со 2-ой операции значения быстро мелькают, причём явно видно два значения. Первое - 0, а второе увеличивается с нарастанием (время в секундах начиная с запуски Vi). А я ожидал увидеть то же самое, что в 1-ой итерации.
рисуйте на chart, будет понятно, что там за значения. Падение в 0 выглядит очень странно
Счётчик мегагерцовый точно в норме? Зачем мегагерцовый для измерения секунд?
И ещё одно "кстати". Ваш внутернний цикл работает вовсе не 5, а 6 сек. Потому что остановка происходит после того, как предыдущий завершился после пятой сек. После этого работает шестой, получает новую точку, и только потом (через ещё 1 сек) он тормозит.
Artem.spb
expert
expert
 
Posts: 1731
Joined: 31 Jul 2011, 23:05
Medals: 2
Activity (1) Автор (1)
LabVIEW Version: 12,14,15
Karma: 270
CLD hardware I/O VIP freelance

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

Postby rsv on 24 Jan 2020, 08:06

>>А оно точно нужно? И 1 раз в сек вы называете максимально частым?
Точно нужно. Рабочий режим: время интегрирования ~100 мс, контроль направления вращения ~1 мс.

>>Снова повторяю: что мешает задать частоту опроса и запрашивать с DAQ сразу массив точек за 5 сек? Тогда и код стане проще, и
Я не понимаю Вашу идею.
Цикл нужен для контроля направления вращения. Если бы не это, то можно было бы без цикла с заданным интервалом получать текущий угол поворота. Зачем нужен массив, я не понимаю.

>>рисуйте на chart
Что такое chart?

>>И ещё одно "кстати". Ваш внутернний цикл работает вовсе не 5, а 6 сек. Потому что остановка происходит после того, как предыдущий завершился после пятой сек. После этого работает шестой, получает новую точку, и только потом (через ещё 1 сек) он тормозит.
Тут тоже не понимаю. Период цикла - 1 мс. После того, как фактическое время окончания итерации превысит 5 сек, то должна отработать максимум 1 итерация. То есть 5 с + 1 мс и цикл закончится. Разве не так?
rsv
junior
junior
 
Posts: 68
Joined: 18 Jul 2019, 13:53
LabVIEW Version: 2018
Karma: 0

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

Postby ujin on 24 Jan 2020, 12:58

В текущем состоянии у Вас 2 задачи, которые необходимо выполнять с разной периодичностью.
Напрашивается простая схема с 2 параллельными циклами, с необходимым способом синхронизации и передачи данных между циклами.
Цикл вложенный в цикл может иметь неопределенное время исполнения в зависимости от настройки таймеров и режима Timed Loop.
Опять же в цикле сбора на данный момент не видно зависимости времени выполнения от угла поворота.
ujin
beginner
beginner
 
Posts: 36
Joined: 28 Jul 2019, 13:16
LabVIEW Version: 15
Karma: 5

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

Postby Artem.spb on 24 Jan 2020, 13:28

[quote=="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 мс, то совершенно точно выносите обработку в другое место
Artem.spb
expert
expert
 
Posts: 1731
Joined: 31 Jul 2011, 23:05
Medals: 2
Activity (1) Автор (1)
LabVIEW Version: 12,14,15
Karma: 270
CLD hardware I/O VIP freelance

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

Postby rsv on 24 Jan 2020, 16:31

>>В текущем состоянии у Вас 2 задачи, которые необходимо выполнять с разной периодичностью.
>>Напрашивается простая схема с 2 параллельными циклами, с необходимым способом синхронизации и передачи данных между циклами.
Ага. Напрашивается. Только не удалось создать 2 виртуальных канала на одно физическое устройство.

>>Цикл вложенный в цикл может иметь неопределенное время исполнения в зависимости от настройки таймеров и режима Timed Loop.
Я над этим работаю :)

>>Опять же в цикле сбора на данный момент не видно зависимости времени выполнения от угла поворота.
Ещё один косяк. Для расчёта частоты надо использовать не текущее значение угла поворота, а разницу между текущим и предыдущим значениями.

На остальное я позже отвечу :)
rsv
junior
junior
 
Posts: 68
Joined: 18 Jul 2019, 13:53
LabVIEW Version: 2018
Karma: 0

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

Postby taras_33 on 24 Jan 2020, 19: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!
User avatar
taras_33
professional
professional
 
Posts: 323
Joined: 31 Oct 2009, 18:25
Medals: 1
Activity (1)
LabVIEW Version: 2019
Karma: 139
CLD VIP

Next

Return to Для чайников

Who is online

Users browsing this forum: Google and 6 guests

cron