回复:应用探讨——PLC 数据类型探讨

老学童

  • 帖子

    765
  • 精华

    32
  • 被关注

    64

论坛等级:奇侠

注册时间:2011-06-22

钻石 钻石 如何晋级?

发布于 2013-11-10 15:49:54

51楼

DATE_AND_TIME类型的理解与实践
DATE_AND_TIME即DT类型是S7复杂类型的一种,由8个字节组成,从字节0到字节7用BCD码分别表示年、月、日、小时、分、秒、毫秒的十分位和百分位值、毫秒的千分位值和周日期(星期几),即:
字节0 -------->年
字节1 -------->月
字节2 -------->日
字节3 -------->小时
字节4 -------->分
字节5 -------->秒
字节6 -------->毫秒的十分位和百分位值
字节7 -------->7~4位为毫秒的千分位值,3~0位为周日期(星期几)
在实际运用中,常常需要将DT类型实参的每个字节进行BCD到INT的类型转换后才能使用,本人通过编辑以下程序增强了对DT类型的理解和运用,本程序完全自行编写并经过仿真验证,在此与大家分享:
OB1:
NETWORK
TITLE =
CALL SFC 1 ( //调用标准功能SFC1读取系统日期和时间
RET_VAL := DB6.DBW 26, //SFC1执行错误代码
CDT := DB6.VAR1_DT); //保存至DB6.DBX0.0开始的8个字节
NETWORK
TITLE =
CALL FC 1 ( //调用FC1进行数据转换
ActualDateTime := DB6.VAR1_DT);
FC1:
L P##ActualDateTime //读取并加载DB6.DBX0.0开始DT数据指针
LAR1 //将指针地址装入地址寄存器1
L 0
L W [AR1,P#0.0] //将指针中的DB块号加载至累加器1
==I
JC _001 //判断是否为DB数据块,否则跳转至_001
T #DB_NO //保存DB块号
OPN DB [#DB_NO] //打开DB块
_001: L D [AR1,P#2.0] //将指针中的区域指针加载至累加器1
LAR1 //将数据源(DT型)区域指针保存至地址寄存器1
LAR2 //将目标(INT型)区域指针保存至地址寄存器2
L 7 //设置循环次数
_002: T MW 10 //循环次数计数
L B [AR1,P#0.0] //依次加载DT数据前7个字节
BTI //BCD到INT转换
T W [AR2,P#8.0] //保存至DB6.DBX8.0开始的7个INT类型数据区
+AR1 P#1.0 //数据源(DT型)区域指针偏移1个字节
+AR2 P#2.0 //目标(INT型)区域指针偏移2个字节
L MW 10
LOOP _002 //通过LOOP循环依次将DT型的每个字节转换为INT型
L B [AR1,P#0.0] //将DT的第8个字节加载至累加器1
SRW 4 //将累加器1的低字右移4位(滤掉‘周日期’的BCD码)
BTI //BCD到INT转换
T W [AR2,P#8.0] //保存至DB6.DBX8.0开始的第8个INT类型数据区
L B [AR1,P#0.0] //将DT的第8个字节加载至累加器1
AW W#16#F //与W#16#F‘字与’(滤掉毫秒千分位BCD码)
+AR2 P#2.0 //目标(INT型)区域指针偏移2个字节
T W [AR2,P#8.0] //保存至DB6.DBX8.0开始的第9个INT类型数据区
BE //块结束
DB6:
DATA_BLOCK DB 6
TITLE =
VERSION : 0.1
STRUCT
VAR1_DT : DATE_AND_TIME ; //实际日期时间
YEAR_I : INT ; //INT类型的‘年’值
MONTH_I : INT ; //INT类型的‘月’值
DAY_I : INT ; //INT类型的‘日’值
HOUR_I : INT ; //INT类型的‘时’值
MINUTE_I : INT ; //INT类型的‘分’值
SECOND_I : INT ; //INT类型的‘秒’值
MILLIS_12_I : INT ; //INT类型的‘毫秒’的十分和百分位值
MILLIS_3_I : INT ; //INT类型的‘毫秒’的千分位值
WEEK_D_I : INT ; //INT类型的‘星期几’值
ERROR : INT ; //SFC1执行错误代码
END_STRUCT ;
BEGIN
VAR1_DT := DT#90-1-1-0:0:0.000;
YEAR_I := 0;
MONTH_I := 0;
DAY_I := 0;
HOUR_I := 0;
MINUTE_I := 0;
SECOND_I := 0;
MILLIS_12_I := 0;
MILLIS_3_I := 0;
WEEK_D_I := 0;
ERROR := 0;
END_DATA_BLOCK


参考:
http://www.ad.siemens.com.cn/club/bbs/post.aspx?b_id=4&a_id=1071117&s_id=0&num=4#anch
http://www.ad.siemens.com.cn/club/bbs/post.aspx?b_id=4&a_id=873506&s_id=0&num=35#anch
人的生命似洪水在奔流,不遇着岛屿、暗礁,难以激起美丽的浪花。
评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-300/400

共有54616条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

  • 分享

  • 只看
    楼主

top
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。