Страница 2 из 3 ПерваяПервая 123 ПоследняяПоследняя
Показано с 11 по 20 из 21

Тема: измерение скважности входного шим сигнала

  1. #11
    Пользователь Аватар для petera
    Регистрация
    06.05.2011
    Адрес
    Минск
    Сообщений
    3,817

    По умолчанию

    Цитата Сообщение от Ryzhij Посмотреть сообщение
    Добро бы речь шла о крупносерийном или хотя бы серийном изделии...
    Дополнительные затраты на программирование кто-нибудь посчитает?
    Мы тут что делаем? Контроллеры программируем!
    Какие затраты на программирование, Вы о чем?
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

  2. #12
    Пользователь Аватар для petera
    Регистрация
    06.05.2011
    Адрес
    Минск
    Сообщений
    3,817

    По умолчанию

    Цитата Сообщение от svr007 Посмотреть сообщение
    HardellaIDE и быстрые входа вроде больше как для энкодеров, на ум приходит алгоритм:
    1.запускать прерывание по фронту сигнала
    2.в прерывание запускать таймер, в следующем прерывании считать и обнулить
    3.мерить время между импульсами сигнала, зная время периода вычислять процент заполнения.
    У меня будет 4 входа шим, ПЛК не загнется такова количества? хочется более правильный алгоритм.
    Зачем Вам HardellaIDE?
    Используйте библиотеки Timer и SysLibPorts
    только прерывания будут не не по фронту сигнала а от 20мкс таймера.
    Внутри POU обработки прерывания от таймера можно напрямую анализировать состояние быстрых дискретных входов
    Пример работы с быстрыми входами есть на диске
    Захват-1.png

    Некоторые контроллеры ОВЕН ПЛК имеют встроенный таймер, по прерыванию которого может быть
    вызван отдельная программа (POU), не связанная с выполнением основной программы ПЛК. Минимальный
    период вызовов прерываний таймера составляет 20мкс и может быть увеличен при вызове функции
    инициализации. Период должен быть кратен 20мкс. В POU, вызываемому по этому прерыванию, могут
    обрабатываться состояния "быстрых" входов и выходов ПЛК. Такой режим обработки может потребоваться
    для задач, время обработки которых должно быть существенно меньше времени цикла ПЛК или для
    автоматизации объектов, критичных ко времени реакции на определенные события.
    К "быстрым" входам и выходам относятся несколько первых входов и выходов на ПЛК110. Подробно о
    количестве "быстрых" входов и выходов смотри руководство по эксплуатации на контроллер.
    Вложения Вложения
    Последний раз редактировалось petera; 06.11.2018 в 13:44.
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

  3. #13
    Пользователь Аватар для Ryzhij
    Регистрация
    15.04.2013
    Адрес
    Рязань
    Сообщений
    918

    По умолчанию

    Цитата Сообщение от petera Посмотреть сообщение
    Мы тут что делаем? Контроллеры программируем!
    Какие затраты на программирование, Вы о чем?
    При всем уважении, тут мы трепемся, а программируем в другом месте.
    Пока одни костыли...
    Сможете добиться стабильности и повторяемости результатов на разных экземплярах ПЛК без подстройки программы?
    А на разных сериях ПЛК?
    Этим и отличается "колхоз" от "промышленных решений" - повторяемостью результатов и ремонтопригодностью.

  4. #14

    По умолчанию

    Накидал алгоритм, если честно мне не нравится,думаю можно сделать красивее, но работает точно.
    Вся обработка идет в прерываниях системного таймера каждые 60 мкс. Осциллограф подтвердил что все точно обрабатывается.
    2018-11-13_09-20-43.png
    Изображения Изображения

  5. #15

    По умолчанию

    Тут полная схема
    2018-11-13_09-46-43.png

  6. #16
    Пользователь Аватар для petera
    Регистрация
    06.05.2011
    Адрес
    Минск
    Сообщений
    3,817

    По умолчанию

    Мой вариант
    Захват-1.png

    Прерывания таймера - 40мкс.

    Код:
    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
    В обработчике прерываний подсчитывается длительность входных импульса - dT в единицах прерывания для каждого входа
    Код:
    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
    Коэффициенты заполнения рассчитываются в PLC_PRG
    Код:
    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;
    Вложения Вложения
    Последний раз редактировалось petera; 13.11.2018 в 14:25.
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

  7. #17

    По умолчанию

    Цитата Сообщение от petera Посмотреть сообщение
    Мой вариант
    Захват-1.png

    Прерывания таймера - 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
    В обработчике прерываний подсчитывается длительность входных импульса - dT в единицах прерывания для каждого входа
    Код:
    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
    Коэффициенты заполнения рассчитываются в PLC_PRG
    Код:
    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;
    Спасибо большое за подсказку, буду тестировать. А чем обусловлен выбор 40 мкс? повышением точности?. Я выбирал 60 чтоб меньше грузить ПЛК,точность устраивает.

  8. #18
    Пользователь Аватар для petera
    Регистрация
    06.05.2011
    Адрес
    Минск
    Сообщений
    3,817

    По умолчанию

    Цитата Сообщение от svr007 Посмотреть сообщение
    Спасибо большое за подсказку, буду тестировать. А чем обусловлен выбор 40 мкс? повышением точности?. Я выбирал 60 чтоб меньше грузить ПЛК,точность устраивает.
    Ничем не обусловлен.

    Пусть будет 60, только изменить
    SetIRQ(60); (*Период задается в мкс, должен быть кратен 20*)
    формулу поправить
    D1:= DWORD_TO_REAL(dT1_cycle) * 60 * F / 10000; (* коэфф. заполнения в %*)
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

  9. #19

    По умолчанию

    Я понял. С точки зрения ресурсов ПЛК это тяжело ему? В основной программе будет обмен с модулями,облако и панель оператора.
    Ну и в догонку какой колхоз пришлось на подопытным сделать что бы отладить прогу
    IMG_20181112_195537.jpg
    Генератора сигнала нету,пришлось на быстые выхода вместо реле прикрутить оптопару TLP620,все работает фронты четкие.

  10. #20

    По умолчанию

    Petera еще раз спасибо большое, проверил все работает. Направление понял, код поправлю( не учитывается 0 и 100%).

Страница 2 из 3 ПерваяПервая 123 ПоследняяПоследняя

Похожие темы

  1. Ответов: 14
    Последнее сообщение: 04.05.2018, 20:54
  2. Масштабирование входного сигнала
    от rwg в разделе Master SCADA 3
    Ответов: 4
    Последнее сообщение: 15.05.2015, 14:52
  3. ТРМ с аппроксимацией входного сигнала
    от LеShiy в разделе Разработки
    Ответов: 0
    Последнее сообщение: 10.11.2011, 18:34
  4. измерение аналогово сигнала
    от Федин в разделе Эксплуатация
    Ответов: 4
    Последнее сообщение: 08.10.2010, 17:15

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •