ещё раз о FeedBack node

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

Re: ещё раз о FeedBack node

Postby Sevas on 08 Mar 2018, 18:41

Я бы приложил проект, но он настолько разросся и самое главное, что работает только в связке с симулятором.

PS А как свои сообщения править?
Sevas
user
user
 
Posts: 87
Joined: 23 Feb 2011, 19:32
Location: Sevastopol
LabVIEW Version: 13
Karma: 30

Re: ещё раз о FeedBack node

Postby dadreamer on 08 Mar 2018, 20:06

Sevas wrote:PS А как свои сообщения править?

В правом верхнем углу сообщения должна быть кнопка "Правка":
2018-03-08_21-59-32.jpg
2018-03-08_21-59-32.jpg (4.56 KiB) Viewed 627 times

Если кнопки нет, надо несколько раз обновить страницу. Бывает, что пропадает. Если по-прежнему нет, то зайти через другой браузер. Ну, или можно через такую ссылку:
Code: Select all
http://labviewportal.ru/posting.php?mode=edit&f=раздел_форума&p=номер_сообщения

Номер сообщения можно взять, наведя курсор на кнопку "Удалить", "Пожаловаться" или "Цитата". Раздел форума - так же или из url в адресной строке.
Sevas wrote:Я бы приложил проект, но он настолько разросся и самое главное, что работает только в связке с симулятором.

Ну, если вообще никак, то пробуйте в другом :labview: открыть. Или обнуляйте специальным флагом (лог. переменной), как в инструментах point-to-point сделано.
User avatar
dadreamer
professor
professor
 
Posts: 3009
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2017
Karma: 728
I/O VIP vision internet

Re: ещё раз о FeedBack node

Postby Sevas on 08 Mar 2018, 22:00

Попробовал в 14й LV.
И о чудо - снова всё по прежнему. Те же танцы с бубнами ничего не помогают.
Все варианты не реинициализируются после рестарта.
Sevas
user
user
 
Posts: 87
Joined: 23 Feb 2011, 19:32
Location: Sevastopol
LabVIEW Version: 13
Karma: 30

Re: ещё раз о FeedBack node

Postby dadreamer on 08 Mar 2018, 22:29

Sevas, глупый вопрос - SubVI реентерантным делали?
User avatar
dadreamer
professor
professor
 
Posts: 3009
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2017
Karma: 728
I/O VIP vision internet

Re: ещё раз о FeedBack node

Postby Blackman on 08 Mar 2018, 23:46

1. Shift Register должен быть Uninitialized (уберите слева входной 0). Инициализации производится при помощи функции First Call?
2. Для сканирования чисел с разделителем .(точка) используйте строку сканирования %.; %f %f. В этом случае операция замены точек на запятые не нужна.
3. Для задания требуемого порядка выполнения программы (Data Flow) соедините входы VI с источниками данных при помощи проволок (не используйте property nodes).
4. Протестировать работу VI можно без всякого симулятора с различными наборами входных данных.
Blackman
leader
leader
 
Posts: 706
Joined: 17 Jan 2016, 15:02
Medals: 1
Activity (1)
LabVIEW Version: 6.1,8.5,20
Karma: 185

Re: ещё раз о FeedBack node

Postby Sevas on 09 Mar 2018, 10:20

dadreamer с реентрабельностью также безуспешно экспериментировал - в начале темы об этом узнал.

Blackman, shift register пробовал с 0 и без него. Также пробовал с first call, на 1 странице темы об этом также указывали.

по 4, я попробую вечером как-то имитировать работу проекта, чтобы его приложить.
Sevas
user
user
 
Posts: 87
Joined: 23 Feb 2011, 19:32
Location: Sevastopol
LabVIEW Version: 13
Karma: 30

Re: ещё раз о FeedBack node

Postby Sevas on 09 Mar 2018, 20:20

Упростил проект. Проблема воспроизводится.
При старте укажите файлик test.txt
Как только красные координаты доезжают до белой точки то индекс точки Point № увеличивается на +1. Я сделал только с 1 и 2й точкой.

Как только main выполнится, то Point № остается = 2, При рестарте с 2 так и начинается, но по замыслу индекс точки должен обнулиться.

Версия LV 2014
Attachments
Feedback.rar
(95.32 KiB) Downloaded 27 times
Sevas
user
user
 
Posts: 87
Joined: 23 Feb 2011, 19:32
Location: Sevastopol
LabVIEW Version: 13
Karma: 30

Re: ещё раз о FeedBack node

Postby dadreamer on 09 Mar 2018, 22:20

Тут проблема не в Feedback Node. У вас переменная Point_Index, выходящая из узла формулы, частично не инициализирована. Когда (d<5), ей присваивается значение, а в противном случае ничего вообще не делается. Какое значение сохранилось в памяти, такое и используется. Или вообще рандом берётся. Короче, всегда нужно явно задавать все случаи условных переходов, а также не брезговать начальной инициализацией переменных. Вот так работает нормально:
Code: Select all
float64 Point_Index = 0;

d = sqrt( pow(GPS_X - X_point, 2) + pow(GPS_Z - Z_point, 2) );
if (d<5)
Point_Index = Point_Index_prev + 1;
else
Point_Index = Point_Index_prev;

Да, и ноль на инициализатор FN обязательно заведите.
User avatar
dadreamer
professor
professor
 
Posts: 3009
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2017
Karma: 728
I/O VIP vision internet

Re: ещё раз о FeedBack node

Postby Blackman on 09 Mar 2018, 23:10

Все работает, если выполнить рекомендации по п.3 моего предыдущего сообщения и установить инициализацию FN при первом вызове.
Attachments
main.png
Blackman
leader
leader
 
Posts: 706
Joined: 17 Jan 2016, 15:02
Medals: 1
Activity (1)
LabVIEW Version: 6.1,8.5,20
Karma: 185

Re: ещё раз о FeedBack node

Postby Sevas on 10 Mar 2018, 17:52

Blackman, странно, но я пробовал и это тоже. не работало...
рецепт от dadreamer работает.

Но теперь я не совсем понимаю как работает formula node.

Допустим я объявляю переменную int t =0
а дальше, по ходу алгоритма мне требуется с t что-то делать. t= t+50;
Чему тогда будет равен t скажем после второго запуска?
Ведь по логике, при повторном вызове t = 0, а потом t станет равным 50. Но мне нужно допустим чтобы t накапливало каждый тик + 50. Получается t всё время будет равно 50?

int main()
{
int t =0;
while(1)
{
t =t +50; //тут каждый раз t увеливается на +50, а как это будет в Labview?
}
}

Много вот таких вопросов возникает после классических текстовых языков.
Хотя с LV довольно много проектов уже реализовано.
Sevas
user
user
 
Posts: 87
Joined: 23 Feb 2011, 19:32
Location: Sevastopol
LabVIEW Version: 13
Karma: 30

Re: ещё раз о FeedBack node

Postby dadreamer on 10 Mar 2018, 20:44

Sevas wrote:Но теперь я не совсем понимаю как работает formula node.

Допустим я объявляю переменную int t =0
а дальше, по ходу алгоритма мне требуется с t что-то делать. t= t+50;
Чему тогда будет равен t скажем после второго запуска?
Ведь по логике, при повторном вызове t = 0, а потом t станет равным 50. Но мне нужно допустим чтобы t накапливало каждый тик + 50. Получается t всё время будет равно 50?

int main()
{
int t =0;
while(1)
{
t =t +50; //тут каждый раз t увеливается на +50, а как это будет в Labview?
}
}

Будет именно так, как вы пишете: сначала t будет равно 0, потом +50 и так далее. При любом запуске, хоть первом, хоть каком. А вот если убрать int t =0; при втором и следующих запусках t будет браться с предыдущего запуска. Допустим, на первом запуске остановили прогу на t=200. На втором запуске t начнёт увеличиваться не с 0, а с 200. Вот, в вашей программе как раз такой эффект и наблюдался: бралось значение с предыдущего запуска и использовалось в узле формулы (а должно было бы обнуляться сперва).

Рассмотрите вот такой простенький пример:
2018-03-10_22-24-34.jpg
2018-03-10_22-24-34.jpg (13.74 KiB) Viewed 560 times
uninit.vi
lv2011
(4.47 KiB) Downloaded 24 times
Задаём Sel=1, однократно запускаем. Val равен 10. Всё чётко. Задаём теперь Sel=0. Запускаем. Val опять равен 10. И понятно почему - в формуле нет ветки на то, что делать в противном случае. Поэтому программа ничего не делает, сохраняя память неизменной. С предыдущего запуска там болтается 10, вот и видим эту десятку.
Кстати, особо полагаться не неизменность памяти между запусками нельзя, т.к. это не всегда будет работать, особенно в сложном приложении. :labview: часто перераспределяет память, например, при (де)аллокации объектов. Так что ваша ячейка памяти может быть переписана. Потому и советую всегда: 1) объявлять переменные и их начальные значения; 2) прописывать все случаи условных переходов, чтоб не получилось "дыр" в коде. (В большинстве текстовых сред программирования компилятор вам предупреждение выдать должен. В узле формулы это почему-то не делается.)

А если нужно где-то накапливать/суммировать данные, то Formula Node для этого не подходит. Используйте Feedback, Register и прочий функционал.
User avatar
dadreamer
professor
professor
 
Posts: 3009
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2017
Karma: 728
I/O VIP vision internet

Re: ещё раз о FeedBack node

Postby Sevas on 10 Mar 2018, 22:42

Спасибо за разъяснения!
Есть что осмыслить.
Предполагаю, что если всё же и использовать формулы для накопления, то есть смысл ввести промежуточную переменную, которые и использовать совместно с feedback/shift register.
В принципе такой вариант я попробовал, вроде работает, осталось закрепить это в голове.

Ещё раз всем спасибо!

PS Позже запишу видео с самовзлетающим самолетом. И там наклюнулся ещё один интересный вопрос по ПИД регуляторам.
Sevas
user
user
 
Posts: 87
Joined: 23 Feb 2011, 19:32
Location: Sevastopol
LabVIEW Version: 13
Karma: 30

Previous

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

Who is online

Users browsing this forum: Nikol, Yandex and 17 guests

cron