ещё раз о FeedBack node
Re: ещё раз о FeedBack node
Я бы приложил проект, но он настолько разросся и самое главное, что работает только в связке с симулятором.
PS А как свои сообщения править?
PS А как свои сообщения править?
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: ещё раз о FeedBack node
В правом верхнем углу сообщения должна быть кнопка "Правка": Если кнопки нет, надо несколько раз обновить страницу. Бывает, что пропадает. Если по-прежнему нет, то зайти через другой браузер. Ну, или можно через такую ссылку:Sevas писал(а):PS А как свои сообщения править?
Код: Выделить всё
http://labviewportal.org/posting.php?mode=edit&f=раздел_форума&p=номер_сообщения
Ну, если вообще никак, то пробуйте в другом открыть. Или обнуляйте специальным флагом (лог. переменной), как в инструментах point-to-point сделано.Sevas писал(а):Я бы приложил проект, но он настолько разросся и самое главное, что работает только в связке с симулятором.
Re: ещё раз о FeedBack node
Попробовал в 14й LV.
И о чудо - снова всё по прежнему. Те же танцы с бубнами ничего не помогают.
Все варианты не реинициализируются после рестарта.
И о чудо - снова всё по прежнему. Те же танцы с бубнами ничего не помогают.
Все варианты не реинициализируются после рестарта.
-
- leader
- Сообщения: 932
- Зарегистрирован: 17 янв 2016, 15:02
- Награды: 1
- Версия LabVIEW: 6.1,8.5,20
Re: ещё раз о FeedBack node
1. Shift Register должен быть Uninitialized (уберите слева входной 0). Инициализации производится при помощи функции First Call?
2. Для сканирования чисел с разделителем .(точка) используйте строку сканирования %.; %f %f. В этом случае операция замены точек на запятые не нужна.
3. Для задания требуемого порядка выполнения программы (Data Flow) соедините входы VI с источниками данных при помощи проволок (не используйте property nodes).
4. Протестировать работу VI можно без всякого симулятора с различными наборами входных данных.
2. Для сканирования чисел с разделителем .(точка) используйте строку сканирования %.; %f %f. В этом случае операция замены точек на запятые не нужна.
3. Для задания требуемого порядка выполнения программы (Data Flow) соедините входы VI с источниками данных при помощи проволок (не используйте property nodes).
4. Протестировать работу VI можно без всякого симулятора с различными наборами входных данных.
Re: ещё раз о FeedBack node
dadreamer с реентрабельностью также безуспешно экспериментировал - в начале темы об этом узнал.
Blackman, shift register пробовал с 0 и без него. Также пробовал с first call, на 1 странице темы об этом также указывали.
по 4, я попробую вечером как-то имитировать работу проекта, чтобы его приложить.
Blackman, shift register пробовал с 0 и без него. Также пробовал с first call, на 1 странице темы об этом также указывали.
по 4, я попробую вечером как-то имитировать работу проекта, чтобы его приложить.
Re: ещё раз о FeedBack node
Упростил проект. Проблема воспроизводится.
При старте укажите файлик test.txt
Как только красные координаты доезжают до белой точки то индекс точки Point № увеличивается на +1. Я сделал только с 1 и 2й точкой.
Как только main выполнится, то Point № остается = 2, При рестарте с 2 так и начинается, но по замыслу индекс точки должен обнулиться.
Версия LV 2014
При старте укажите файлик test.txt
Как только красные координаты доезжают до белой точки то индекс точки Point № увеличивается на +1. Я сделал только с 1 и 2й точкой.
Как только main выполнится, то Point № остается = 2, При рестарте с 2 так и начинается, но по замыслу индекс точки должен обнулиться.
Версия LV 2014
- Вложения
-
- Feedback.rar
- (95.32 КБ) 117 скачиваний
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: ещё раз о FeedBack node
Тут проблема не в Feedback Node. У вас переменная Point_Index, выходящая из узла формулы, частично не инициализирована. Когда (d<5), ей присваивается значение, а в противном случае ничего вообще не делается. Какое значение сохранилось в памяти, такое и используется. Или вообще рандом берётся. Короче, всегда нужно явно задавать все случаи условных переходов, а также не брезговать начальной инициализацией переменных. Вот так работает нормально:
Да, и ноль на инициализатор FN обязательно заведите.
Код: Выделить всё
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;
-
- leader
- Сообщения: 932
- Зарегистрирован: 17 янв 2016, 15:02
- Награды: 1
- Версия LabVIEW: 6.1,8.5,20
Re: ещё раз о FeedBack node
Все работает, если выполнить рекомендации по п.3 моего предыдущего сообщения и установить инициализацию FN при первом вызове.
Re: ещё раз о FeedBack node
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 довольно много проектов уже реализовано.
рецепт от 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 довольно много проектов уже реализовано.
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: ещё раз о FeedBack node
Будет именно так, как вы пишете: сначала t будет равно 0, потом +50 и так далее. При любом запуске, хоть первом, хоть каком. А вот если убрать int t =0; при втором и следующих запусках t будет браться с предыдущего запуска. Допустим, на первом запуске остановили прогу на t=200. На втором запуске t начнёт увеличиваться не с 0, а с 200. Вот, в вашей программе как раз такой эффект и наблюдался: бралось значение с предыдущего запуска и использовалось в узле формулы (а должно было бы обнуляться сперва).Sevas писал(а):Но теперь я не совсем понимаю как работает 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?
}
}
Рассмотрите вот такой простенький пример: Задаём Sel=1, однократно запускаем. Val равен 10. Всё чётко. Задаём теперь Sel=0. Запускаем. Val опять равен 10. И понятно почему - в формуле нет ветки на то, что делать в противном случае. Поэтому программа ничего не делает, сохраняя память неизменной. С предыдущего запуска там болтается 10, вот и видим эту десятку.
Кстати, особо полагаться не неизменность памяти между запусками нельзя, т.к. это не всегда будет работать, особенно в сложном приложении. часто перераспределяет память, например, при (де)аллокации объектов. Так что ваша ячейка памяти может быть переписана. Потому и советую всегда: 1) объявлять переменные и их начальные значения; 2) прописывать все случаи условных переходов, чтоб не получилось "дыр" в коде. (В большинстве текстовых сред программирования компилятор вам предупреждение выдать должен. В узле формулы это почему-то не делается.)
А если нужно где-то накапливать/суммировать данные, то Formula Node для этого не подходит. Используйте Feedback, Register и прочий функционал.
Re: ещё раз о FeedBack node
Спасибо за разъяснения!
Есть что осмыслить.
Предполагаю, что если всё же и использовать формулы для накопления, то есть смысл ввести промежуточную переменную, которые и использовать совместно с feedback/shift register.
В принципе такой вариант я попробовал, вроде работает, осталось закрепить это в голове.
Ещё раз всем спасибо!
PS Позже запишу видео с самовзлетающим самолетом. И там наклюнулся ещё один интересный вопрос по ПИД регуляторам.
Есть что осмыслить.
Предполагаю, что если всё же и использовать формулы для накопления, то есть смысл ввести промежуточную переменную, которые и использовать совместно с feedback/shift register.
В принципе такой вариант я попробовал, вроде работает, осталось закрепить это в голове.
Ещё раз всем спасибо!
PS Позже запишу видео с самовзлетающим самолетом. И там наклюнулся ещё один интересный вопрос по ПИД регуляторам.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
- 8 Ответы
- 687 Просмотры
-
Последнее сообщение Select
-
- 8 Ответы
- 2035 Просмотры
-
Последнее сообщение Eugene_Eugene