Здравствуйте. Помогите, пожалуйста в решении вопроса. Поставлена задача реализовать работу светодиодной панели 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. Компилируется без ошибок, но реакции нет. Прошу прощения за длинный вопрос. Очень надеюсь на Вашу помощь, не могу реализовать такую простую схему уже порядка двух недель, а срок уже поджимает . В примерах подобной задачи не нашел. С Уважением, Николай.
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
Вы неверно понимаете функционирование программы. Вне зависимости от используемого языка при каждом вызове программы (с циклом обработки канала, вызывающего программу) при условии !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;
Программу надо переделывать.
Разработка программ под задачи пользователей не входит в функции службы технической поддержки. Надеемся на понимание.
Топик перенесен в раздел "Пользователи для пользователей"
Posted by Krivosheev (Участник № / Member № 6685) on :
Ага, понял. Спасибо, будем думать!
Posted by Krivosheev (Участник № / Member № 6685) on :
Прошу прощения, не сможете подсказать - возможна ли реализация данной задачи? Или гиблое дело? Стоит ли мне продолжить попытки реализации или пробовать другое ПО ?
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
Конечно, можно. Речь идет только о правильном тексте программы.
Posted by Krivosheev (Участник № / Member № 6685) on :
И, тем не менее, реализация даже столь простого на первый взгляд вопроса под сомнением.. Изменил программу, используя оператор repeat или оператор while, но проект некорректно работает, как и в первый раз. Выполняется только конечная строка, а именно работает нижний ряд диодов. Может кто-нибудь подкинуть идею, как реализовать поставленную задачу? Мои идеи кончились.
Posted by Alex210271 (Участник № / Member № 4421) on :
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 и тд.
Posted by Alex210271 (Участник № / Member № 4421) on :
Циклы нужны только если у вас за один вызов программы должно выполниться множество действий. Так у Вас и работает. Мгновенно пробегает ВСЕ циклы и выдает на выходе только последние значения. То есть горит третий ряд светодиодов.
Posted by Nico (Участник № / Member № 5342) on :
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;
END_PROGRAM
и не забыть поставить нужный период пересчета программы
Posted by Alex210271 (Участник № / Member № 4421) on :
Уважаемый Nico совершенно прав. Так должна выглядеть эта программа в действительности. Можно также попробовать вместо операторов If использовать оператор CASE. Я просто не хотел давать готовый ответ, а дать идею для развития. Кроме того, мой вариант может позволить сделать каждый из трех периодов свечения разной длительности.
Posted by Krivosheev (Участник № / Member № 6685) on :
Спасибо Вам большое, Nico и Alex210271 за подробное объяснение принципа работы программы. Не думаю, что без Вашей помощи я пришел бы к правильному выводу. Ещё раз спасибо!
Posted by Krivosheev (Участник № / Member № 6685) on :
Странно, но из просмотра переменных при запуске программы в обоих случаях только первый диод принимает значение 1. Остальные же не реагируют. Проблема может быть в периоде пересчета? Или же в самом канале?
Posted by Alex210271 (Участник № / Member № 4421) on :
Программа работает именно так как указывалось. Какое-то время первый аргумент равен единице, затем второй, потом третий. Для того чтобы понять есть ли проблема в периоде пересчета, неплохо бы узнать каким у Вас задан этот период для канала вызова программы. И я надеюсь что этот канал имеет тип input и правильные привязки к каналам управления светодиодами. И какой вариант программы мой или Nico вы взяли за основу своей версии.
Posted by Krivosheev (Участник № / Member № 6685) on :
За основу был взят Ваш вариант программы, потому как имеется возможность задать различное время работы диода. Безусловно, канал имеет тип input и привязан правильно. Пробовал период пересчета 1 и 5 сек, а также 10 или 20 циклов calc.
Posted by Krivosheev (Участник № / Member № 6685) on :
Прошу прощения, в программе разобрался! Достаточно ли на ГЭ создать кнопку с привязкой по каналу типа OUTPUT с созданной программой и атрибутом "Выполнить" ? Или же следует сделать канал типа INPUT и подавать значение "1" для запуска программы?
Posted by Alex210271 (Участник № / Member № 4421) on :
Программа вызываемая каналом Call типа Input работает непрерывно со своим периодом пересчета. Нужно либо в программе добавить условие которое будет выполнять или пропускать основное тело, ту часть программы которую Вы уже отладили, или включать и выключать программу в нужный момент. Можно канал изначально выключить (атрибут 3, с) потом по кнопке включить, изменив третий атрибут на ноль, и выключить командой изнутри программы при помощи функции setAttributeI(UDINT ch_id, UINT attr_id, DINT value) где первый параметр ID канала вызывающего программу (нужно Call вызова программы привязать как её же аргумент с атрибутом 118, ID) второй параметр номер атрибута - как раз 3, и третий параметр - 1 значение третьего атрибута которое будет установлено. Эту команду нужно вставить где-то в конце и при проверке условия что счетчик I достиг заданного значения.
Posted by Krivosheev (Участник № / Member № 6685) on :
На ГЭ в кач-ве диодов три выключателя и кнопка запуска программы. Выключателя привязаны к соответствующим каналам диодов, но реакции нет, хотя в просмотре компонентов программа выполняется. Выключатели не подходят? Динамизация включена по ARG & CONST.
Posted by Alex210271 (Участник № / Member № 4421) on :
ГЭ выключатель в виде зеленых или красных ламп вполне подходят для отображения включения и выключения ваших диодов. Другой вопрос - очень трудно дать рекомендации не видя какие у вас сделаны привязки и как вы задали настройки ГЭ. если привязки правильные и каналы принимают значение только 0 и 1 то для работы этих ГЭ нужно задать константу 1 и XOR 1.
Posted by Krivosheev (Участник № / Member № 6685) on :
Всё отлично работает, правда немного медленно) Спасибо огромное!
Posted by Krivosheev (Участник № / Member № 6685) on :
Прошу прощения, появился ещё один вопрос. Можно ли с запущенного профайлера по кнопке с ГЭ заходить в редактор программы? Например в редактор созданной программы на языке Techno ST?
Posted by Nico (Участник № / Member № 5342) on :