PDA

Просмотр полной версии : Использование ФБ VALVE_REG_NO_POS



AVit
07.11.2008, 06:50
Возможно использование VALVE_REG_NO_POS без математической модели задвижки?
Если нет, то как можно сделать управление задвижкой без датчика положения и внешних конечников (внутренние на ограничение крайних положений задвижки имеются) по типу ТРМ12? - просто делать ШИМ на закрытие или открытие в зависимости от требуемой мощности.
Задача- регулирование температуры воды, задвижка 3-х ходовая.
Проблема в нарушении синхронизации задвижки, так как по проекту помимо ПИД регулятора должно быть предусмотренно и ручное управление, а при этом положение задвижки на момент включения ПИДа - неизвестно и синхронизацию привязать не к чему.

Малышев Олег
07.11.2008, 08:34
Вообщем примерно так, но имеейте ввиду, что если КЗР не предусматривает останов на крайних положениях (внутренние концевики) это надо предусмотреть

FUNCTION_BLOCK PWM_VALV
VAR_INPUT
pwr:REAL; (* Мощность -100..100*)
END_VAR
VAR_OUTPUT
Open:BOOL; (* Работа на открытие *)
Close:BOOL; (* Работа на закрытие*)
END_VAR
VAR
initial:BOOL:=TRUE; (* Начальная инициализация*)
start_on:TON; (* Работа периода ШИМ*)
(*
__ __
| | Период ШИМ | |
-----------------------------| |---------------------------------------| |---------------
ШИМ Период
*)
stop_on:TON; (* Работа во ВКЛ состоянии - инверсно .Q*)

(*
|--------------------|
ВКЛ ШИМ | |
---------------------------------***********| |************
*)

tm_on:TIME; (* Время работы вых. элемента *)
prev_pwr:REAL:=0;
tmp_r: REAL;
tmp_period:REAL;
tmp_r_dw:DWORD;
same_add:REAL;
END_VAR
IF initial THEN
start_on.IN:=FALSE;
stop_on.IN:=FALSE;
stop_on.PT:=t#1s;
initial:=FALSE;
END_IF
IF pwr<>prev_pwr THEN

prev_pwr:=pwr*100+same_add;
tmp_r_dw:=REAL_TO_DWORD(10*MIN(ABS(pwr*100.0+same_ add),100.0));(* период шим в Миллисек*)

tm_on:=DWORD_TO_TIME(tmp_r_dw); (* Перевод Real в Миллисек*)
IF tm_on<T#20ms THEN (* Проверка мин длит импульса*)
tm_on:=t#0s;
same_add:=pwr;
ELSE
same_add:=0;
END_IF
same_add:=0.0;

END_IF
start_on(pt:=t#1s);
start_on.IN:=NOT start_on.Q;

IF start_on.Q THEN
stop_on.IN:=FALSE;
stop_on.PT:=tm_on;
END_IF
stop_on();
stop_on.IN:=TRUE;
IF pwr<>0.0 THEN
IF pwr<0 THEN
Open:=FALSE;
Close:=(NOT stop_on.Q) OR (pwr=-1.0);
ELSE
Open:=NOT stop_on.Q OR (pwr=1.0);
Close:=FALSE;
END_IF
ELSE
Open:=FALSE;
Close:=FALSE;
END_IF

AVit
07.11.2008, 12:04
Спасибо, буду пробывать.

мне вот это место непонятно:

IF tm_on tm_on:=t#0s;
same_add:=pwr;
ELSE
same_add:=0;
END_IF
Объясните пожалуйста

AVit
07.11.2008, 17:06
Уф, разобрался,
только переделал под входной диапазон сигнал (-100...100), был входной диапазон (-1...1).
Респект прогеру, кто это писал, сделано очень оригинально...
Вот только у меня сомнения, может ограничить нижний предел импульса включения где нибудь в пределах 0.05-0.1 сек, во избежания дребезга релюшки или не стоит?

Jeck
07.11.2008, 20:07
Уф, разобрался,
подскажи че там? а то ошибку на этом месте пишет

Малышев Олег
08.11.2008, 08:27
1) Ограничение мин. импульса надо ставить исходя из паспортных данных КЗР, промежуточного реле и реле ПЛК(20мс)
2) Там было что то вроде IF tm_on>t#1s then. Видимо при копировании затерлось
3) спасибо :), рад помочь

AVit
08.11.2008, 10:35
После ответа Олега я эту часть переделал так:

IF tm_on < t # 20 ms THEN (*ограничение импульса меньше 20мс*)
tm_on:=T#0ms;
ELSE
tm_on:=tm_on;
END_IF

а то что было закоментировал.
переменную same_add убрал совсем...

Jeck
09.11.2008, 12:36
Малышев Олег, AVit спасибо.

DARNER
01.11.2009, 18:29
выложите пожалуйста пример проекта того что у вас получилось.