[西门子] 实例应用分享:你知道如何在博图中实现将DTL表格日期时间变换成字符串吗?附实例+注释

[复制链接]
查看41722 | 回复0 | 2024-4-15 08:11:11 | 显示全部楼层 |阅读模式

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册哦

x
您需要登录后才可以回帖 登录 | 注册哦

本版积分规则