0

Управление 3 насосами

Алгоритм предназначен для управления 3-мя насосами (или другими обьектами требующими чредование времени работы,например тремя водогрейными котлами),  каждый из которых снабжен своим датчиком   (или иным сигналом обратной связи). Одновременно работают два объекта из трех. По истечении  заданного времени  происходит переключение работающих  насосов.

Листинг

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

Пожелания к работе программы и описание найденных ошибок можно направлять по адресу a_vit76@mail.ru Автор — Виктор Алексеев

Раздел: Программы ПЛК Метки: 

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

Отправить сообщение

CoDeSys GSM/GPRS модем Lectus OPC MasterSCADA Modbus MX110 Omron OPC-сервер owen owen logic PLC Configuration PROFIBUS s-200 SCADA scada системы siemens siemens plc SIMATIC Simplight SMS step7 TRACE MODE Динамизация ИП-320 МЭК 1131–3 ОВЕН ОВЕН ПЛК ОВЕН ПЧВ ПЛК ПЛК ОВЕН ПР 110 Панель оператора Программируемое реле Частотный преобразователь библиотека в CoDeSys визуализация диспетчеризация конфигурация панели программирование ПЛК серия NS сименс плк частотник частотное управление язык CFC язык ST
.