Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 20

Тема: Таймер RTC помогите разобраться

  1. #1

    По умолчанию Таймер RTC помогите разобраться

    Хочу в ST создать программу, которая будет подсчитывать время наработки оборудования.
    Хотел применить функцию RTC, не могу с ней разобраться как она работает.

    RTC(EN:= , PDT:= , Q=> , CDT=> );

    я её использовал так:

    RTC(EN:=K , PDT:= , Q=> , CDT=>T);

    то есть, когда K=1, таймер запускается, с выхода CDT снимается время. переменная Т у меня имеет тип TIME. Про эту функцию читал только в справке.

  2. #2
    Пользователь
    Регистрация
    11.01.2009
    Адрес
    Кострома
    Сообщений
    3,144

    По умолчанию

    FUNCTION_BLOCK Ychet_narabotki
    VAR
    RTC1: RTC; (*Время наработки*)
    R_TRIG_Ust: R_TRIG; (*Команда запуска*)
    Tek_schet_p: DWORD; (*Сигнал пуска*)
    M1: BOOL;
    F_TRIG_S: R_TRIG; (*Команда остановки*)
    TOF_S: TOF; (*таймер задержки остановки*)
    RS1: RS; (*Реле пуска -остановки наработки*)
    Tek_schet_p1: DWORD;
    M2: BOOL;
    R_TRIG_Sch: R_TRIG;
    Tim: DT;
    Narabotka_p: TIME;
    Narabotka_Chas_p: DWORD;
    Narabotka_Chas_p1: DWORD;
    Narabotka_Min_p: DWORD;
    Narabotka_min_p1: DWORD;
    Nt: BOOL;
    END_VAR
    VAR_INPUT
    Tek_schet: DWORD; (*счетчик *)
    In_Time: INT; (*астрономическое время(час дня)*)
    END_VAR
    VAR RETAIN
    Narabotka: DT;
    END_VAR
    VAR_OUTPUT
    END_VAR
    VAR_OUTPUT RETAIN
    Narabotka_Min: INT;
    Narabotka_Chas: INT; (*наработка часов за смену*)
    END_VAR

    IF Tek_schet<>Tek_schet_p THEN
    M1:=TRUE;
    ELSE
    M1:=FALSE;
    END_IF;
    R_TRIG_Ust(CLK:= TOF_S.Q, Q=> );
    TOF_S(IN:=M1 , PT:=T#30s , Q=> , ET=> );
    F_TRIG_S(CLK:=TOF_S.Q , Q=> );

    RS1(SET:=R_TRIG_Ust.Q , RESET1:=F_TRIG_S.Q , Q1=> );

    IF In_Time=7 OR In_Time=19 THEN (*Сброс часов*)
    M2:=TRUE;
    ELSE
    M2:=FALSE;
    END_IF;

    R_TRIG_Sch(CLK:=M2 , Q=> ); (*Тригер сброса часов*)

    RTC1(EN:=RS1.Q1 AND NOT R_TRIG_Sch.Q ,
    PDT:=Tim , Q=> , CDT=>Narabotka );

    IF R_TRIG_Sch.Q THEN
    Tim:=DT#1970-01-01-00:00:00;
    Narabotka:=DT#1970-01-01-00:00:00;
    END_IF;

    IF RS1.Q1 AND NOT R_TRIG_Sch.Q THEN
    Tim:=Narabotka;
    END_IF;

    Narabotka_p:=DT_TO_TIME(Tim);
    Narabotka_Chas_p:=TIME_TO_DWORD(Narabotka_p);
    Narabotka_Chas_p1:=Narabotka_Chas_p/3600000;
    Narabotka_Chas:=DWORD_TO_WORD(Narabotka_Chas_p1);

    Narabotka_Min_p:=Narabotka_Chas_p-Narabotka_Chas_p1*3600000;
    Narabotka_min_p1:=Narabotka_Min_p/60000;
    Narabotka_Min:=DWORD_TO_WORD(Narabotka_Min_p1);

    Tek_schet_p:=Tek_schet ;

  3. #3

    По умолчанию

    lara197a, спасибо большое, ваш код очень сильно помог разобраться.

    Выкладываю рабочую программу по учёту наработки:

    PROGRAM PLC_PRG
    VAR
    K AT %IX0.0: BOOL; (*Переменная показывающая состояние двигателя: "К=1" - двигатель включён, "К=0" - двигатель выключен.*)
    M: BYTE; (*Переменная необходимая для того чтобы "А" увеличивалась на единицу один раз за период работы двигателя.*)
    RTC1: RTC; (*Время наработки*)
    R_TRIG_Ust: R_TRIG; (*Команда запуска*)
    Tek_schet_p: DWORD; (*Сигнал пуска*)
    M1: BOOL;
    F_TRIG_S: R_TRIG; (*Команда остановки*)
    TOF_S: TOF; (*таймер задержки остановки*)
    RS1: RS; (*Реле пуска -остановки наработки*)
    Tek_schet_p1: DWORD;
    M2: BOOL;
    R_TRIG_Sch: R_TRIG;
    Tim: DT;
    Narabotka_p: TIME;
    Narabotka_Chas_p: DWORD;
    Narabotka_Chas_p1: DWORD;
    Narabotka_Min_p: DWORD;
    Narabotka_min_p1: DWORD;
    Narabotka_Sek_p: DWORD;
    Narabotka_sek_p1: DWORD;
    Nt: BOOL;
    Z: BOOL;
    END_VAR
    VAR_INPUT
    Tek_schet: DWORD; (*счетчик *)
    In_Time: INT; (*астрономическое время(час дня)*)
    END_VAR
    VAR RETAIN
    Narabotka: DT;
    A: BYTE; (*Переменная показывающая количество пусков. записывается в энергонезависимую память.*)
    END_VAR
    VAR_OUTPUT
    END_VAR
    VAR_OUTPUT RETAIN
    Narabotka_Sek: INT;
    Narabotka_Min: INT;
    Narabotka_Chas: INT; (*наработка часов за смену*)
    END_VAR



    IF K=0 THEN
    M:=0;
    Tek_schet_p:=Tek_schet ;
    Z:=1;
    ELSE
    Z:=0;
    Tek_schet_p:=1;
    IF M=0 THEN
    M:=1;
    A:=A+1;
    END_IF
    END_IF
    IF Tek_schet<>Tek_schet_p THEN
    M1:=TRUE;
    ELSE
    M1:=FALSE;
    END_IF;
    R_TRIG_Ust(CLK:= TOF_S.Q, Q=> );
    TOF_S(IN:=M1 , PT:=T#1s , Q=> , ET=> );
    F_TRIG_S(CLK:=TOF_S.Q , Q=> );

    RS1(SET:=R_TRIG_Ust.Q , RESET1:=Z , Q1=> );

    IF In_Time=7 OR In_Time=19 THEN (*Сброс часов*)
    M2:=TRUE;
    ELSE
    M2:=FALSE;
    END_IF;

    R_TRIG_Sch(CLK:=M2 , Q=> ); (*Тригер сброса часов*)

    RTC1(EN:=RS1.Q1 AND NOT R_TRIG_Sch.Q ,
    PDT:=Tim , Q=> , CDT=>Narabotka );

    IF R_TRIG_Sch.Q THEN
    Tim:=DT#1970-01-01-00:00:00;
    Narabotka:=DT#1970-01-01-00:00:00;
    END_IF;

    IF RS1.Q1 AND NOT R_TRIG_Sch.Q THEN
    Tim:=Narabotka;
    END_IF;

    Narabotka_p:=DT_TO_TIME(Tim);
    Narabotka_Chas_p:=TIME_TO_DWORD(Narabotka_p);
    Narabotka_Chas_p1:=Narabotka_Chas_p/3600000;
    Narabotka_Chas:=DWORD_TO_WORD(Narabotka_Chas_p1);

    Narabotka_Min_p:=Narabotka_Chas_p-Narabotka_Chas_p1*3600000;
    Narabotka_min_p1:=Narabotka_Min_p/60000;
    Narabotka_Min:=DWORD_TO_WORD(Narabotka_Min_p1);

    Narabotka_Sek_p:=Narabotka_Chas_p-Narabotka_Chas_p1*3600000-Narabotka_min_p1*60000;
    Narabotka_sek_p1:=Narabotka_Sek_p/1000;
    Narabotka_Sek:=DWORD_TO_WORD(Narabotka_sek_p1);

  4. #4

    По умолчанию

    А не могли бы Вы написать код для двух насосов (я хочу разобраться но не знаю с чего начать знаний программирования "0") и еще как в визуализацию вставить чтобы показывало наработку

  5. #5
    Пользователь
    Регистрация
    13.10.2011
    Адрес
    Златоуст
    Сообщений
    1,021

    По умолчанию

    IF Tek_schet<>Tek_schet_p THEN
    M1:=TRUE;
    ELSE
    M1:=FALSE;
    END_IF;
    Это индусский код. Надо M1 := Tek_schet <> Tek_schet_p

  6. #6
    Пользователь
    Регистрация
    13.10.2011
    Адрес
    Златоуст
    Сообщений
    1,021

    По умолчанию

    И вообще... не мудрите:
    Код:
    PROGRAM PLC_PRG
    VAR
    	in: BOOL;			(* Ну вход, чо *)
    	ticktock, starter: R_TRIG;	(* Один срабатывает ежесекундно, другой при каждом запуске *)
    END_VAR
    VAR RETAIN
    	uptime, start_count: DWORD;	(* Тут храним время наработки в секундах и число запусков *)
    END_VAR
    
    ticktock(clk := TIME_TO_DWORD(TIME()) MOD 1000 > 500);
    starter(clk := in);
    uptime := uptime + BOOL_TO_DWORD(in AND ticktock.Q);
    start_count := start_count + BOOL_TO_DWORD(starter.Q);

  7. #7
    Пользователь
    Регистрация
    11.01.2009
    Адрес
    Кострома
    Сообщений
    3,144

    По умолчанию

    Цитата Сообщение от Yegor Посмотреть сообщение
    Это индусский код. Надо M1 := Tek_schet <> Tek_schet_p
    Согласен, только в IF были еще действия , часть удалил.
    Это только часть кода.
    В примере время наработки считается относительно. Если счетчик сработал, то включаем учет наработки. Если в течении 30 сек импульсов ни с одного из счетчиков нет, то выключаем учет наработки. Там такая печь, которая работает круглосуточно, а по импульсам считаем подгружает ли человек в нее продукцию или нет.
    И один ПЛК считает сразу за 10 человек.
    Фактически счетчик лени работника. Ну это так частность.

  8. #8

    По умолчанию

    Цитата Сообщение от Yegor Посмотреть сообщение
    И вообще... не мудрите:
    Код:
    PROGRAM PLC_PRG
    VAR
    	in: BOOL;			(* Ну вход, чо *)
    	ticktock, starter: R_TRIG;	(* Один срабатывает ежесекундно, другой при каждом запуске *)
    END_VAR
    VAR RETAIN
    	uptime, start_count: DWORD;	(* Тут храним время наработки в секундах и число запусков *)
    END_VAR
    
    ticktock(clk := TIME_TO_DWORD(TIME()) MOD 1000 > 500);
    starter(clk := in);
    uptime := uptime + BOOL_TO_DWORD(in AND ticktock.Q);
    start_count := start_count + BOOL_TO_DWORD(starter.Q);
    Не могу понять в чём подвох. Вроде отличный код, но почему http://www.owen.ru/forum/showthread....l=1#post136111 настолько замороченее?

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

    По умолчанию

    Цитата Сообщение от energvk Посмотреть сообщение
    Не могу понять в чём подвох. Вроде отличный код, но почему http://www.owen.ru/forum/showthread....l=1#post136111 настолько замороченее?
    Так разверните в этом варианте еще код двух используемых ФБ R_TRIG и добавьте вход для сброса времени наработки и будет не менее замороченее
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

  10. #10

    По умолчанию

    Цитата Сообщение от petera Посмотреть сообщение
    Так разверните в этом варианте еще код двух используемых ФБ R_TRIG и добавьте вход для сброса времени наработки и будет не менее замороченее
    Не знаю, по мне всё равно более читабельнее получается

Страница 1 из 2 12 ПоследняяПоследняя

Похожие темы

  1. Помогите разобраться...
    от kosmas в разделе ПЛК1хх
    Ответов: 85
    Последнее сообщение: 30.09.2014, 09:16
  2. помогите разобраться
    от Барон в разделе ПЛК1хх
    Ответов: 16
    Последнее сообщение: 17.11.2010, 08:30
  3. помогите разобраться
    от a_l_e_x в разделе ПЛК1хх
    Ответов: 3
    Последнее сообщение: 02.07.2010, 16:51
  4. Помогите разобраться...
    от xaker_tm в разделе ПЛК1хх
    Ответов: 7
    Последнее сообщение: 08.02.2010, 17:33
  5. Помогите разобраться !!
    от viking в разделе ПЛК1хх
    Ответов: 4
    Последнее сообщение: 21.11.2007, 14:31

Ваши права

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