PDA

Просмотр полной версии : время дата



Пьер
02.09.2017, 13:12
Есть в кдс 3 такой блок GetDataAndTime. чтобы взять время, на соответствующий вход подаем Тrue, и получаешь, а если False то время 1970 года. я сделал, Фб где получаю реальное время.
но очень часто проскакивает 1970 год. что не так я не знаю. подскажите пожалуйста.

FUNCTION_BLOCK CMG_ChMS
VAR_INPUT

bON:BOOL;
END_VAR
VAR_OUTPUT
wChislo:WORD;
wMesyac:WORD;
wGod:WORD;
wChas:WORD;
wMin:WORD;
wSec:WORD;
DayWeek:WORD;
sDMG:STRING;
sCMS:STRING;



END_VAR
VAR
sDMGCMS:STRING;
GetDT_01:RTCLK.GetDateAndTime;
dInDate:DATE_AND_TIME;
dInDateSET:DATE_AND_TIME;
qq:TIME;
tt:TOD;
dd:DATE;
b1: BOOL;
b2: BOOL;
b3: BOOL;
b4: BOOL;
dat1: DATE_AND_TIME;
Bl_Time:blink; (*блинкер для постоянного обновления времени*)

NomerNedely:RTCLK.WEEKDAY;
TimerTON:TON;
TimerTOF:TOF;
pe:POINTER TO ERROR;
RT_SET:R_TRIG;
END_VAR
----------


IF RT_SET.Q THEN

sDMGCMS:=DT_TO_STRING(dInDate);
qq:=DT_TO_TIME(dInDate);
tt:=DT_TO_TOD(dInDate);
dd:=DT_TO_DATE(dInDate);
(*sDMG:=Right(DATE_TO_STRING(dd),8);*)
(*sCMS:=Right(TOD_TO_STRING(tt),8);*)
sDMG:=CONCAT(MID(DATE_TO_STRING(dd),2,11),'.');
sDMG:=CONCAT(sDMG, MID(DATE_TO_STRING(dd),2,8));
sDMG:=CONCAT(sDMG, '.');
sDMG:=CONCAT(sDMG, MID(DATE_TO_STRING(dd),2,5));

wChislo:=STRING_TO_WORD(MID(sDMG,2,1));
wMesyac:=STRING_TO_WORD(MID(sDMG,2,4));
wGod:=STRING_TO_WORD(MID(sDMG,2,7));



sCMS:=MID(TOD_TO_STRING(tt),5,5);
wChas:=STRING_TO_WORD(MID(sCMS,2,1));
wMin:=STRING_TO_WORD(MID(sCMS,2,4));

NomerNedely:=DTU.GetDayOfWeek(dtDate:=DT_TO_DATE(d InDate), peError:=pe );
IF NomerNedely=DTU.RTCLK.WEEKDAY.MONDAY THEN
DayWeek:=1;
END_IF
IF NomerNedely=DTU.RTCLK.WEEKDAY.TUESDAY THEN
DayWeek:=2;
END_IF
IF NomerNedely=DTU.RTCLK.WEEKDAY.WEDNESDAY THEN
DayWeek:=3;
END_IF
IF NomerNedely=DTU.RTCLK.WEEKDAY.THURSDAY THEN
DayWeek:=4;
END_IF
IF NomerNedely=DTU.RTCLK.WEEKDAY.FRIDAY THEN
DayWeek:=5;
END_IF
IF NomerNedely=DTU.RTCLK.WEEKDAY.SATURDAY THEN
DayWeek:=6;
END_IF
IF NomerNedely=DTU.RTCLK.WEEKDAY.SUNDAY THEN
DayWeek:=7;
END_IF

END_IF
(*******************************************)

RT_SET(CLK:=b1 , Q=> );

Bl_Time(ENABLE:=bON , TIMELOW:=T#1S , TIMEHIGH:=T#1S , OUT=>b1 );

GetDT_01(
xExecute:=b1 ,
xDone=>b2 ,
xBusy=>b3 ,
xError=>b4 ,
eError=> ,
dtDateAndTime=>dInDate ,
eTimezone=> );

Евгений Кислов
02.09.2017, 13:22
Забирать данные с выхода блока надо только в тот момент, когда он завершил работу (т.е. когда xDone=TRUE). Подробнее об этом см. в документе СПК. Системное время.

Вам, возможно, подойдет это:
http://www.owen.ru/forum/showthread.php?t=15530&p=251252&viewfull=1#post251252

Sergeba
19.03.2018, 22:40
Забирать данные с выхода блока надо только в тот момент, когда он завершил работу (т.е. когда xDone=TRUE). [/url]

Использую эту функцию для получения текущего времени, но заметил, периодически, на моём опыте использования, ПЛК304 (а это около месяца) дважды функция начинала глючить и выдавала 1970 год. Помогает перезагрузка ПЛК по питанию.