scl高级编程详解(如何使用SCL编程来确定今天是一年中的第几周和第几天)
今天给大家带来一个在博途中使用SCL编程来计算今天是一年中的第几周和第几天的小例子。
不过多的废话,直接上图,看看仿真后的结果:
下面重点来了,看看如何编写FC程序
1、接口变量
Input:
output:
temp:
constant:
2、SCL程序如下:
// 检查时间
IF #当前时间 < #MIN_DATE THEN
#error := TRUE;
#status := #ERROR_LOW_LIM_DATE;
RETURN;
END_IF;
IF #当前时间 > #MAX_DATE THEN
#error := TRUE;
#status := #ERROR_UP_LIM_DATE;
RETURN;
END_IF;
// 给TEMP变量赋值
#tempYearCurrentYear := #当前时间.YEAR;
#tempYearPrevYear := #当前时间.YEAR - #ONE_YEAR;
#tempYearNextYear := #当前时间.YEAR #ONE_YEAR;
// 检查当前年是闰年?
#tempCurrentYearIsLeapyear := (((#tempYearCurrentYear MOD 4 = 0) AND NOT (#tempYearCurrentYear MOD 100 = 0)) OR (#tempYearCurrentYear MOD 400 = 0));
// 检查前一年是闰年?
#tempPrevYearIsLeapyear := (((#tempYearPrevYear MOD 4 = 0) AND NOT (#tempYearPrevYear MOD 100 = 0)) OR (#tempYearPrevYear MOD 400 = 0));
// 当前年1月1日是星期几?
#过程时间 := #当前时间;
#过程时间.MONTH := #JANUARY;
#过程时间.DAY := #"1_ST";
#过程时间 := #过程时间 T#0ms;
#tempCurrentYearWeekday1Jan := #过程时间.WEEKDAY;
// 计算过去了多少天
#tempDays := DATE_TO_DINT(DTL_TO_DATE(#当前时间)) - DATE_TO_DINT(DTL_TO_DATE(#过程时间)) #ONE_DAY;
// 下一年的1月1日时是星期几?
#过程时间.YEAR := #tempYearNextYear;
#过程时间.MONTH := #JANUARY;
#过程时间.DAY := #"1_ST";
#过程时间 := #过程时间 T#0ms;
#tempNextYearWeekday1Jan := #过程时间.WEEKDAY;
// 本年的12月31日是星期几?
#过程时间 := #当前时间;
#过程时间.MONTH := #DECEMBER;
#过程时间.DAY := #"31_ST";
#过程时间 := #过程时间 T#0ms;
#tempCurrentYearWeekday31Dec := #过程时间.WEEKDAY;
//前一年的1月1日时星期几?
#过程时间.YEAR := #tempYearPrevYear;
#过程时间.MONTH := #JANUARY;
#过程时间.DAY := #"1_ST";
#过程时间 := #过程时间 T#0ms;
#tempPrevYearWeekday1Jan := #过程时间.WEEKDAY;
// 前一年的12月31日时星期几?
#过程时间.YEAR := #tempYearPrevYear;
#过程时间.MONTH := #DECEMBER;
#过程时间.DAY := #"31_ST";
#过程时间 := #过程时间 T#0ms;
#tempPrevYearWeekday31Dec := #过程时间.WEEKDAY;
// 以1月1日是星期几来校正天数。
CASE #tempCurrentYearWeekday1Jan OF
#SUNDAY:
#tempDaysCorr := #tempDays - #ONE_DAY;
#MONDAY:
#tempDaysCorr := #tempDays;
#TUESDAY:
#tempDaysCorr := #tempDays #ONE_DAY;
#WEDNESDAY:
#tempDaysCorr := #tempDays #TWO_DAYS;
#THURSDAY:
#tempDaysCorr := #tempDays #THREE_DAYS;
#FRIDAY:
#tempDaysCorr := #tempDays #FOUR_DAYS;
#SATURDAY:
#tempDaysCorr := #tempDays #FIVE_DAYS;
END_CASE;
// 计算周数
#tempWeek := #tempDaysCorr / #SEVEN_DAYS #ONE_WEEK;
//检查当前年是否有53周
#tempIsCurrentYearWith53Weeks := (NOT #tempCurrentYearIsLeapyear AND (#tempCurrentYearWeekday1Jan = #SATURDAY AND #tempCurrentYearWeekday31Dec = #SATURDAY)) OR
(#tempCurrentYearIsLeapyear AND ((#tempCurrentYearWeekday1Jan = #SATURDAY AND #tempCurrentYearWeekday31Dec = #SUNDAY) OR (#tempCurrentYearWeekday1Jan = #FRIDAY AND #tempCurrentYearWeekday31Dec = #SATURDAY)));
// 基于有53周来校正周数
IF #tempWeek = #WEEK_53 THEN
IF #tempIsCurrentYearWith53Weeks THEN
#tempWeek := #WEEK_53;
ELSE
#tempWeek := #WEEK_1;
END_IF;
END_IF;
IF #tempWeek = #WEEK_54 THEN
#tempWeek := #WEEK_1;
END_IF;
//输出
#第几天 := #tempDays;
#第几周 := #tempWeek;
#error := FALSE;
#status := #NO_ERROR;
3、完成程序如下:
,
免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com