PROGRAM FAST_COUNTER
variables:
@Export
@Export
inputs : FAST_INPUTS;
CounterCH1 : WORD; (* счётчик для первого канала *)
CounterCH2 : WORD; (* счётчик для второго канала *)
StartCounter1 : BOOL; (* начался отсчёт по первому каналу *)
StartCounter2 : BOOL; (* начался отсчёт по 2 каналу *)
body:
(* первый канал *)
(* проверка флага начатого отсчёта *)
IF StartCounter1 THEN (* если флаг установлен *)
IF R_TRIG(CLK := inputs.in1).Q THEN (* ждём передний фронт второго импульса *)
(* если импульс пришёл *)
counter1 := CounterCH1; (* записываем значение на выход *)
CounterCH1 := 0; (* обнуляем счётчик *)
(* иначе, если флаг начала установлен, но пока нет переднего фронта второго импульса *)
ELSE
CounterCH1 := CounterCH1 + 1; (* считаем циклы *)
END_IF;
(* иначе, если флаг первого импульса не установлен *)
ELSE
IF F_TRIG(CLK := inputs.in1).Q THEN (* ждём заднего фронта первого импульса *)
StartCounter1 := TRUE; (* если импульс пришёл, устанавливаем флаг начала счёта *)
CounterCH1 := CounterCH1 + 1; (* и начинаем счёт циклов *)
END_IF;
END_IF;
(* второй канал *)
(* проверка флага начатого отсчёта *)
IF StartCounter2 THEN (* если флаг установлен *)
IF R_TRIG(CLK := inputs.in2).Q THEN (* ждём передний фронт второго импульса *)
(* если импульс пришёл *)
counter2 := CounterCH2; (* записываем значение на выход *)
CounterCH2 := 0; (* обнуляем счётчик *)
(* иначе, если флаг начала установлен, но пока нет переднего фронта второго импульса *)
ELSE
CounterCH2 := CounterCH2 + 1; (* считаем циклы *)
END_IF;
(* иначе, если флаг первого импульса не установлен *)
ELSE
IF F_TRIG(CLK := inputs.in2).Q THEN (* ждём заднего фронта первого импульса *)
StartCounter2 := TRUE; (* если импульс пришёл, устанавливаем флаг начала счёта *)
CounterCH2 := CounterCH2 + 1; (* и начинаем счёт циклов *)
END_IF;
END_IF;
END_PROGRAM
output counter1 : WORD; (* This variable will be visible in CoDeSys program *) output counter2 : WORD; (* период между импульсами в мкСек Канал ном.2 *)