Добрый день, вкратце алгоритм работы кода: если флаг выполнения шага не активна, то поднимаются необходимые выхода, запускается таймер на время, как достигли заданного значения - отключаем выхода, деактивируем флаг выполнения данного шага, поднимаем шаг выполнения следующего шага. И так циклически( вроде, должна работать) Но , почему-то первый цикл проходить нормально, а потом какая чихарда. Особо не пинайте, после Kotlin что-то трудновато программирование ПЛК![]()
https://disk.yandex.ru/i/DNqtPfPeE-CApAКод:var_input start : bool; tPause:udint := 2000; end_var var_output relay1 : bool; relay2 : bool; relay3 : bool; relay4 : bool; relay5 : bool; relay6 : bool; vklR:udint:=16; end_var var step0:bool:=false; step1:bool:=true; step2:bool:=true; step3:bool:=true; step4:bool:=true; step5:bool:=true; step6:bool:=true; step7:bool:=true; TON_1:SYS.TON; TonTime: TIME; qOut:bool; t_50s:udint := 5000; t_1s:udint := 4000; end_var if start then relay6:=true; // шаг0 пауза ------------------------------------------------ if not step0 then TonTime := UDINT_TO_TIME( tPause); TON_1(I := true, T := TonTime, Q => qOut); if qOut =true then TON_1(I:=false); step0:=true; //больше не выполняем этот шаг step1:=false; //доступ к следующему шагу end_if end_if // шаг1 --- кл2,17(реле1) кл3,7(реле2) ,кл6(реле5) открыты на 50 сек If not step1 then vklR:=1; //для наблюдения(временно) relay1:=true; //вкл реле relay2:=true; relay5:=true; TonTime := UDINT_TO_TIME( t_1s); TON_1(I := true, T := TonTime, Q => qOut); //запускаем таймер if qOut =true then //если достигли значения vklR:=0; relay1:=false; //отключаем relay2:=false; relay5:=false; step1:=true; //больше не выполняем этот шаг step2:=false; // доступ к следующему шагу TON_1(I:=false); end_if end_if // шаг2 пауза ------------------------------------------------ if not step2 then vklR:=2; TonTime := UDINT_TO_TIME( tPause); TON_1(I := true, T := TonTime, Q => qOut); if qOut =true then vklR:=0; TON_1(I:=false); step2:=true; //больше не выполняем этот шаг step3:=false; //доступ к следующему шагу end_if end_if // шаг3 --- кл3,7(реле2) кл4,8 (реле3) открыты на 1 сек If not step3 then vklR:=3; relay2:=true; relay3:=true; TonTime := UDINT_TO_TIME( t_1s); TON_1(I := true, T := TonTime, Q => qOut); if qOut =true then vklR:=0; relay2:=false; relay3:=false; TON_1(I:=false); step3:=true; //больше не выполняем этот шаг step4:=false; //доступ к следующему шагу end_if end_if // шаг4 пауза ------------------------------------------------ if not step4 then vklR:=4; TonTime := UDINT_TO_TIME( tPause); TON_1(I := true, T := TonTime, Q => qOut); if qOut =true then vklR:=0; TON_1(I:=false); step4:=true; //больше не выполняем этот шаг step5:=false; //доступ к следующему шагу end_if end_if // шаг5 --- кл2,17(реле1) кл4,8(реле3) кл5(реле4) открыты на 50 сек If not step5 then vklR:=5; relay1:=true; relay3:=true; relay4:=true; TonTime := UDINT_TO_TIME( t_1s); TON_1(I := true, T := TonTime, Q => qOut); if qOut =true then vklR:=0; relay1:=false; relay3:=false; relay4:=false; TON_1(I:=false); step3:=true; //больше не выполняем этот шаг step6:=false; //доступ к следующему шагу end_if end_if // шаг6 пауза ------------------------------------------------ if not step6 then vklR:=6; TonTime := UDINT_TO_TIME( tPause); TON_1(I := true, T := TonTime, Q => qOut); if qOut =true then vklR:=0; TON_1(I:=false); step6:=true; //больше не выполняем этот шаг step7:=false; //доступ к следующему шагу end_if end_if // шаг7 --- кл3,7 (реле2) кл4,8 (реле3) открыты на 1 сек If not step7 then vklR:=7; relay2:=true; relay3:=true; TonTime := UDINT_TO_TIME( t_1s); TON_1(I := true, T := TonTime, Q => qOut); if qOut =true then vklR:=0; relay2:=false; relay3:=false; TON_1(I:=false); step7:=true; //сброс остальных шагов(активируются по цепочке после 1-го шага) step0:=false; end_if end_if //------------------------------------------------------------- else relay1:=false; relay2:=false; relay3:=false; relay4:=false; relay5:=false; relay6:=false; end_if




Ответить с цитированием
