在项目实施中,使用的PCS7,需要实现一个功能,其中一部分就是读取CPU的时间。这个功能实现很简单,标准库里有个块READ_CLK,也就是SFC1,直接调用它就能读到CPU的时间了。
但是我想在WinCC中以时分秒来显示,就需要进一步操作了,因为这个块读到的时间不能在WinCC中调用中被调用。
方法一:
1、新建一个DB,在里面创建一个Date_And_Time的数据类型变量,名为PLC_Time,用来存储READ_CLK读到的时间数据;
2、打开符号表,新建变量T_HH、T_mm、T_ss,数据类型为Byte,用来分别存储时分秒的数据,并打上旗帜的标识,以使tag在WinCC中调用;
3、先将READ_CLK读到的时间数据存储到DB定义好的变量中,再使用Move块,将DB中的这个变量拆解为字节,将对应的字节复制到对应的T_HH、T_mm、T_ss变量中;
4、下载编译后,就可以在WinCC中调用T_HH、T_mm、T_ss这三个变量用来显示时分秒了,注意IO域的显示类型Data Format为Hexadecimal。
方法二:
另外参考了官方文档,还可以使用以下方法读取CPU的时间:
1、新建一个FB块,指定FB号和名字,同时在FB属性中设置S_m_c为true。
2、在FB中定义临时变量和Out变量具体如下,注意Out变量的设置S_m_c为true,以便WinCC直接调用tag:
3、在FB写入如下STL程序:
4、在CFC中调用这个FB,编译下载到CPU后,可监视到如下时间数据:
5、编译WinCC,就可以在WinCC调用步骤4中CFC对应的Out部分数据了,注意IO域的显示类型Data Format为Hexadecimal。
上面两个方法最终实现在WinCC中显示CPU时间的效果如下:
注意,Date_And_Time数据类型共有8个字节,每个字节对就的意义如下,供参考:
附上STL代码:
CALL “READ_CLK”
RET_VAL:=#RET
CDT :=#ReadDateAndTimeL P##ReadDateAndTime
LAR1
//Byte0 –> Year
L B [AR1,P#0.0]
T #Year//Byte1 –> Month
L B [AR1,P#1.0]
T #Month//Byte2 –> Day
L B [AR1,P#2.0]
T #Day//Byte3 –> Hour
L B [AR1,P#3.0]
T #Hour//Byte4 –> Minute
L B [AR1,P#4.0]
T #Minute//Byte5 –> Second
L B [AR1,P#5.0]
T #Second//word6 –> Millisecond
L W [AR1,P#6.0]
SRW 4
T #Millisecond//Byte7 –> Week
L B [AR1,P#7.0]
L B#16#F
AW
T #Week