PDA

Просмотр полной версии : Помогите разобраться с программой



Fudz
12.04.2013, 13:13
Суть программы. Нужно зафиксировать момент переключения дискретного входа с 1 в 0. Подсчитать количество таких переключений и записать в ретейн.
Суть проблемы. Имеется функциональный блок и функция тело программы одинаковое но при этом функциональный блок выполняется, а функция нет. В чем проблема не пойму.

Функциональный блок :

FUNCTION_BLOCK counter_FB
VAR_INPUT
chislo : BOOL;
END_VAR
VAR_OUTPUT
counter : WORD;
reatin : WORD;
END_VAR
VAR
chislo2 : BYTE;
END_VAR


IF BOOL_TO_BYTE(chislo) <> chislo2 THEN
chislo2 := BOOL_TO_BYTE(chislo);
IF (chislo2 AND 1) = 0 THEN
counter := counter + 1;
IF counter = 10000 THEN
counter := 0;
END_IF;
reatin := counter;
END_IF;
END_IF;

Функция :

FUNCTION count : WORD
VAR_INPUT
chislo1 : BOOL;
_retain : POINTER TO WORD;
END_VAR
VAR
chislo2 : BYTE;
END_VAR

IF BOOL_TO_BYTE(chislo1) <> chislo2 THEN
chislo2 := BOOL_TO_BYTE(chislo1);
IF (chislo2 AND 1) = 0 THEN
count := count + 1;
IF count = 10000 THEN
count := 0;
END_IF;
_retain^ := count;
END_IF;
END_IF;

Yegor
12.04.2013, 13:58
Жуть какая. По-нормальному нельзя сделать что ли?
VAR
b: BOOL;
b_trig: F_TRIG;
count: POINTER TO INT;
END_VAR

b_trig(clk := b);
count^ := (count^ + BOOL_TO_INT(b_trig.Q)) MOD 10000;
функциональный блок выполняется, а функция нетВсё у вас выполняется, только у функции внутренние переменные каждый раз новые — в этом её отличие от функционального блока.

capzap
12.04.2013, 14:50
конкретно в этом примере, ф-тригер не может сохранить в функции свой экземпляр, поетому не может поймать переход фронта, отсюда и нет работы
Зы а вот если все переменные будут во входных объявлениях и вместо тригера будет его указатель то должно сработать

Fudz
12.04.2013, 15:10
а вот где собака зарыта , а я думаю какого у меня постоянно ноль на выходе. СПС