функциональный блок для управления перекидным клапаном
добрый вечер всем написал функциональный блок для управления перекидным клапаном это двух позиционный механизм приводимый в движение электромотором 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 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:48.
Я тут набросал еще один функциональный блок для управления вертикальным транспортёром Норией хотелось бы чтобы прокомментировали правильно ли я все сделал может что можно сделать лучше хотя вроде все работает но хочется все сделать хорошо
во вложении проект с визуализацией для тестирования таджеты если нужно в предыдущем вложение
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
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(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
Помогите разобраться значит в чём суть проблемы при включении механизма его не удается отключить кнопками стоп
в результате экспериментов удалось выяснить что при комментировании строки
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);
да я хотел его использовать но некомпилитса ошибки
вот этот код если нетрудно поправите ошибку я не найду что то.
проект по ссылке http://alexval2007.ucoz.ru/dowanloads/2.zip
большое спасибо заработало. Кстати преведущую проблему победил методом научного тыка step:= SEL(timer_reidi.Q, SEL(sens_reidi, step, start, ), alarm_reidi); заменил на step:= SEL(timer_reidi.Q, SEL(sens_reidi, step, step, ), alarm_reidi); как ни странно всё заработало но последний вариант кода куда как приятней
Спасибо понял надобыло просто упростить эту конструкцию просто я уже подзабыл к чему и что там недают заниматса одним и темже каждый день чтото новое мы ведь эксплуатационщики.