werg blink ?
я вот такой счетчик делал, считать можно все что угодно и составлять в каскад
Счетчик делался для подсчета всего, что хочется с возможностью сброса только необходимого.
Переменный входные/выходные можно в retain включить CV1-CV4
Входные PV1-PV4 это до скольки считать для увеличения следующего CV
steck - выход для следующего счетчика
enable - разрешение счета
CU - фронт счетного импульса
PVr - задание битовой маски, какой из счетчиков сбросить
импульс на reset сбросит указанный в маске счетчик.
Счетчик 32-х разрядный, применять можно для чего угодно и как угодно, не обязательно для времени наработки.
Последний раз редактировалось melky; 06.05.2015 в 18:02.
Для аналогичной задачи использовал несколько другой подход - отслеживается изменение состояния двигателя, при включении - сохраняется время запуска, при выключении - рабочие часы получаются вычитанием времени запуска из текущего. Время при этом синхронизируется по NTP.
Обратите внимание на тот раздел документации, где подчёркивается нежелательность частого обращения к RETAIN-переменным, у них ограниченный ресурс перезаписи.
Ivan_P в описании в общем все есть. На картинке как раз пример счетчика времени с вытекающими погрешностями от цикла программы.
у счетчика 4 переменных выставлены сверху вниз 60 - сек, 60 - минут, 24 - часа, 365 - дней.
сместите вверх, чтобы начиналось с минут и подавайте импульсы раз в минуту. Тогда четвертым параметром станут года например.
з.ы. это просто счтетчик на 32 разряда для каждой переменной. На картинке пример для времени.
Чтобы сбросить 1 или несколько счетчиков в 0 на PVr подаем битовую маску нужных счетчиков например для 2-ого подать dec 2 (0010) и дать импульс на сброс.
dec 15 в битовой маске поставьте (1111) то сбросятся все.
младший бит - первый счетчик, старший бит - 4-й счетчик
есть такой ФБ RTC в бибках.
На нем и стройте.
Пример кода, только свои условия для запуска-остановки сброса вставьте.
Преобразования показаны:
FUNCTION_BLOCK Ychet_narabotki
VAR
RTC1: RTC; (*Âðåìÿ íàðàáîòê&# 232;*)
R_TRIG_Ust: R_TRIG; (*Êîìàíäà çàïóñêà*)
Tek_schet_p: DWORD; (*Ñèãíàë ïóñêà*)
M1: BOOL;
F_TRIG_S: R_TRIG; (*Êîìàíäà îñòàíîâê&# 232;*)
TON_S: TON; (*òàéìåð çàäåðæêè ; îñòàíîâê&# 232;*)
RS1: RS; (*Ðåëå ïóñêà -îñòàíîâê&# 232; íàðàáîòê&# 232;*)
Tek_schet_p1: DWORD;
M2: BOOL;
R_TRIG_Sch: R_TRIG;
Tim: DT;
Narabotka_p: TIME;
Narabotka_Chas_pWORD;
Narabotka_Chas_p1: DWORD;
Narabotka_Min_p: DWORD;
Narabotka_min_p1: DWORD;
Nt: BOOL;
TP1: TP;
F_TRIG22: F_TRIG;
M_sch: BOOL;
BLINK1: BLINK;
M22: BOOL;
END_VAR
VAR_INPUT
Tek_schet: DWORD; (*ñ÷åò÷èê *)
In_Time: INT; (*àñòðîíîì è÷åñêîå âðåìÿ(÷à 1; äíÿ*)
END_VAR
VAR RETAIN
Narabotka: DT;
END_VAR
M1:=Tek_schet<>Tek_schet_p;
M_sch:=Tek_schet=Tek_schet_p;
TON_S(IN:=M_sch
, PT:=T#30s , Q=> , ET=> ); (*Åñëè çíà÷åíèå ; íå ìåíÿåòñÿ ; â òå÷åíèè 30 ñåê, òî ñóøèëêà íå ðàáîòàåò ;*)
RS1(SET:=M1 , RESET1:=TON_S.Q , Q1=> );
M2:= In_Time=7 OR In_Time=19; (*Ñáðîñ ÷àñîâ*)
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);
ЗЫ. если не разберете, пишите в личку. Скину в виде программы, а то коменты шрифты коверкают
Последний раз редактировалось lara197a; 08.10.2016 в 22:56.
А вы переключите в русский язык клаву, а потом копируйте в буфер, может русский сохранится.
Что будет при переходе через 0 часов 0 минут ?
RTC нуля не боится.
у меня программа считает работу 12 печей в 3 смены.(круглые сутки)
с 2011г
Последний раз редактировалось lara197a; 09.10.2016 в 01:44.