发布于 2013-12-10 15:33:38
7楼
FUNCTION_BLOCK FB200
VAR_INPUT
enable:BOOL;
current_time:DATE_AND_TIME;
sp_year:INT;
sp_month:INT;
sp_day:INT;
days_to_remind:INT;
END_VAR
VAR
sp_time:DATE_AND_TIME;
sp_year_state:INT;
sp_month_state:INT;
sp_day_state:INT;
sp_time_cal:DATE;
current_time_cal:DATE;
sp_time_AT AT sp_time:ARRAY[0..7] OF BYTE;
END_VAR
VAR_OUTPUT
days_left:INT;
days_over:INT;
start_remind:BOOL;
have_over:BOOL;
END_VAR
BEGIN
sp_year_state:=sp_year;
sp_month_state:=sp_month;
sp_day_state:=sp_day;
sp_time_AT[0]:=WORD_TO_BYTE(INT_TO_BCD(sp_year_state));//关键在此,BCD和WORD一样,没有
sp_time_AT[1]:=WORD_TO_BYTE(INT_TO_BCD(sp_month_state));//BCD转BYTE,但有WORD转BYTE
sp_time_AT[2]:=WORD_TO_BYTE(INT_TO_BCD(sp_day_state));
current_time_cal:=DT_DATE(IN :=current_time
); // IN: DATE_AND_TIME
// DATE
sp_time_cal:=DT_DATE(IN :=sp_time // IN: DATE_AND_TIME
); // DATE
days_left:=DINT_TO_INT(DATE_TO_DINT(sp_time_cal))-DINT_TO_INT(DATE_TO_DINT(current_time_cal));
IF days_left>=0 THEN have_over:=False; days_over:=0;
END_IF;
IF days_left<0 THEN
days_over:=days_left*(-1);
have_over:=true;
END_IF;
IF days_left<=days_to_remind THEN
start_remind:=true;
ELSE
start_remind:=false;
END_IF;
END_FUNCTION_BLOCK
源程序已模拟过,可以实现功能。
希望以后大侠们放出功能块时,最好能将源程序附上,供学习,搞 神秘,保密 对于我们这些新手多难