
Сообщение от
Gribnick
Хочу спросить, в языке ST я еще новичек, а возможно ли написать фунциональный блок, который будет в определенной последовательности активировать выхода (на пневмоцилиндры), при этом контролируя все получаемыми входными сигналами (с датчиков положения). Важно написать определенную последовательность. И при этом зациклить выполнение блока, с остановкой по входному сигналу.
Да. 
Например, управление техпроцессом из шести вариантов прогонки электродвигателей.
Код:
IF kSTART=1 AND STEP=98 THEN STEP:=40; END_IF (* ПЕРЕзапуск для пров на КЗ [Pк]*)
IF kSTART=1 AND STEP=99 THEN STEP:= 0; OutX0; END_IF (* запуск очередной после полного прохода *)
IF kSTART=1 AND STEP=0 THEN STEP:=10; D00:=0; OutSVz1:=1; (* СТАРТ общий *)
v500:=s500a; v500:=v500*1000; vADC:=sADCa; vADC:=vADC*1000; v2000:=s2000a; v2000:=v2000*1000; (* индексировать *)
v380:=s380a; v380:=v380*1000; v100:=s100a; v100:=v100*1000; END_IF (* и прописать в секундах *)
(* IF kSTART=1 AND D01 <>0 THEN STEP:=D01; D01:=0; END_IF ( * выход из паузы *)
(* IF kPAUSE = 1 AND STEP <>0 THEN D01:=STEP; STEP:=10; END_IF вход в паузу *)
(* IF InR = 1 THEN nw:=0; Out10:=0; ELSE nw:=1; Out10:=1; END_IF *)
(* IF InR = 1 THEN при моделировании Alarm и Stop отключать останов по Alarm и STOP - вкл AlarmSV *)
IF kAlarm=0 OR kSTOP=0 THEN STEP:=0; OutX0; D00:=0; D01:=0; END_IF (* STOP любой *)
IF D00=3 THEN ZUMo:=100; SVzt:=1000; END_IF (* звук START цикла *)
CASE STEP OF (* Out1P1 Out2P1 Out3P1 Out4P1 Красный *)
10: IF D00 = 1 THEN OutX0; Out5P1:=1; Out1P1:=0; END_IF (* все выходы выключить 5 ИНДИКАЦИЯ зел включить *)
(*ADC*) IF D00 = 10 THEN ADC4v:=0;Out9:= 1; END_IF (* обмотка 1-я пара *)
IF D00 = vADC/2 THEN Out10:= 1; END_IF (* обмотка 2-я пара *)
IF D00 > vADC THEN Out10:= 0; END_IF (* Отключить *)
IF D00 > vADC+100 THEN Out9 := 0; END_IF DSS:=(vADC+2000)-D00; (* обратный счёт, откинуть три нуля *)
IF D00 > vADC+2000 THEN STEP:=20; D00:=0; (* OutX0; *) END_IF D00:=D00+1; (* тик программы *)
20: IF D00 = 1 THEN OutX0; Out6P1:= 1; END_IF (* все выходы выключить ИНДИКАЦИЯ включить *)
(*500*) IF D00 = 100 THEN Out12:= 1; END_IF (* Включить *)
IF D00 = 200 THEN Out9 := 1; END_IF (* Включить *)
IF D00 > v500 THEN Out9 := 0; END_IF (* Отключить *)
IF D00 > v500+100 THEN Out12:= 0; END_IF DSS:=(v500+1000)-D00; D00:=D00+1;
IF D00 > v500+1000 THEN STEP:=30; D00:=0; OutX0; END_IF (* Out2P1:=1; *)
30: IF D00 = 1 THEN OutX0; Out7P1:= 1; END_IF (* 380v измерения все выходы выключить *)
(*380*) IF D00 = 100 THEN Out12:= 1; END_IF (* Включить *)
IF D00 = 200 THEN Out11:= 1; END_IF (* Включить *)
IF D00 = 300 THEN Out9 := 1; END_IF (* Включить *)
IF D00 > v380 THEN Out9 := 0; END_IF (* Отключить *)
IF D00 > v380+100 THEN Out11:=Out12:=0; END_IF DSS:=(v380+1000)-D00; D00:=D00+1;
IF D00 > v380+1200 THEN STEP:=40; D00:=0; OutX0; FazA100:=FazB100:=FazC100:=0; (* обнулить перед переходом *) END_IF (* Out3P1:=1; *)
40: IF D00 = 1 THEN OutX0; Out8P1:= 1; STEP:=98; END_IF (* КЗ ротора - ждать фиксации вала TACK1_Motor1.STEP=20 OR TACK1_Motor1.STEP=6 *)
(*100*) IF D00 = 100 THEN Out11:= 1; END_IF (* Включить *)
IF D00 = 200 THEN Out9 := 1; END_IF (* Включить *)
IF D00 > v100 THEN Out9 := 0; END_IF (* Отключить *)
IF D00 > v100+100 THEN Out11:= 0; END_IF DSS:=(v100+2000)-D00; D00:=D00+1;
IF D00 > v100+2000 THEN STEP:=50; D00:=0; OutX0; END_IF (* Out4P1:=1; *)
50: IF D00 = 2000 THEN Out9 := 0; END_IF (* 2000 вольт *)
(*2000*)IF D00 > v2000 THEN Out9 := 0; END_IF DSS:=(v2000+1000)-D00; D00:=D00+1;
IF D00 > v2000+1000 THEN STEP:=99; D00:=0; OutX0; END_IF
90: IF D00 = 0 THEN ; END_IF (* обрыв обмотки *)
91: IF D00 = 0 THEN ; END_IF (* заглушка *)
92: IF D00 = 0 THEN ; END_IF (* заглушка *)
98: IF D00 = 0 THEN ; END_IF (* Pк - зажать вал *)
99: IF D00 = 0 THEN ; END_IF (* СЛЕДУЮЩИЙ - проверка завершена успешно *)
END_CASE IF InR=0 THEN ZUMv:=100; END_IF (* звук от Reset *)
IF ZUMo<>0 OR ZUMo>0 THEN ZUMo:=ZUMo-1; ZUM0 :=1; ELSE ZUM0 :=0; END_IF (* отсчёт длительности звука утробного *)
IF ZUMv<>0 OR ZUMv>0 THEN ZUMv:=ZUMv-1; OutZUM :=1; ELSE OutZUM :=0; END_IF (* отсчёт длительности звука внешнего *)
IF SVzt<>0 OR SVzt>0 THEN SVzt:=SVzt-1; OutSVz1:=1; ELSE OutSVz1:=0; END_IF (* отсчёт длительности светового сигнала *)
Это пример рабочего кода под ПЛК160, который сейчас перенесён на ПР205.
Укажите сколько датчиков, примерный алгоритм, и под какой ПЛК или ПР.
Это очень просто, поэтому попробую накидать вам вариант.