Страница 2 из 2

Re: ещё раз о FeedBack node

Добавлено: 08 мар 2018, 18:41
Sevas
Я бы приложил проект, но он настолько разросся и самое главное, что работает только в связке с симулятором.

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

Re: ещё раз о FeedBack node

Добавлено: 08 мар 2018, 20:06
dadreamer
Sevas писал(а):PS А как свои сообщения править?
В правом верхнем углу сообщения должна быть кнопка "Правка":
2018-03-08_21-59-32.jpg
2018-03-08_21-59-32.jpg (4.56 КБ) 5288 просмотров
Если кнопки нет, надо несколько раз обновить страницу. Бывает, что пропадает. Если по-прежнему нет, то зайти через другой браузер. Ну, или можно через такую ссылку:

Код: Выделить всё

http://labviewportal.org/posting.php?mode=edit&f=раздел_форума&p=номер_сообщения
Номер сообщения можно взять, наведя курсор на кнопку "Удалить", "Пожаловаться" или "Цитата". Раздел форума - так же или из url в адресной строке.
Sevas писал(а):Я бы приложил проект, но он настолько разросся и самое главное, что работает только в связке с симулятором.
Ну, если вообще никак, то пробуйте в другом :labview: открыть. Или обнуляйте специальным флагом (лог. переменной), как в инструментах point-to-point сделано.

Re: ещё раз о FeedBack node

Добавлено: 08 мар 2018, 22:00
Sevas
Попробовал в 14й LV.
И о чудо - снова всё по прежнему. Те же танцы с бубнами ничего не помогают.
Все варианты не реинициализируются после рестарта.

Re: ещё раз о FeedBack node

Добавлено: 08 мар 2018, 22:29
dadreamer
Sevas, глупый вопрос - SubVI реентерантным делали?

Re: ещё раз о FeedBack node

Добавлено: 08 мар 2018, 23:46
Blackman
1. Shift Register должен быть Uninitialized (уберите слева входной 0). Инициализации производится при помощи функции First Call?
2. Для сканирования чисел с разделителем .(точка) используйте строку сканирования %.; %f %f. В этом случае операция замены точек на запятые не нужна.
3. Для задания требуемого порядка выполнения программы (Data Flow) соедините входы VI с источниками данных при помощи проволок (не используйте property nodes).
4. Протестировать работу VI можно без всякого симулятора с различными наборами входных данных.

Re: ещё раз о FeedBack node

Добавлено: 09 мар 2018, 10:20
Sevas
dadreamer с реентрабельностью также безуспешно экспериментировал - в начале темы об этом узнал.

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

по 4, я попробую вечером как-то имитировать работу проекта, чтобы его приложить.

Re: ещё раз о FeedBack node

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

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

Версия LV 2014

Re: ещё раз о FeedBack node

Добавлено: 09 мар 2018, 22:20
dadreamer
Тут проблема не в Feedback Node. У вас переменная Point_Index, выходящая из узла формулы, частично не инициализирована. Когда (d<5), ей присваивается значение, а в противном случае ничего вообще не делается. Какое значение сохранилось в памяти, такое и используется. Или вообще рандом берётся. Короче, всегда нужно явно задавать все случаи условных переходов, а также не брезговать начальной инициализацией переменных. Вот так работает нормально:

Код: Выделить всё

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 обязательно заведите.

Re: ещё раз о FeedBack node

Добавлено: 09 мар 2018, 23:10
Blackman
Все работает, если выполнить рекомендации по п.3 моего предыдущего сообщения и установить инициализацию FN при первом вызове.

Re: ещё раз о FeedBack node

Добавлено: 10 мар 2018, 17:52
Sevas
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 довольно много проектов уже реализовано.

Re: ещё раз о FeedBack node

Добавлено: 10 мар 2018, 20:44
dadreamer
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?
}
}
Будет именно так, как вы пишете: сначала 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 КБ) 5221 просмотр
uninit.vi
lv2011
(4.47 КБ) 110 скачиваний
Задаём Sel=1, однократно запускаем. Val равен 10. Всё чётко. Задаём теперь Sel=0. Запускаем. Val опять равен 10. И понятно почему - в формуле нет ветки на то, что делать в противном случае. Поэтому программа ничего не делает, сохраняя память неизменной. С предыдущего запуска там болтается 10, вот и видим эту десятку.
Кстати, особо полагаться не неизменность памяти между запусками нельзя, т.к. это не всегда будет работать, особенно в сложном приложении. :labview: часто перераспределяет память, например, при (де)аллокации объектов. Так что ваша ячейка памяти может быть переписана. Потому и советую всегда: 1) объявлять переменные и их начальные значения; 2) прописывать все случаи условных переходов, чтоб не получилось "дыр" в коде. (В большинстве текстовых сред программирования компилятор вам предупреждение выдать должен. В узле формулы это почему-то не делается.)

А если нужно где-то накапливать/суммировать данные, то Formula Node для этого не подходит. Используйте Feedback, Register и прочий функционал.

Re: ещё раз о FeedBack node

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

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

PS Позже запишу видео с самовзлетающим самолетом. И там наклюнулся ещё один интересный вопрос по ПИД регуляторам.