Показано с 1 по 10 из 57

Тема: Пауза таймера?

Древовидный режим

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #20
    Пользователь Аватар для petera
    Регистрация
    06.05.2011
    Адрес
    Минск
    Сообщений
    4,110

    По умолчанию

    У меня проще, только код, без вспомогательных таймеров и триггеров
    Код:
    FUNCTION_BLOCK TON_P
    VAR_INPUT
    	IN: BOOL;
    	P: BOOL;
    	PT: TIME;
    END_VAR
    VAR_OUTPUT
    	Q: BOOL;
    	ET: TIME;
    END_VAR
    VAR
    	clk: BOOL;
    	StartTime: TIME;
    	tx: TIME;
    END_VAR
    
    tx:= TIME();
    IF P THEN
    	StartTime:= tx - ET;
    END_IF
    IF IN AND NOT clk THEN
    	StartTime:= tx;
    	clk:= TRUE;
    ELSIF NOT IN THEN
    	clk:= FALSE;
    	Q:= FALSE;
    	ET:= t#0s;
    END_IF
    IF clk AND NOT Q THEN
    ET:= MIN(PT, tx - StartTime);
    Q:= ET = PT AND IN;
    END_IF
    Сравните с предложенным ранее:
    Код:
    FUNCTION_BLOCK ton_p	(*таймер TON с паузой. *)
    VAR_INPUT
    	in:BOOL;
    	pt:TIME;
    	pause:BOOL;
    END_VAR
    VAR_OUTPUT
    	q: BOOL;
    	et:TIME;
    END_VAR
    VAR
    	TP1: TON;
    	R_TRIG1: R_TRIG;
    	F_TRIG1: F_TRIG;
    	init:BOOL:=TRUE;
    	pt1: TIME;
    	et1:TIME;
    END_VAR
    
    IF init THEN
    	init:=FALSE;
    	pt1:=pt;
    	et1:=t#0ms;
    END_IF
    R_TRIG1(CLK:=pause, Q=> );	(*включили паузу*)
    F_TRIG1(CLK:=in, Q=> init);			(*убрали сигнал со входа таймера*)
    IF R_TRIG1.Q THEN	(*если нажали паузу*)
    	pt1:=pt1 - TP1.ET;		(*запоминаем сколько времени осталось отсчитать*)
    	et1:=et1 + TP1.ET;	(*запоминаем сколько времени уже прошло*)
    	TP1.IN:=FALSE;		(*сбрасываем таймер*)
    END_IF
    
    TP1(IN:=SEL(pause, in, in AND pause AND TP1.Q), PT:=pt1);		(*вызываем таймер*)
    q:=TP1.Q;
    
    IF in AND NOT TP1.Q THEN		(*если таймер еще не отработал до конца*)
    	et:=et1+TP1.ET;	(*суммируем отработанное время*)
    ELSIF TP1.Q THEN		(*если таймер отработал до конца*)
    		et:=pt;
    END_IF
    
    IF F_TRIG1.Q THEN		(*если убрали сигнал со входа таймера*)
    	et:=t#0ms;			(*обнуляем*)
    END_IF
    Последний раз редактировалось petera; 14.05.2020 в 12:56.
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Мой канал на РУТУБЕ
    https://rutube.ru/channel/23641433/
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

Ваши права

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