scl高级编程详解(如何使用SCL编程来确定今天是一年中的第几周和第几天)

今天给大家带来一个在博途中使用SCL编程来计算今天是一年中的第几周和第几天的小例子。

不过多的废话,直接上图,看看仿真后的结果:

scl高级编程详解(如何使用SCL编程来确定今天是一年中的第几周和第几天)(1)

下面重点来了,看看如何编写FC程序

1、接口变量

Input:

scl高级编程详解(如何使用SCL编程来确定今天是一年中的第几周和第几天)(2)

output:

scl高级编程详解(如何使用SCL编程来确定今天是一年中的第几周和第几天)(3)

temp:

scl高级编程详解(如何使用SCL编程来确定今天是一年中的第几周和第几天)(4)

constant:

scl高级编程详解(如何使用SCL编程来确定今天是一年中的第几周和第几天)(5)

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、完成程序如下:

scl高级编程详解(如何使用SCL编程来确定今天是一年中的第几周和第几天)(6)

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页