image-20240327182321667
今日分享一个实际应用中做的程序块,有一个项目需要甲方需要在触摸屏上面做一个维护保养的页面,本来以为很简单,在当前日期上面做计时程序,到时间提醒就好了;结果实际需求是需要显示起始时间例如:'2024-03-29 19:00:00',结束时间可设定数值,周期单位可自选"年,月,日,时,分"自动生成,例如1天后,生成:'2024-03-30 19:00:00';如下图:
image-20240329191844742
看到后第一时间想到的,这不是很简单,在把当前时间+设定时间都显示成字符串就搞定了,没啥难度;但当我开始做的时候发现一个比较尴尬的事情,PLC里面没有现成指令,而且获取的时间是DTL格式,不是字符串,我把他想成C#之前做过的了;这咋办,只能自己做了!于是就有了下面的代码,今日分享如何将DTL时间转化为字符串输出;
完整代码如下,复制后放在FC块就可以使用,变成标准块使用;建议收藏一下,会的小伙伴请忽略
下次分享,上面触摸屏功能如何实现,需要的小伙伴请留意;
///
//
// 程序功能:将DTL格式的本地时间转换为字符串 '2024-03-29 19:06:30'
//
// 作者:ICS-Pedia
//
// 首次发表:2024-03-29
//
//************** 欢迎关注微信公众号:"工业控制系统百科"
//
//
// 获取本地时间; #Return_Data(RD_LOC_T返回值)
// Year 将年#DateTime_DTL.YEAR数值2024转化为字符串'2024'写入到#DateTime_Now_String
VAL_STRG(IN := #DateTime_Now_DTL.YEAR,
SIZE := 4, // 数值长度例如:2024=4
PREC := 0, // 不带小数点=0
FORMAT := 0,// 整数转化=0
P := 1, // 字符串插入位置:从1开始计算;
OUT => #DateTime_Now_String);
//在#DateTime_Now_String '2024'插入'-'使#DateTime_Now_String变为'2024-'
// IN1:被插入的字符串;IN2:需要插入的字符或者字符串;p: 插入位置,比如在'2024'后就是第4个符号后,所以选择4
#DateTime_Now_String := INSERT(IN1 := #DateTime_Now_String, IN2 := '-', P := 4);
// Month 将月#DateTime_DTL.MONTH数值3转化为字符串'03'写入到#DateTime_Now_String变为'2024-03'
// 首先判断月份是否大于10即数字是1位数还是2位数,如果是1位则需要补零;
IF #DateTime_Now_DTL.MONTH < 10 THEN
// 补0
VAL_STRG(IN := 0,
SIZE := 1,
PREC := 0,
FORMAT := 0,
P := 6,
OUT => #DateTime_Now_String);
VAL_STRG(IN := #DateTime_Now_DTL.MONTH,
SIZE := 1,
PREC := 0,
FORMAT := 0,
P := 7,
OUT => #DateTime_Now_String);
ELSE
VAL_STRG(IN := #DateTime_Now_DTL.MONTH,
SIZE := 2,
PREC := 0,
FORMAT := 0,
P := 6,
OUT => #DateTime_Now_String);
END_IF;
// 在月份后面插入'-'
#DateTime_Now_String := INSERT(IN1 := #DateTime_Now_String, IN2 := '-', P := 7);
// Day 将天#DateTime_DTL.Day数值3转化为字符串'03'写入到#DateTime_Now_String变为'2024-03-29'
// 首先判断天是否大于10即数字是1位数还是2位数,如果是1位则需要补零;
IF #DateTime_Now_DTL.DAY < 10 THEN
VAL_STRG(IN := 0,
SIZE := 1,
PREC := 0,
FORMAT := 0,
P := 9,
OUT => #DateTime_Now_String);
VAL_STRG(IN := #DateTime_Now_DTL.DAY,
SIZE := 1,
PREC := 0,
FORMAT := 0,
P := 10,
OUT => #DateTime_Now_String);
ELSE
VAL_STRG(IN := #DateTime_Now_DTL.DAY,
SIZE := 2,
PREC := 0,
FORMAT := 0,
P := 9,
OUT => #DateTime_Now_String);
END_IF;
// 在天后面插入' '
#DateTime_Now_String := INSERT(IN1 := #DateTime_Now_String, IN2 := ' ', P := 10);
// Hour 注释同上
IF #DateTime_Now_DTL.HOUR < 10 THEN
VAL_STRG(IN := 0,
SIZE := 1,
PREC := 0,
FORMAT := 0,
P := 12,
OUT => #DateTime_Now_String);
VAL_STRG(IN := #DateTime_Now_DTL.HOUR,
SIZE := 1,
PREC := 0,
FORMAT := 0,
P := 13,
OUT => #DateTime_Now_String);
ELSE
VAL_STRG(IN := #DateTime_Now_DTL.HOUR,
SIZE := 2,
PREC := 0,
FORMAT := 0,
P := 12,
OUT => #DateTime_Now_String);
END_IF;
#DateTime_Now_String := INSERT(IN1 := #DateTime_Now_String, IN2 := ':', P := 13);
// minute
IF #DateTime_Now_DTL.MINUTE < 10 THEN
VAL_STRG(IN := 0,
SIZE := 1,
PREC := 0,
FORMAT := 0,
P := 15,
OUT => #DateTime_Now_String);
VAL_STRG(IN := #DateTime_Now_DTL.MINUTE,
SIZE := 1,
PREC := 0,
FORMAT := 0,
P := 16,
OUT => #DateTime_Now_String);
ELSE
VAL_STRG(IN := #DateTime_Now_DTL.MINUTE,
SIZE := 2,
PREC := 0,
FORMAT := 0,
P := 15,
OUT => #DateTime_Now_String);
END_IF;
#DateTime_Now_String := INSERT(IN1 := #DateTime_Now_String, IN2 := ':', P := 16);
// second
IF #DateTime_Now_DTL.SECOND < 10 THEN
VAL_STRG(IN := 0,
SIZE := 1,
PREC := 0,
FORMAT := 0,
P := 18,
OUT => #DateTime_Now_String);
VAL_STRG(IN := #DateTime_Now_DTL.SECOND,
SIZE := 1,
PREC := 0,
FORMAT := 0,
P := 19,
OUT => #DateTime_Now_String);
ELSE
VAL_STRG(IN := #DateTime_Now_DTL.SECOND,
SIZE := 2,
PREC := 0,
FORMAT := 0,
P := 18,
OUT => #DateTime_Now_String);
END_IF;
#DateTime_Now_String := INSERT(IN1 := #DateTime_Now_String, IN2 := ' ', P := 19);
监控效果如下:
image-20240329192702002
image-20240324184601616
如果您觉得文章对您有帮助,欢迎评论、点赞、收藏,加关注!您的支持将是小编最大动力!
关注公众号,发送10007,获取样例程序
public |