Тема / Topic: Светодиодная панель 3х3 на языке Techno ST
Krivosheev
Junior Member / Новичок
Участник № / Member № 6685
отправлено / posted
Здравствуйте. Помогите, пожалуйста в решении вопроса. Поставлена задача реализовать работу светодиодной панели 3х3. При подачи питания на панель (в моём случае с помощью выключателя) панель должна не просто включиться, а иметь индикацию, а именно индикаторы должны включаться попарно, то есть верхние три диода должны включиться, отключиться и включится средний ряд из трёх диодов, затем средний ряд отключается и включается последний ряд из трёх диодов. В кач-ве диодов выбраны выключатели с двумя состояниями, привязаны по каналам HEX_16. В программе также каждый элемент к своему каналу. Выключатель - кнопка, по нажатию которой подаётся сигнал TRUE и запускается программа. Вот, собственно сама программа: PROGRAM VAR_INOUT i_1_C : BOOL; END_VAR VAR_INOUT i_2_C : BOOL; END_VAR VAR_INOUT i_3_C : BOOL; END_VAR VAR_INOUT i_4_C : BOOL; END_VAR VAR_INOUT i_5_C : BOOL; END_VAR VAR_INOUT i_6_C : BOOL; END_VAR VAR_INOUT i_7_C : BOOL; END_VAR VAR_INOUT i_8_C : BOOL; END_VAR VAR_INOUT i_9_C : BOOL; END_VAR VAR_INPUT i : INT := 0; END_VAR VAR_INPUT switch_C : BOOL; END_VAR
IF (!switch_C) THEN goto c1; C1: REPEAT i_1_C = TRUE; i_2_C = TRUE; i_3_C = TRUE; i = i + 2; UNTIL i < 20 END_REPEAT; REPEAT i_1_C = FALSE; i_2_C = FALSE; i_3_C = FALSE; i_4_C = TRUE; i_5_C = TRUE; i_6_C = TRUE; i = i + 2; UNTIL i < 40 END_REPEAT; REPEAT i_4_C = FALSE; i_5_C = FALSE; i_6_C = FALSE; i_7_C = TRUE; i_8_C = TRUE; i_9_C = TRUE; i = i + 2; UNTIL i < 60 END_REPEAT; else goto c2; C2: END_IF;
END_PROGRAM. !НО! При запуске профайлера программа просто не работает, хотя сам профайлер запускается. Может кто-нибудь подсказать, в чём может быть причина? Необходимо написать программу именно на Techno ST. Компилируется без ошибок, но реакции нет. Прошу прощения за длинный вопрос. Очень надеюсь на Вашу помощь, не могу реализовать такую простую схему уже порядка двух недель, а срок уже поджимает . В примерах подобной задачи не нашел. С Уважением, Николай.
Сообщения / Posts 11 | Из / From: Россия
| IP / IP: IP адрес / IP address |
отправлено / posted
Вы неверно понимаете функционирование программы. Вне зависимости от используемого языка при каждом вызове программы (с циклом обработки канала, вызывающего программу) при условии !switch_C будут исполнены все 3 оператора REPEAT. Поэтому все выходные переменные всегда будут иметь постоянные значения: i_1_C = FALSE; i_2_C = FALSE; i_3_C = FALSE; i_4_C = FALSE; i_5_C = FALSE; i_6_C = FALSE; i_7_C = TRUE; i_8_C = TRUE; i_9_C = TRUE;
Программу надо переделывать.
Разработка программ под задачи пользователей не входит в функции службы технической поддержки. Надеемся на понимание.
Krivosheev
Junior Member / Новичок
Участник № / Member № 6685
отправлено / posted
Прошу прощения, не сможете подсказать - возможна ли реализация данной задачи? Или гиблое дело? Стоит ли мне продолжить попытки реализации или пробовать другое ПО ?
Сообщения / Posts 11 | Из / From: Россия
| IP / IP: IP адрес / IP address |
Krivosheev
Junior Member / Новичок
Участник № / Member № 6685
отправлено / posted
И, тем не менее, реализация даже столь простого на первый взгляд вопроса под сомнением.. Изменил программу, используя оператор repeat или оператор while, но проект некорректно работает, как и в первый раз. Выполняется только конечная строка, а именно работает нижний ряд диодов. Может кто-нибудь подкинуть идею, как реализовать поставленную задачу? Мои идеи кончились.
Сообщения / Posts 11 | Из / From: Россия
| IP / IP: IP адрес / IP address |
Alex210271
Active Forum Member / Активный участник форума
Участник № / Member № 4421
отправлено / posted
Вот Вам принцип построения подобной программы:
IF I>= 0 AND I <= 20 THEN ARG_000 = 1; ARG_001 = 0; ARG_002 = 0; end_if; IF I> 20 AND I <= 40 THEN ARG_000 = 0; ARG_001 = 1; ARG_002 = 0; end_if; IF I> 40 AND I <= 60 THEN ARG_000 = 0; ARG_001 = 0; ARG_002 = 1; end_if; If I < 60 Then I= I + 1; else I = 0; End_if;
END_PROGRAM
Вам нужно понять принцип работы Trace Mode. Каналы [и программы, в том числе] и так выполняются циклически с заданным периодом и единицами цикла [см. каналы типа CALL.PROGRAM] поэтому никаких циклов в программе не надо нужны только условия и действия. И конечно правильно подобрать период вызова программы. В моем примере параметр I растет от 0 до 60 при каждом вызове программы и в зависимости от его значения первые двадцать циклов ARG_000 равен 1, затем двадцать циклов ARG_001 равен 1 и тд.
Сообщения / Posts 80 | Из / From: Россия
| IP / IP: IP адрес / IP address |
Alex210271
Active Forum Member / Активный участник форума
Участник № / Member № 4421
отправлено / posted
Циклы нужны только если у вас за один вызов программы должно выполниться множество действий. Так у Вас и работает. Мгновенно пробегает ВСЕ циклы и выдает на выходе только последние значения. То есть горит третий ряд светодиодов.
Сообщения / Posts 80 | Из / From: Россия
| IP / IP: IP адрес / IP address |
Nico
Forum Professor / Завсегдатай форума
Участник № / Member № 5342
IF I == 0 THEN ARG_000 = 1; ARG_001 = 0; ARG_002 = 0; end_if; IF I == 1 THEN ARG_000 = 0; ARG_001 = 1; ARG_002 = 0; end_if; IF I == 2 THEN ARG_000 = 0; ARG_001 = 0; ARG_002 = 1; end_if; I= I + 1; IF I == 3 THEN I=0 End_if;
Alex210271
Active Forum Member / Активный участник форума
Участник № / Member № 4421
отправлено / posted
Уважаемый Nico совершенно прав. Так должна выглядеть эта программа в действительности. Можно также попробовать вместо операторов If использовать оператор CASE. Я просто не хотел давать готовый ответ, а дать идею для развития. Кроме того, мой вариант может позволить сделать каждый из трех периодов свечения разной длительности.
Сообщения / Posts 80 | Из / From: Россия
| IP / IP: IP адрес / IP address |
Krivosheev
Junior Member / Новичок
Участник № / Member № 6685
отправлено / posted
Спасибо Вам большое, Nico и Alex210271 за подробное объяснение принципа работы программы. Не думаю, что без Вашей помощи я пришел бы к правильному выводу. Ещё раз спасибо!
Сообщения / Posts 11 | Из / From: Россия
| IP / IP: IP адрес / IP address |
Krivosheev
Junior Member / Новичок
Участник № / Member № 6685
отправлено / posted
Странно, но из просмотра переменных при запуске программы в обоих случаях только первый диод принимает значение 1. Остальные же не реагируют. Проблема может быть в периоде пересчета? Или же в самом канале?
Сообщения / Posts 11 | Из / From: Россия
| IP / IP: IP адрес / IP address |
Alex210271
Active Forum Member / Активный участник форума
Участник № / Member № 4421
отправлено / posted
Программа работает именно так как указывалось. Какое-то время первый аргумент равен единице, затем второй, потом третий. Для того чтобы понять есть ли проблема в периоде пересчета, неплохо бы узнать каким у Вас задан этот период для канала вызова программы. И я надеюсь что этот канал имеет тип input и правильные привязки к каналам управления светодиодами. И какой вариант программы мой или Nico вы взяли за основу своей версии.
Сообщения / Posts 80 | Из / From: Россия
| IP / IP: IP адрес / IP address |
Krivosheev
Junior Member / Новичок
Участник № / Member № 6685
отправлено / posted
За основу был взят Ваш вариант программы, потому как имеется возможность задать различное время работы диода. Безусловно, канал имеет тип input и привязан правильно. Пробовал период пересчета 1 и 5 сек, а также 10 или 20 циклов calc.
Сообщения / Posts 11 | Из / From: Россия
| IP / IP: IP адрес / IP address |
Krivosheev
Junior Member / Новичок
Участник № / Member № 6685
отправлено / posted
Прошу прощения, в программе разобрался! Достаточно ли на ГЭ создать кнопку с привязкой по каналу типа OUTPUT с созданной программой и атрибутом "Выполнить" ? Или же следует сделать канал типа INPUT и подавать значение "1" для запуска программы?
Сообщения / Posts 11 | Из / From: Россия
| IP / IP: IP адрес / IP address |
Alex210271
Active Forum Member / Активный участник форума
Участник № / Member № 4421
отправлено / posted
Программа вызываемая каналом Call типа Input работает непрерывно со своим периодом пересчета. Нужно либо в программе добавить условие которое будет выполнять или пропускать основное тело, ту часть программы которую Вы уже отладили, или включать и выключать программу в нужный момент. Можно канал изначально выключить (атрибут 3, с) потом по кнопке включить, изменив третий атрибут на ноль, и выключить командой изнутри программы при помощи функции setAttributeI(UDINT ch_id, UINT attr_id, DINT value) где первый параметр ID канала вызывающего программу (нужно Call вызова программы привязать как её же аргумент с атрибутом 118, ID) второй параметр номер атрибута - как раз 3, и третий параметр - 1 значение третьего атрибута которое будет установлено. Эту команду нужно вставить где-то в конце и при проверке условия что счетчик I достиг заданного значения.
Сообщения / Posts 80 | Из / From: Россия
| IP / IP: IP адрес / IP address |
Krivosheev
Junior Member / Новичок
Участник № / Member № 6685
отправлено / posted
На ГЭ в кач-ве диодов три выключателя и кнопка запуска программы. Выключателя привязаны к соответствующим каналам диодов, но реакции нет, хотя в просмотре компонентов программа выполняется. Выключатели не подходят? Динамизация включена по ARG & CONST.
Сообщения / Posts 11 | Из / From: Россия
| IP / IP: IP адрес / IP address |
Alex210271
Active Forum Member / Активный участник форума
Участник № / Member № 4421
отправлено / posted
ГЭ выключатель в виде зеленых или красных ламп вполне подходят для отображения включения и выключения ваших диодов. Другой вопрос - очень трудно дать рекомендации не видя какие у вас сделаны привязки и как вы задали настройки ГЭ. если привязки правильные и каналы принимают значение только 0 и 1 то для работы этих ГЭ нужно задать константу 1 и XOR 1.
Сообщения / Posts 80 | Из / From: Россия
| IP / IP: IP адрес / IP address |
Krivosheev
Junior Member / Новичок
Участник № / Member № 6685
Krivosheev
Junior Member / Новичок
Участник № / Member № 6685
отправлено / posted
Прошу прощения, появился ещё один вопрос. Можно ли с запущенного профайлера по кнопке с ГЭ заходить в редактор программы? Например в редактор созданной программы на языке Techno ST?
Сообщения / Posts 11 | Из / From: Россия
| IP / IP: IP адрес / IP address |
Nico
Forum Professor / Завсегдатай форума
Участник № / Member № 5342