Пьер
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=> );
но очень часто проскакивает 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=> );