
我们一直在尝试把一些常规的程序需求,封装成复用的功能或功能块,做成标准化的模块,提高我们程序完成的质量和效率!
当然,这里主体采用的还是ST语言,它的优势和趋势已经很明显了,我们也多次做过分享:PLC编程主流的两种语言大PK!!!
我们这期也是项目中需要用到的功能,所以和大家分享如下:

关于ST语言的资料,我们再次分享下,没有下载的朋友可以链接里领取:

在触摸屏上,有些品牌的HMI直接支持Time类型的,但是想做到通用,那么,我们可以将Time类型的变量转换成Int类型的Hour、Minute、Second!这样,几乎所有的HMI就能支持了,优点就是代码的兼容性较高,不需要做任何的程序上的修改。

我们这里主要用ST语言来进行转换,为了标准化和复用性,可创建Function或者Function Block。这两个概念我们在这个分享里有详细的描述:
PLC Control with ST,V3版本学习笔记10—巧用子程序、功能块FB及函数FC!

源代码
我们这里以CODESYS编程环境为例,来详细介绍:
主要步骤:
详细的代码如下所示:
// 1. 将TIME类型转换为总毫秒数(DINT)
diTotalMilliseconds := TIME_TO_DINT(tInTime);
// 2. 计算小时
iHOUR := TO_INT( diTotalMilliseconds / 3600000 ); // 1小时 = 3600 * 1000 毫秒
diRemainingValue := diTotalMilliseconds MOD 3600000; // 取余得到除去小时后的毫秒数
// 3. 计算分钟
iMINUTE := TO_INT( diRemainingValue / 60000 ); // 1分钟 = 60 * 1000 毫秒
diRemainingValue := diRemainingValue MOD 60000; // 取余得到除去分钟后的毫秒数
// 4. 计算秒
iSecond := TO_INT( diRemainingValue / 1000 ); // 1秒 = 1000 毫秒
变量申明部分如下:
(*功能块作用是把Time类型的变量转变成INT类型的时分秒*)
FUNCTION_BLOCK TimeToHMS
VAR_INPUT
tInTime : TIME; // 输入TIME类型的时间值
END_VAR
VAR_OUTPUT
iHour : INT; // 输出小时
iMinute : INT; // 输出分钟
iSecond : INT; // 输出秒
END_VAR
VAR
diTotalMilliseconds : DINT; // 总毫秒数(注意范围)
diRemainingValue : DINT; // 中间计算值
END_VAR测试效果:

当然,有些场合需要用字符串的方式显示时分秒,那么可以在上述代码中的INT类型的时分秒,转换成字符串,然后用CONCAT字符串拼接指令按照实际的显示要求进行拼接即可!具体的代码不做演示,有疑问的朋友可以留言区留言哦!
最后,关于本期分享的内容,大家有更好的方法,欢迎留言交流哦!