Мы тут что делаем? Контроллеры программируем!
Какие затраты на программирование, Вы о чем?
Вид для печати
Зачем Вам HardellaIDE?
Используйте библиотеки Timer и SysLibPorts
только прерывания будут не не по фронту сигнала а от 20мкс таймера.
Внутри POU обработки прерывания от таймера можно напрямую анализировать состояние быстрых дискретных входов
Пример работы с быстрыми входами есть на диске
Вложение 39664
Цитата:
Некоторые контроллеры ОВЕН ПЛК имеют встроенный таймер, по прерыванию которого может быть
вызван отдельная программа (POU), не связанная с выполнением основной программы ПЛК. Минимальный
период вызовов прерываний таймера составляет 20мкс и может быть увеличен при вызове функции
инициализации. Период должен быть кратен 20мкс. В POU, вызываемому по этому прерыванию, могут
обрабатываться состояния "быстрых" входов и выходов ПЛК. Такой режим обработки может потребоваться
для задач, время обработки которых должно быть существенно меньше времени цикла ПЛК или для
автоматизации объектов, критичных ко времени реакции на определенные события.
К "быстрым" входам и выходам относятся несколько первых входов и выходов на ПЛК110. Подробно о
количестве "быстрых" входов и выходов смотри руководство по эксплуатации на контроллер.
При всем уважении, тут мы трепемся, а программируем в другом месте.
Пока одни костыли...
Сможете добиться стабильности и повторяемости результатов на разных экземплярах ПЛК без подстройки программы?
А на разных сериях ПЛК? ;)
Этим и отличается "колхоз" от "промышленных решений" - повторяемостью результатов и ремонтопригодностью.
Накидал алгоритм, если честно мне не нравится,думаю можно сделать красивее, но работает точно.
Вся обработка идет в прерываниях системного таймера каждые 60 мкс. Осциллограф подтвердил что все точно обрабатывается.
Вложение 39754
Тут полная схема
Вложение 39755
Мой вариант
Вложение 39766
Прерывания таймера - 40мкс.
В обработчике прерываний подсчитывается длительность входных импульса - dT в единицах прерывания для каждого входаКод:PROGRAM PWM_meter
VAR
count: DWORD; (*счетчик прерываний таймера*)
in: BYTE;
start1: DWORD;
State1: INT;
start2: DWORD;
State2: INT;
start3: DWORD;
State3: INT;
start4: DWORD;
State4: INT;
END_VAR
Полученные значения передаются в PLC_PRG через глобальные переменныеКод:count:= count + 1;
in:= SysPortIn(0);
(*--- Первый вход ПЛК ---*)
CASE State1 OF
0:
IF in.0 THEN
start1:= count;
State1:= 1;
END_IF
1:
IF NOT in.0 THEN
dT1_cycle:= count - start1;
State1:= 0;
END_IF
END_CASE
(*--- Второй вход ПЛК ---*)
CASE State2 OF
0:
IF in.1 THEN
start2:= count;
State2:= 1;
END_IF
1:
IF NOT in.0 THEN
dT2_cycle:= count - start2;
State2:= 0;
END_IF
END_CASE
Коэффициенты заполнения рассчитываются в PLC_PRGКод:VAR_GLOBAL
dT1_cycle: DWORD;
dT2_cycle: DWORD;
dT3_cycle: DWORD;
dT4_cycle: DWORD;
END_VAR
Код:PROGRAM PLC_PRG
VAR
init:BOOL:=TRUE; (* Переменная для инициализации прерывания таймера при запуске основной программы *)
F: REAL := 75.0; (*Частота ШИМ в Гц*)
D1: REAL; (* коэфф. заполнения 1 в %*)
D2: REAL; (* коэфф. заполнения 2 в %*)
D3: REAL; (* коэфф. заполнения 3 в %*)
D4: REAL; (* коэфф. заполнения 4 в %*)
END_VAR
(*Инициализируем обработчик прерывания таймера и настраиваем период срабатывания таймерного прерывания*)
IF (init=TRUE) THEN
SetIRQ(40); (*Период задается в мкс, должен быть кратен 20*)
(*ВНИМАНИЕ! Включенный обработчик прерывания работает даже после останове программы,
если необходимо его отключать и повторно включать, то делайте это в обработчике событий "Stop" и "Start"*)
init:=FALSE; (*Обнуление переменной инициализации, чтобы она не происходила на втором и последующих циклах ПЛК*)
END_IF
(*коэффициент заполнения D= dT/T= dT * F *)
D1:= DWORD_TO_REAL(dT1_cycle) * 40 * F / 10000; (* коэфф. заполнения в %*)
D2:= DWORD_TO_REAL(dT2_cycle) * 40 * F / 10000;
D3:= DWORD_TO_REAL(dT3_cycle) * 40 * F / 10000;
D4:= DWORD_TO_REAL(dT4_cycle) * 40 * F / 10000;
Я понял. С точки зрения ресурсов ПЛК это тяжело ему? В основной программе будет обмен с модулями,облако и панель оператора.
Ну и в догонку какой колхоз пришлось на подопытным сделать что бы отладить прогу
Вложение 39768
Генератора сигнала нету,пришлось на быстые выхода вместо реле прикрутить оптопару TLP620,все работает фронты четкие.
Petera еще раз спасибо большое, проверил все работает. Направление понял, код поправлю( не учитывается 0 и 100%).