Диплом (1228345), страница 10
Текст из файла (страница 10)
min_time_down: WORD := 10;
max_time_up:WORD:=1000;
max_time_down:WORD:=1000;
step: REAL:=0.5;
END_VAR
VAR_INPUT
_up:BYTE; (*вверх*)
_down:BYTE; (*вниз*)
_kbrd:BYTE; (*клавиатура*)
_min:REAL;(*минимальное значение*)
_max:REAL; (*максимальное значение*)
END_VAR
VAR_OUTPUT
END_VAR
VAR_IN_OUT
count:REAL;
END_VAR
VAR
rm: R_TRIG;
flag_down: BOOL := FALSE;
flag_up: BOOL := FALSE;
time_down: WORD := max_time_down;
time_up: WORD := max_time_up;
tm: TON;
tm1: TON;
rm1: R_TRIG;
END_VAR
rm(clk:=_kbrd=_up ); (*по переднему фронту нажатия клавиши вверх*)
IF rm.Q THEN (* будет выполнен этот цикл*)
flag_up:=TRUE; (*Установим флаг увеличения значения*)
count:=count+0.1; (*сразу увеличим значение на 1, чтобы не ждать 1 сек*)
IF count>_max THEN count:=_max; END_IF;
END_IF
IF _kbrd<>_up THEN (*если пользователь отпустил клавишу вверх*)
flag_up:=FALSE; (*сбросим флаг движения вверх*)
time_up:=max_time_up; (*вернём значение времени изменения в значение по умолчанию*)
END_IF;
tm(in:=NOT tm.Q AND flag_up, pt:=WORD_TO_TIME(time_up)); (*генератор увеличивающий значение при условии флага движения вверх с динамически уменьшаемой частотой*)
IF tm.Q THEN
IF time_up>min_time_up THEN time_up:=REAL_TO_WORD(time_up*step); END_IF; (*уменьшим значение времени изменения значения до тех пор пока не достигли нижнего предела*)
count:=count+1; (*Увеличим счётчик *)
IF count>_max THEN count:=_max; END_IF;
END_IF
(*Далее цикл для уменьшения значения*)
rm1(clk:=_kbrd=_down);
IF rm1.Q THEN (*то будет выполнен этот цикл*)
flag_down:=TRUE;
count:=count-0.1;
IF count<_min THEN count:=_min; END_IF;
END_IF
IF _kbrd<>_down THEN flag_down:=FALSE; time_down:=max_time_down; END_IF;
tm1(in:=NOT tm1.Q AND flag_down, pt:=WORD_TO_TIME(time_down));
IF tm1.Q THEN
IF time_down>min_time_down THEN time_down:=REAL_TO_WORD(time_down*step); END_IF
count:=count-1;
IF count<_min THEN count:=_min; END_IF;
END_IF
Функция проверки канала
FUNCTION get_err_chk : BOOL
VAR_INPUT
chk: REAL;
END_VAR
VAR
df: DECODE_FLOAT;
error: BYTE;
END_VAR
df(value:=chk, _err=> error);
IF error=0 THEN get_err_chk:=FALSE;ELSE get_err_chk:=TRUE; END_IF;
Функция получения кода ошибки
FUNCTION get_error_code : BYTE
VAR_INPUT
val: REAL;
END_VAR
VAR
df: DECODE_FLOAT;
error_code: BYTE;
END_VAR
-------------------
df(value:=val, _err=>error_code);
IF error_code = 0 THEN
get_error_code:=0;
ELSE
get_error_code:=error_code-6;
END_IF
5