Здравствуйте, если у кого-то есть время, помогите код реализовать в жизнь. Недавно наткнулся на код, в котором было сказано про управление 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