PDA

Просмотр полной версии : Программирование блинк-кодов



kesha206
10.10.2018, 07:57
Добрый день!
Стоит задача организовать диагностику блинк-кодом (как на авто).
Контроллер ПЛК110[М02] + модули AI.
В программе написаны уставки для аналог. входов, при превышении уставки в retain массив (Alarms_mass:ARRAY [0..3] OF INT) записывается число.
Каждому событию присвоено свое число (Avar_s).
IF Alarm_123.Avar_s <> Alarms_mass[0] THEN
Alarms_mass[3]:=Alarms_mass[2];
Alarms_mass[2]:=Alarms_mass[1];
Alarms_mass[1]:=Alarms_mass[0];
Alarms_mass[0]:=Alarm_123.Avar_s;
END_IF;
При нажатии на диагностическую кнопку (сидит на дискретном входе) необходимо вытащить число Alarms_mass[1] и воспроизвести соответствующий блинк-код (лампа на дискретном выходе), далее Alarms_mass[2] -> блинк, далее Alarms_mass[3] - > блинк.
Например
Alarms_mass[1]=21 - блинк код: 2 коротких, пауза, 1 короткий;
.....
Alarms_mass[2]=39 - блинк код: 3 коротких, пауза, 9 коротких.

Вопрос:
1. как организовать блинк-коды?
писать с помощью TON и TOF слишком громоздко, 17 событий, соответственно 17 блинк-кодов;
2. может быть каким то образом можно прикрутить матрицу или массив?
вытаскивание чисел, сравнение с номером блинка, последовательное возпроизведение я сделаю без проблем.
3. буду признателен, если найдется что то похожее в качестве примера.

Всем спасибо за ответы.

Мимоход
12.10.2018, 01:46
Формирователь блинк-кода оформил в виде ФБ

FUNCTION_BLOCK BL_CODE
VAR_INPUT
IN: BOOL; (*Старт выдачи кода*)
Code: WORD; (*Код*)
Ti: TIME := t#500ms; (*Длительность импульса и паузы между имп*)
Tp: TIME := t#2s; (*Длительность паузы между цифрами*)
END_VAR
VAR_OUTPUT
Q: BOOL; (*Импульсы блинк-кода*)
BUSY: BOOL; (*Занят формированием импульсов*)
END_VAR
VAR
HiCode: WORD; (*Ст.цифра в коде*)
LoCode: WORD; (*Мл.цифра в коде*)
Now: TIME;
clk: BOOL;
StartTime: TIME;
State: INT;
N: WORD; (*Номер импульса в цифре*)
K: WORD; (*Номер цифры в коде 1 - старшая, 0 - младшая*)
Char: WORD;
END_VAR

Now:= TIME();

CASE State OF
0:
Q:= FALSE;
BUSY:= FALSE;
clk:= FALSE;
N:= 0;
K:= 1;
IF IN THEN
StartTime:= Now;
clk:= TRUE;
BUSY:= TRUE;
LoCode:= Code MOD 10;
HiCode:= Code / 10;
Char:= HiCode; (*Начнем со старшей цифры*)
State:= 1;
END_IF
1: (* Один Импульс цифры*)
Q:= NOT (Now - StartTime >= Ti);
State:= State + BOOL_TO_INT(NOT Q);
2: (*Импульс закончился*)
StartTime:= Now;
N:= N + 1;
IF N >= Char THEN (*если все импульсы для цифры, то*)
State:= 5; (*идем на паузу между цифрами*)
ELSE
State:= 3; (*иначе формировать паузу между импульсами*)
END_IF
3: (*Пауза между импульсами цифры*)
State:= State + BOOL_TO_INT((Now - StartTime >= Ti));
4: (*Пауза между импульсами цифры закончилась,*)
StartTime:= Now;
State:= 1; (*идем на следующий Импульс цифры*)
5:
IF K= 0 THEN (*Если Цифры кончились*)
State:= 20; (*Значит конец*)
ELSE (*Иначе пауза между цифрами*)
State:= State + BOOL_TO_INT((Now - StartTime >= Tp));
END_IF
6:(*Пауза между цифрами закончилась,*)
N:= 0;
K:= 0; (*Выбрать младшую цифру*)
Char:= LoCode;
StartTime:= Now;
State:= 1; (*идем к младшей цифре*)
20: (*КОНЕЦ*)
IF NOT IN THEN State:= 0; END_IF
END_CASE


Формирование выходных импульсов (Q) стартует по фронту на входе IN.
На время формирования всей последовательности блинк-кода выход BUSY активный, т.е. TRUE

39161

39162

kesha206
15.10.2018, 13:39
Огромное спасибо!!! *с уважением жму руку*
Прям то, что нужно)) Приятно удивлен, уже даже не надеялся, что кто то прочитает, а тут готовый FB! Здорово!
Спасибо, Мимоход!