FLProg
Вход на сайт
Логин:
Пароль:
Мы в VK
Поиск
Статистика


Яндекс.Метрика
Четверг, 08.12.2016, 03:03
Приветствую Вас Гость | RSS
Главная | Регистрация | Вход

Поиск по сайту


Форум
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Модератор форума: Сергей, support 
Форум » Баг - Трекер » Не принятые » Некорректная работа пользовательского блока CODE
Некорректная работа пользовательского блока CODE
AlexRyzh
Дата: Среда, 02.03.2016, 10:36 | Сообщение # 1
Лейтенант
Группа: Проверенные
Сообщений: 107
Награды: 1
Репутация: 0
Статус: Offline
Делал я пользовательский блок, который должен подать питание на датчик на короткое время и за это время опросить датчик и отключить питание датчика. 
Для того, чтоб кратковременно подать питание на датчик, я использую любой цифровой пин. Но какой это будет пин, я указываю на входном выводе блока ( для удобства, в любой момент поменять используемый пин). Но как выяснилось этот метод не работает должным образом.
Сейчас покажу на простом примере подачи питания на светодиод пин 13.

В разделе Сетап присваиваем переменной номер пина, поступившего со входа:


Ну и собственно сам код программы мигания диодом

Вставляем блок в плату и назначаем на вход пин 13

Открываем компилятор и видим такую картину:

Естественно программа работать не будет, т.к. сначала присваивается переменная, которая еще пустая, а уже в секции Луп присваивается значение этой переменной. 
Почему не наоборот??? Почему то что я указал сделать в разделе Сетап, делается в разделе Луп???
Я понимаю должно быть так:
в разделе сетап, входной переменной присваивается указанное входное значение, и только после этого ledPin получает из нее значение.
Прикрепления: 9658579.jpg(53Kb) · 1913764.jpg(57Kb) · 2369286.jpg(35Kb) · 2368115.jpg(68Kb)
 
Alex16 Дата: Среда, 02.03.2016, 11:51 | Сообщение # 2
Сержант
Группа: Проверенные
Сообщений: 44
Награды: 6
Репутация: 3
Статус: Offline
Молодец ! Сам задал вопрос, сам ответил да еще и выводы сделал, одна только проблема - не работает.
Цитата AlexRyzh6110Я понимаю должно быть так:в разделе сетап, входной переменной
У тебя входная переменная(13) объявляется выходом порта (куда послать данные - порт 13)
Цитата AlexRyzh ()
входной переменной присваивается указанное входное значение ???????
а значение переменной - это что посылаем (1 или 0)
Прикрепления: led-CODE-.ubi(10Kb) · led1-CODE-.ubi(15Kb)


AlexA
 
AlexRyzh Дата: Среда, 02.03.2016, 14:49 | Сообщение # 3
Лейтенант
Группа: Проверенные
Сообщений: 107
Награды: 1
Репутация: 0
Статус: Offline
Особо спорить не буду, я в С не силен, но Не пойму, что изменилось?
В Вашем примере "Led", то что написано для Сетап, прописывается в луп, что есть не корректно.
Насколько я понимаю, выполнение программы происходит сверху вниз. Раздел Сетап выполняется только 1 раз, луп работает по кругу.
Так вот в разделе сетап пину Pin_226911677_1 назначается OUTPUT. Но самой переменной Pin_226911677_1 значение 13 еще не присвоено. Значит Pin_226911677_1 имеет значение 0. И тогда нулевой пин будет назначен выходом.
И только в луп переменная Pin_226911677_1 получает значение 13, но раздел сетап уже никогда об этом не узнает. Он отработал и "уехал домой", честно выполнив свою миссию, назначив нулевой пин выходом.
Каким образом pinMode(Pin_226911677_1, OUTPUT); понимает, что нужно именно 13-й пин назначить выходом, Если 13 ему присваивается после сетап, уже в лупе. Зачем в пин назначать в лупе, если в луп должен попасть только этот код:

digitalWrite(Pin_226911677_1, HIGH);
delay(1000);
digitalWrite(Pin_226911677_1, LOW);
delay(1000);



Добавлено (02.03.2016, 14:49)
---------------------------------------------
Вот есть код мигания светодиодом:

Код
void setup() {                 // Инициализируем цифровой вход/выход в режиме выхода.  
pinMode(13, OUTPUT);

   }
void loop()
{  
digitalWrite(13, HIGH);   // зажигаем светодиод
delay(1000);              // ждем секунду
digitalWrite(13, LOW);    // выключаем светодиод  
delay(1000);              // ждем секунду}

После создания блока код должен выглядить примерно так:

Код
byte Pin_226911677_1;
void setup() {                 // Инициализируем цифровой вход/выход в режиме выхода.  /

Pin_226911677_1 = 13;
pinMode(Pin_226911677_1, OUTPUT);   }
void loop()
                { 
 digitalWrite(Pin_226911677_1, HIGH);   // зажигаем светодиод
delay(1000);              // ждем секунду
digitalWrite(Pin_226911677_1, LOW);    // выключаем светодиод
delay(1000);              // ждем секунду}


Так как создать блок чтоб он выглядел так и соответственно работал?
Прикрепления: 6513455.jpg(83Kb)


Сообщение отредактировал AlexRyzh - Среда, 02.03.2016, 15:15
 
Alex16 Дата: Среда, 02.03.2016, 16:15 | Сообщение # 4
Сержант
Группа: Проверенные
Сообщений: 44
Награды: 6
Репутация: 3
Статус: Offline
Цитата AlexRyzh ()
Так как создать блок чтоб он выглядел так
выглядит
Цитата AlexRyzh ()
и соответственно работал
и работает ...... соответственно
осталось решить какой вариант нужен.
Прикрепления: 3044997.ubi(4Kb)


AlexA
 
Слимпер Дата: Среда, 02.03.2016, 16:47 | Сообщение # 5
Генерал-лейтенант
Группа: Проверенные
Сообщений: 676
Награды: 30
Репутация: 23
Статус: Offline
Ну вообще то я не понял за чем вам по ходу исполнения программы менять номер пина? 
Или все же имелось виду, что при создании платы надо выбрать пин, тогда лучше это сделать через параметры пользователя.
 
AlexRyzh Дата: Четверг, 03.03.2016, 01:12 | Сообщение # 6
Лейтенант
Группа: Проверенные
Сообщений: 107
Награды: 1
Репутация: 0
Статус: Offline
Цитата Alex16 ()
Ну вообще то я не понял за чем вам по ходу исполнения программы менять номер пина?
 Это не так Вы поняли. Не по ходу исполнения, а если блок будет использоваться повторно или в другой сборке. Удобно просто изменить на входе номер пина.

Добавлено (03.03.2016, 01:12)
---------------------------------------------

Цитата AlexRyzh ()
осталось решить какой вариант нужен.
Я так и сделал, и все работает как я хотел, но было бы удобно на входе указывать константу (или переменную) номер пина. Но такой метод не хочет работать.
 
Слимпер Дата: Четверг, 03.03.2016, 15:15 | Сообщение # 7
Генерал-лейтенант
Группа: Проверенные
Сообщений: 676
Награды: 30
Репутация: 23
Статус: Offline
Цитата AlexRyzh ()
Я так и сделал, и все работает как я хотел, но было бы удобно на входе указывать константу (или переменную) номер пина. Но такой метод не хочет работать.
Как я уже писал раньше, для этих целей сейчас работает только через "параметры пользователя". Делал себе блоки и таким образом.
Добавил блок на плату, дважды на нем щёлкнул, ввёл номер пина. По мне так довольно удобно.
Прикрепления: 1431929.ubi(5Kb)


Сообщение отредактировал Слимпер - Четверг, 03.03.2016, 15:16
 
support Дата: Четверг, 03.03.2016, 20:19 | Сообщение # 8
Автор программы
Группа: Администраторы
Сообщений: 579
Награды: 30
Репутация: 21
Статус: Offline
Значения  соответствующим входам переменным присваиваются в момент вызова блока.  Это вполне логично и правильно (программа то выполняется и значение на входе рассчитывается в зависимости от выполнения программы).  В Вашем случае Вам не зачем использовать промежуточную переменную ledPin, а в разделе Loop вместо неё использовать имя входа. И всё будет работать так как Вам нужно.
Я кстати писал в уроке и рассказывал в видео уроке о нежелательности объявления переменных в разделах отличных от DeclareSection, поскольку если Ваш блок использовать два раза в проекте то возникнет ошибка двойного объявления переменной в секции Setup. На данном этапе уникальность объявленных переменных гарантируется только для переменных объявленных в  DeclareSection.


Разработчик программы FLProg
 
AlexRyzh Дата: Четверг, 03.03.2016, 23:01 | Сообщение # 9
Лейтенант
Группа: Проверенные
Сообщений: 107
Награды: 1
Репутация: 0
Статус: Offline
В принципе да, так работает. Но смущает то, что строка rty_158705149_1 = 13; записывается в секцию луп. Зачем в каждом цикле выполнять эту строку? Если ее можно выполнить 1 раз в секции Сетап.
Прикрепления: 5148480.jpg(71Kb)
 
support Дата: Пятница, 04.03.2016, 07:19 | Сообщение # 10
Автор программы
Группа: Администраторы
Сообщений: 579
Награды: 30
Репутация: 21
Статус: Offline
Цитата AlexRyzh ()
Зачем в каждом цикле выполнять эту строку? Если ее можно выполнить 1 раз в секции Сетап.
А если значение на входе меняется? Вообще то для этого входы блоков и предназначены- передавать в блок изменяющиеся значения. А для не изменяющихся (настоечных) значений предназначены параметры блоков.


Разработчик программы FLProg
 
Форум » Баг - Трекер » Не принятые » Некорректная работа пользовательского блока CODE
Страница 1 из 11
Поиск:

FLProg © 2016
Яндекс.Метрика