PDA

Просмотр полной версии : функциональный блок для управления перекидным клапаном



alexval2006
27.11.2010, 18:51
добрый вечер всем написал функциональный блок для управления перекидным клапаном это двух позиционный механизм приводимый в движение электромотором 380В, конечные положения определяющийся индуктивными датчиками сенсоровскими ВБИ. Имеется два режима работы ручной и автомат. В ручном режиме оператор нажимает экранные кнопки в скаде входы A:BOOL; (*Кнопка положение A*) B:BOOL; (*Кнопка положение B*) после чего запускаться таймер настроенный на время перехода механизма от одного в другое конечное положение иначе авария. Выходы OUT_A:BOOL; (*Выход положение A*) OUT_B:BOOL; (*Выход положение B*) управляют реверсивным магнитным пускателем электродвигателя. В автоматическом режиме сигнал AVTO:BOOL; (*Автоматический режим работы FALSE-ручное TRUE-автомат*) механизм управляться сигналами C:BOOL; (*РЕЖИМ АВТОМАТ положение A*) D:BOOL; (*РЕЖИМ АВТОМАТ положение B*) это сигналы от технологического процесса различные механизмы с которыми связан этот клапан.

В общем есть две проблемы первая не могу добиться нормальной работы с тех пор как добавил автоматический режим вроде и правильно все но хз. Вторая как оптимизировать код может что то улучшить а то у меня ощущение что я написал индусский код.
************************************************** *******
FUNCTION_BLOCK PK(*Функциональный блок для управления перекидным клапаном*)
(*двух позиционный механизм*)
VAR_INPUT(*Входные переменные датчики кнопки и тп*)
AVTO:BOOL; (*Автоматический режим работы FALSE-ручное TRUE-автомат*)
A:BOOL; (*Кнопка положение A*)
B:BOOL; (*Кнопка положение B*)
C:BOOL; (*РЕЖИМ АВТОМАТ положение A*)
D:BOOL; (*РЕЖИМ АВТОМАТ положение B*)
SENSOR_A:BOOL; (*Датчик положение A*)
SENSOR_B:BOOL; (*Датчик положение B*)
ALARM_RES: BOOL; (*Сигнал сброса аварии*)
END_VAR
VAR_OUTPUT(*выходные переменные пускатели аварии и тп*)
OUT_A:BOOL; (*Выход положение A*)
OUT_B:BOOL; (*Выход положение B*)
ALARM_OUT:BOOL; (*Выход авария перекидного клапана*)
END_VAR
VAR(*Внутрении переменные для собственных нужд ФБ таймеры и прочее*)
tim1:TON;
tim2:TON;
END_VAR

************************************************** ****
IF AVTO THEN
(*-------------------------------------------------------------------------*)
IF C=TRUE AND D=FALSE THEN
OUT_A:=TRUE;
END_IF

IF C=FALSE AND D=TRUE THEN
OUT_B:=TRUE;
END_IF
(*-------------------------------------------------------------------------*)
ELSE
(*-------------------------------------------------------------------------*)
IF A=TRUE AND B=FALSE THEN
OUT_A:=TRUE;
END_IF

IF A=FALSE AND B=TRUE THEN
OUT_B:=TRUE;
END_IF

(*-------------------------------------------------------------------------*)
END_IF

IF OUT_A=TRUE THEN
tim1(IN:=OUT_A, PT:=T#5s);
ALARM_OUT:=tim1.Q;
END_IF

IF SENSOR_A=TRUE THEN
OUT_A:=FALSE;
END_IF
(*-------------------------------------------------------------------------*)
IF OUT_B=TRUE THEN
tim2(IN:=OUT_B, PT:=T#5s);
ALARM_OUT:=tim2.Q;
END_IF

IF SENSOR_B=TRUE THEN
OUT_B:=FALSE;
END_IF

IF OUT_A=TRUE THEN
tim1(IN:=OUT_A, PT:=T#5s);
ALARM_OUT:=tim1.Q;
END_IF

IF SENSOR_A=TRUE THEN
OUT_A:=FALSE;
END_IF
(*-------------------------------------------------------------------------*)
IF OUT_B=TRUE THEN
tim2(IN:=OUT_B, PT:=T#5s);
ALARM_OUT:=tim2.Q;
END_IF

IF SENSOR_B=TRUE THEN
OUT_B:=FALSE;
END_IF


(*-------------------------------------------------------------------------*)
IF OUT_A=TRUE AND OUT_B=TRUE THEN
ALARM_OUT:=TRUE ;
END_IF
(*-------------------------------------------------------------------------*)
IF ALARM_OUT=TRUE THEN
OUT_A:=FALSE;
OUT_B:=FALSE;
END_IF
(*-------------------------------------------------------------------------*)
IF ALARM_RES=TRUE THEN
ALARM_OUT:=FALSE;
tim1(IN:=FALSE, PT:=T#5s);
tim2(IN:=FALSE, PT:=T#5s);
OUT_A:=FALSE;
OUT_B:=FALSE;
END_IF

alexval2006
28.11.2010, 00:54
прилагаю файл проекта с визуализацией в коде сисе для наглядности

alexval2006
28.11.2010, 09:47
я так и думал что индуский код написал :) ваш первый вариант вроде понятен, с остальными надо разобратса. большое спасибо.

alexval2006
28.11.2010, 11:26
можете обяснить работу Sel а то у петрова и. в нету в книге. я знаю что это оператор выбора но хз как он работает

Николаев Андрей
28.11.2010, 12:08
Sel описан в хелпе.

alexval2006
03.12.2010, 01:07
Я тут набросал еще один функциональный блок для управления вертикальным транспортёром Норией хотелось бы чтобы прокомментировали правильно ли я все сделал может что можно сделать лучше хотя вроде все работает но хочется все сделать хорошо
во вложении проект с визуализацией для тестирования таджеты если нужно в предыдущем вложение

FUNCTION_BLOCK EL(*Функциональный блок для управления Норией*)
VAR(*Внутрении переменные для собственых нужд ФБ таймеры и прочее*)
step : ( stop, start, alarm_reset, alarm_reidi, alarm_sped, alarm_podpor, alarm_tok);(*Обявляем Функцию step*)
timer1:TON; (*Обявляем ФБ таймер аварии по контролю включения*)
timer2:TON; (*Обявляем ФБ таймер аварии по контролю скорости*)
timer3:TON; (*Обявляем ФБ таймер аварии по подпору продуктом*)
END_VAR

VAR_INPUT(*Входные переменные датчики кнопки и тп*)
auto:BOOL; (*Автоматический режим работы*)
man_start, man_stop:BOOL; (*Экранные кнопки СТАРТ и СТОП*)
auto_start, auto_stop:BOOL; (*Сигналы в режиме автомат СТАРТ и СТОП*)
sens_reidi:BOOL; (*Контроль включения механизма*)
sens_sped:BOOL; (*Контроль скорости механизма*)
sens_podpor:BOOL; (*Контроль подпора механизма прдуктом*)
sens_tok:BOOL; (*Контроль токовой нагрузки электродвигателя*)
reset: BOOL; (*Сигнал сброса аварии*)
END_VAR

VAR_OUTPUT(*выходные переменые пускатели аварии и тп*)
out:BOOL; (*Выходы на пускатель*)
out_alarm: WORD; (*Выход аварии нории*)
END_VAR

******************************************

CASE step OF

stop:
step:=SEL(SEL(auto, man_start, auto_start), step, start); (*Обработка кнопок ручного и автоматического режима СТАРТ*)
timer1(in:=FALSE); (*Обнуляем таймер 1*)
timer2(in:=FALSE); (*Обнуляем таймер 2*)
timer3(in:=FALSE); (*Обнуляем таймер 3*)

start:
step:=SEL(SEL(auto, man_stop, auto_stop), step, stop); (*Обработка кнопок ручного и автоматического режима СТОП*)
IF out =TRUE THEN
timer1(in:=TRUE, pt:=T#1s);
timer2(in:=TRUE, pt:=T#3s);
timer3(in:=sens_podpor, pt:=T#3s);

step:=SEL(timer1.Q, SEL(sens_reidi, step, start), alarm_reidi);
step:=SEL(timer3.Q, step, alarm_podpor);

step:=SEL(timer2.Q, step, alarm_sped);

step:=SEL(sens_tok, step, alarm_tok);
ELSE
timer1(in:=FALSE);
timer2(in:=FALSE);
timer3(in:=FALSE);
END_IF
IF sens_reidi =TRUE THEN
timer1(in:=FALSE);
END_IF
IF sens_sped =TRUE THEN
timer2(in:=FALSE);
END_IF

alarm_reset:
timer1(in:=FALSE); (*Обнуляем таймер 1*)
timer2(in:=FALSE); (*Обнуляем таймер 2*)
timer3(in:=FALSE); (*Обнуляем таймер 3*)
out_alarm:=0; (*Обнуляем АВАРИИ*)
step:=stop; (*Стоп механизма*)

alarm_reidi:
out_alarm:=1; (*Присваиваем переменной out_alarm аварию №1*)
step:=SEL(reset, step, alarm_reset); (*Контроль кнопки Сброса аварии*)
out:=step=stop; (*Стоп механизма*)

alarm_sped:
out_alarm:=2; (*Присваиваем переменной out_alarm аварию №2*)
step:=SEL(reset, step, alarm_reset); (*Контроль кнопки Сброса аварии*)
out:=step=stop; (*Стоп механизма*)

alarm_podpor:
out_alarm:=3; (*Присваиваем переменной out_alarm аварию №3*)
step:=SEL(reset, step, alarm_reset); (*Контроль кнопки Сброса аварии*)
out:=step=stop; (*Стоп механизма*)

alarm_tok:
out_alarm:=4; (*Присваиваем переменной out_alarm аварию №4*)
step:=SEL(reset, step, alarm_reset); (*Контроль кнопки Сброса аварии*)
out:=step=stop; (*Стоп механизма*)
END_CASE
out:=step=start; (*Старт механизма*)

alexval2006
03.02.2011, 19:31
Помогите разобраться значит в чём суть проблемы при включении механизма его не удается отключить кнопками стоп
в результате экспериментов удалось выяснить что при комментировании строки
step:= SEL(timer_reidi.Q, SEL(sens_reidi, step, start), alarm_reidi);
механизм отключить удается но я остаюсь тогда без контроля включения механизма не могу понять что не так в этой строке помогите пожалуста



FUNCTION_BLOCK EL (* Управление Норией *)

VAR_INPUT
auto : BOOL; (* Автоматический режим работы *)
man_start,
man_stop : BOOL; (* Экранные кнопки СТАРТ и СТОП *)
auto_start,
auto_stop : BOOL; (* Сигналы в режиме автомат СТАРТ и СТОП *)
sens_reidi : BOOL; (* Включение (обратная связь ?) *)
sens_sped : BOOL; (* Контроль скорости *)
sens_podpor : BOOL; (* Подпор продуктом*)
sens_tok : BOOL; (* Контроль токовой нагрузки электродвигателя *)
reset : BOOL; (* Сигнал сброса аварии*)
END_VAR
VAR_OUTPUT
out : BOOL; (* Выходы на пускатель*)
out_alarm : WORD; (* Выход аварии нории *)
END_VAR
VAR
step : (stop, start, alarm_reset, (* Состояние управляющего процесса*)
alarm_reidi, alarm_sped,
alarm_podpor, alarm_tok);

timer_reidi : TON; (* Контроль включения *)
timer_sped : TON; (* Контроль скорости*)
timer_podpor : TON; (* Контроль по подпору продуктом*)
END_VAR
************************************************** *******
CASE step OF
stop:
(*Обработка кнопок ручного и автоматического режима СТАРТ*)
step := SEL(SEL(auto, man_start, auto_start), step, start);
timer_reidi(in:=FALSE); (* Сброс аварийных таймеров *)
timer_sped(in:=FALSE);
timer_podpor(in:=FALSE);

start:
(*Обработка кнопок ручного и автоматического режима СТОП*)
step :=SEL(SEL(auto, man_stop, auto_stop), step, stop);
timer_reidi(in:= NOT sens_reidi, pt:=T#1s);
timer_sped(in:=NOT sens_sped, pt:=T#3s);
timer_podpor(in:=sens_podpor, pt:=T#3s);

step:= SEL(timer_reidi.Q, SEL(sens_reidi, step, start), alarm_reidi);(*проблемная строка при коментировании ее удаётса выключить механизм иначе невыключаетса*)
step := SEL(timer_podpor.Q, step, alarm_podpor);
step := SEL(timer_sped.Q, step, alarm_sped);
step := SEL(sens_tok, step, alarm_tok);


alarm_reset:
out_alarm := 0; (* Обнуляем АВАРИИ *)
step := stop; (* Стоп механизма *)

alarm_reidi:
out_alarm := 1; (* Присваиваем переменной out_alarm аварию №1 *)
step := SEL(reset, step, alarm_reset); (*Контроль кнопки Сброса аварии *)

alarm_sped:
out_alarm := 2; (* Присваиваем переменной out_alarm аварию №2 *)
step := SEL(reset, step, alarm_reset); (*Контроль кнопки Сброса аварии *)

alarm_podpor:
out_alarm := 3; (* Присваиваем переменной out_alarm аварию №3 *)
step := SEL(reset, step, alarm_reset); (*Контроль кнопки Сброса аварии *)

alarm_tok:
out_alarm := 4; (* Присваиваем переменной out_alarm аварию №4 *)
step := SEL(reset, step, alarm_reset); (*Контроль кнопки Сброса аварии *)

END_CASE
out := step=start; (* Старт механизма*)



http://alexval2007.ucoz.ru/dowanloads/1.zip

alexval2006
03.02.2011, 23:13
да я хотел его использовать но некомпилитса ошибки
вот этот код если нетрудно поправите ошибку я не найду что то.
проект по ссылке
http://alexval2007.ucoz.ru/dowanloads/2.zip

alexval2006
04.02.2011, 00:04
большое спасибо заработало. Кстати преведущую проблему победил методом научного тыка step:= SEL(timer_reidi.Q, SEL(sens_reidi, step, start, ), alarm_reidi); заменил на step:= SEL(timer_reidi.Q, SEL(sens_reidi, step, step, ), alarm_reidi); как ни странно всё заработало но последний вариант кода куда как приятней

alexval2006
04.02.2011, 10:18
Спасибо понял надобыло просто упростить эту конструкцию просто я уже подзабыл к чему и что там недают заниматса одним и темже каждый день чтото новое мы ведь эксплуатационщики.