Здравствуйте, если у кого-то есть время, помогите код реализовать в жизнь. Недавно наткнулся на код, в котором было сказано про управление 3 насосами. Мне например надо также, как и там, чтобы переключались по времени, работа была попарно, запускались эти насосы от изменения давления(реле давления), плюс сигнал авария должен быть. Просмотрите код, может что-то неправильно в нем, ошибки какие, вдруг вообще бред. Если кто-то владеет подобным проектом (управление насосами) скиньте пожалуйста, Спасибо. Вот ссылка на код и ниже сам код http://plc24.ru/upravlenie-3-nasosami/#respond
VAR_INPUT
Run: BOOL; (*сигнал начала работы программы ротации*)
Time_Rotat_in:WORD; (*время работы насосов, в часах*)
Time_zad_on_in: WORD; (*время задержки перед началом работы алгоритма , в секундах*)
Time_Nech_in: WORD; (*время, в течение которого при запуске двигателя насоса не анализируются показания датчика давления, в секундах*)
Time_Nech_on_work_in: WORD; (*время, в течение которого при работе двигателя насоса допускаются «провалы» показаний датчика давления, в секундах*)
Time_Zad_in: WORD; (*время задержки между отключением одного насоса и включением другого, в секундах*)
p1_on: BOOL; (*сигнал обратной связи (датчик давления, контакт пускателя итд.) насоса №1*)
p2_on: BOOL; (*сигнал обратной связи (датчик давления, контакт пускателя итд.) насоса №2*)
p3_on: BOOL; (*сигнал обратной связи (датчик давления, контакт пускателя итд.) насоса №3*)
END_VAR
VAR_OUTPUT
p1_out: BOOL; (*сигнал включения насоса №1*)
p2_out: BOOL; (*сигнал включения насоса №2*)
p3_out: BOOL; (*сигнал включения насоса №3*)
err_p1: BOOL; (*авария насоса №1*)
err_p2: BOOL; (*авария насоса №2*)
err_p3: BOOL; (*авария насоса №3*)
END_VAR
VAR
i: WORD; (*переменная которая определяет запуск насосов*)
Time_zad_on: TIME; (*время задержки перед началом работы алгоритма*)
Time_Nech: TIME; (*время, в течение которого при запуске двигателя насоса не анализируются показания датчика давления;*)
Time_Nech_on_work: TIME; (*время, в течение которого при работе двигателя насоса допускаются «провалы» показаний датчика давления*)
Time_Zad: TIME; (*время задержки между отключением одного насоса и включением другого*)
Time_rotat: TIME; (*время работы насосов*)
Tim_off: BOOL;
Trig1: R_TRIG;
C_Tim: TON; (*таймер чредования насосов*)
Time_Rotat_DW: DWORD;
p1_out_: BOOL;
p2_out_: BOOL;
p3_out_: BOOL;
TON_Zad_Pump1: TON;
TON_Pump1_Nech: TON;
Run_Pump: BOOL;
Run_Trig: R_TRIG;
Sbros_Trig: F_TRIG;
TOF_Pump1_Nech: TOF;
TON_Zad_Pump2: TON;
TON_Pump2_Nech: TON;
TOF_Pump2_Nech: TOF;
TON_Zad_Pump3: TON;
TON_Pump3_Nech: TON;
TOF_Pump3_Nech: TOF;
T_zad2: TIME; (*задержка включения второго насоса при холодном старте*)
END_VAR
(*преобразование переменных времени полученых с панели *)
Time_Rotat_DW:=WORD_TO_DWORD(Time_Rotat_in);(*пере вод в часы*)
Time_rotat:=DWORD_TO_TIME((Time_Rotat_DW*3600000)/2);
Time_zad_on:=WORD_TO_TIME(Time_zad_on_in*1000); (*перевод в секунды*)
Time_Nech:=WORD_TO_TIME(Time_Nech_in*1000);
Time_Nech_on_work:= WORD_TO_TIME(Time_Nech_on_work_in*1000);
Time_Zad:=WORD_TO_TIME(Time_Zad_in*1000);(*инициал изация и востановление начальных условий*)
IF Run=TRUE THEN
Run_Trig(CLK:=TRUE);
Sbros_Trig(CLK:=TRUE) ;
ELSE
Run_Trig(CLK:=FALSE);
Sbros_Trig(CLK:=FALSE);
END_IF
IF Run_Trig.Q=TRUE THEN
Run_Pump:=TRUE;
T_zad2:=T#5s;
END_IF
IF Trig1.Q=TRUE THEN
T_zad2:=T#0s ;
END_IF
IF Sbros_Trig.Q= TRUE THEN
err_p1:=FALSE;
err_p2:=FALSE;
err_p3:=FALSE;
END_IF
(*запуск таймера ротации насосов*)
IF Run_Pump=TRUE THEN
C_Tim(IN:=TRUE , PT:=T#1m );
END_IF
(*сброс таймера ротации насосов*)
IF Run_Pump =FALSE THEN
C_Tim(IN:=FALSE , PT:=T#0s );
END_IF
(*детектирование импульса перехода с насоса на насос*)
Trig1(CLK:= C_Tim.Q );
Tim_off:=Trig1.Q;
(*востановление начальных установок, если идет холодный старт в автомате*)
IF (Run_Pump=FALSE AND (p3_on= FALSE AND p1_on=FALSE AND p2_on=FALSE)) THEN
i:=0;
END_IF
IF Run=FALSE THEN
p1_out_:= FALSE;
p2_out_:=FALSE;
p3_out_:=FALSE;
Run_Pump:=FALSE;
END_IF
(*подхват насосов на «лету»*)
IF (Run_Pump=FALSE AND (p1_on= TRUE AND p2_on=TRUE)) THEN
i:=0;
END_IF
IF (Run_Pump=FALSE AND (p2_on= TRUE AND p3_on=TRUE)) THEN
i:=2;
END_IF
IF (Run_Pump=FALSE AND (p3_on= TRUE AND p1_on=TRUE)) THEN
i:=1;
END_IF
(*счетчик*)
IF (Tim_off=TRUE AND Run_Pump=TRUE ) THEN
i:=i+1;
END_IF
IF i>=3 THEN
i:=0;
END_IF
(*включение насосов*)
IF (Run_Pump=TRUE AND i=0) THEN
p1_out_:= TRUE;
p2_out_:=TRUE;
p3_out_:=FALSE;
END_IF
IF (Run_Pump=TRUE AND i=1) THEN
p1_out_:= TRUE;
p2_out_:=FALSE;
p3_out_:=TRUE;
END_IF
IF (Run_Pump=TRUE AND i=2) THEN
p1_out_:= FALSE;
p2_out_:=TRUE;
p3_out_:=TRUE;
END_IF
(*перезапуск таймера*)
IF (Run_Pump=TRUE AND Tim_off=TRUE) THEN
C_Tim(IN:=FALSE , PT:=T#1m );
END_IF
(*управление насосами*)
(*насос №1*)
IF p1_out_=TRUE THEN
TON_Zad_Pump1(IN:=TRUE , PT:=Time_Zad );
ELSE
TON_Zad_Pump1(IN:=FALSE , PT:=Time_Zad );
END_IF
IF (TON_Zad_Pump1.Q=TRUE AND err_p1=FALSE) THEN
p1_out:=TRUE;
END_IF (*формирование задержки включения и защиты от ошибочного включения*)
IF (p1_out_=TRUE AND p1_out=TRUE) THEN
TON_Pump1_Nech(IN:=TRUE , PT:=Time_Nech );
ELSE
TON_Pump1_Nech(IN:=FALSE , PT:=Time_Nech );
END_IF
(*задержка контроля обратной связи после пуска насоса*)
IF (p1_out=TRUE AND p1_on=FALSE) THEN
TOF_Pump1_Nech(IN:=FALSE, PT:=Time_Nech_on_work);
ELSE
TOF_Pump1_Nech(IN:=TRUE, PT:=Time_Nech_on_work);
END_IF
(*задержка при пропадании сигнала обратной связи при работе насоса*)
IF (Run=TRUE AND p1_out_=TRUE AND TON_Pump1_Nech.Q=TRUE AND p1_on=FALSE AND TOF_Pump1_Nech.Q=FALSE) THEN
err_p1:=TRUE ;
Run_Pump:=FALSE ;
p1_out:=FALSE;
p2_out_:=TRUE;
p3_out_:=TRUE;
END_IF
(*определение аварии насоса, производиться остановка ротации и принудительное включение оставшихся насосов*)
IF p1_out_=FALSE THEN
p1_out:=FALSE;
END_IF
(*остановка насоса по истесению времени или аварии*)
(*насос №2*)
IF p2_out_=TRUE THEN
TON_Zad_Pump2(IN:=TRUE , PT:=Time_Zad+T_zad2 );
ELSE
TON_Zad_Pump2(IN:=FALSE , PT:=Time_Zad );
END_IF
(*здесь все тоже самое*)
IF (TON_Zad_Pump2.Q=TRUE AND err_p2=FALSE) THEN
p2_out:=TRUE;
END_IF
IF (p2_out_=TRUE AND p2_out=TRUE) THEN
TON_Pump2_Nech(IN:=TRUE , PT:=Time_Nech );
ELSE
TON_Pump2_Nech(IN:=FALSE , PT:=Time_Nech );
END_IF
IF (p2_out=TRUE AND p2_on=FALSE) THEN
TOF_Pump2_Nech(IN:=FALSE, PT:=Time_Nech_on_work);
ELSE
TOF_Pump2_Nech(IN:=TRUE, PT:=Time_Nech_on_work);
END_IF
IF (Run=TRUE AND p2_out_=TRUE AND TON_Pump2_Nech.Q=TRUE AND p2_on=FALSE AND TOF_Pump2_Nech.Q=FALSE) THEN
err_p2:=TRUE ;
Run_Pump:=FALSE ;
p2_out:=FALSE;
p1_out_:=TRUE;
p3_out_:=TRUE;
END_IF
IF p2_out_=FALSE THEN
p2_out:=FALSE;
END_IF
(*насос №3*)
IF p3_out_=TRUE THEN
TON_Zad_Pump3(IN:=TRUE , PT:=Time_Zad );
ELSE
TON_Zad_Pump3(IN:=FALSE , PT:=Time_Zad );
END_IF
IF (TON_Zad_Pump3.Q=TRUE AND err_p3=FALSE) THEN
p3_out:=TRUE;
END_IF
IF (p3_out_=TRUE AND p3_out=TRUE) THEN
TON_Pump3_Nech(IN:=TRUE , PT:=Time_Nech );
ELSE
TON_Pump3_Nech(IN:=FALSE , PT:=Time_Nech );
END_IF
IF (p3_out=TRUE AND p3_on=FALSE) THEN
TOF_Pump3_Nech(IN:=FALSE, PT:=Time_Nech_on_work);
ELSE
TOF_Pump3_Nech(IN:=TRUE, PT:=Time_Nech_on_work);
END_IF
IF (Run=TRUE AND p3_out_=TRUE AND TON_Pump3_Nech.Q=TRUE AND p3_on=FALSE AND TOF_Pump3_Nech.Q=FALSE) THEN
err_p3:=TRUE ;
Run_Pump:=FALSE ;
p3_out:=FALSE;
p2_out_:=TRUE;
p1_out_:=TRUE;
END_IF
IF p3_out_=FALSE THEN
p3_out:=FALSE;
END_IF
END_PROGRAM