“DINT和TIME呢?”,我觉得坛主问到的问题一定有其深义,本人就此个问题经过以下思考:
咋一看这两种类型似乎很简单,手册上写的很清楚:
DINT是32位有符号双整数类型,值域:L#-2147483648~L#2147483647
TIME是IEC时间类型,值域:T#-24D_20H_31M_23S_648MS~T#24D_20H_31M_23S_647MS
仔细琢磨觉得真的很有意思,TIME类型在赋值时是按"T#xxDxxHxx...."格式赋值的,而在S7内部其实是:以1毫秒为基本时间单位的32位有符号双整数表示时间值,因此,将TIME的实参赋值给一个TIME的形参后或保存到一个DINT类型的存储单元时,就变成了DINT值,本人用以下程序进行了仿真:
OB1
CALL FC 1
T:=DB1.DBD0
D:=DB1.DBD4
FC1:
L #T //TIME类型
T #D //DINT类型
DB1:
DATA_BLOCK DB 1
TITLE =
VERSION : 0.1
STRUCT
T : TIME := T#1D1H;
D : DINT ;
END_STRUCT ;
BEGIN
T := T#1D1H;
D := L#0;
END_DATA_BLOCK


从以上仿真图片可以看出:
1. TIME类型在S7内部本质上就是一个DINT类型,就像廖老师说的不过是“染成五颜六色的小鸡”;
2. 当将TIME型变量赋值给DINT型变量(见上述程序)应该是隐式转换的一种。
从中也可以体会出IEC TIME的以下优点:
1. 具有唯一的基本时间(1毫秒);
2. TIME实参在赋值给形参后,无需转换就可以直接用其它32位类型一样计算方法进行计算,例如:+D, -D, *D, /D等等;
3.转换其它时间类型非常方便,例如:
L #T //TIME类型
L L#86400000 //一天(24小时)的毫秒值24*3600*1000
/D
T .... //得到的就是‘天’数
求模后的值可以继续计算小时、分、秒等等,实现IEC TIME到其它类型,例如DT类型等,的转换。