来自西门子技术支持热线的故事:如何利用OB1的临时变量读取CPU系统时钟

已锁定

西门子Auto

官方工程师

  • 帖子

    126
  • 精华

    16
  • 被关注

    233

论坛等级:侠圣

注册时间:2007-08-03

普通 普通 如何晋级?

来自西门子技术支持热线的故事:如何利用OB1的临时变量读取CPU系统时钟

13882

39

2010-11-24 11:03:27

今天遇一用户,需要读出CPU315-2DP的系统时钟,与设定的时间作比较,然后出各班的报表数据。可用户就是不理解Date_And_Time的数据类型,在程序里怎么写,都是红色的,郁闷死了,客户自己说都弄一天了,说了很多和技术不相关的内容,用户最后的要求就是一步一步教他怎么做。没办法,谁让咱们的数据类型如此“复杂”呢?

不过虽然读取和设置系统时钟很简单,总会有人问,如何用SFC0和SFC1来设置和读取时钟,今天就和大家说一说。

首先Date_And_Time是一复杂数据类型,包含8个字节,Byte0-Byte7对应年、月、日、时、分、秒、毫秒、星期,对应关系如下表所示:


Byte6和Byte7的高4位组合成毫秒,格式是BCD码,Byte6是高位,Byte7是低位

我们可以在DB块里定义time1和time2变量,数据类型是DATE_AND_TIME,如下图:


在符号表中定义DB1的符号名为system-time,如下图:


然后调用SFC0和SFC1就可以了,大家可以参考下面的程序(可以将程序拷贝到Step7中,然后可以转成梯形图程序),具体使用时间时可以直接寻址DB1.DBB0 – 年 ……DB1.DBB7(低4位) – 星期,DB1.DBB8 – 年 ……DB1.DBB15(低4位) – 星期。(这段程序和用户解释了很长时间,用户就是理解不了,难啊。。。)
OB1:"Main Program Sweep (Cycle)"
Network1:
A M 10.0
JNB _001
CALL SFC 0
PDT :="system-time".time1
RET_VAL:=MW100
_001: NOP 0
Network2:
CALL "READ_CLK"
RET_VAL:=MW102
CDT :="system-time".time2
NOP 0

因为客户用SFC1读取时钟不是很清楚,还有就是他对时间误差的要求到分就可以,所以推荐一种简单的方法,不知大家之前用过没有,就是使用OB1的临时变量OB1_DATE_TIME(在OB1的Interface – TEMP中可以找到),此变量也是DATE_AND_TIME的数据类型,对应的临时变量地址是LB12 – LB19,同样对应年 – 星期,符合上面表格中的结构,我们只需要使用Move指令就可以得到PLC的系统时间了。

例如我们可以将LD12 Move 到MD0、LD16 Move 到MD4中,然后在程序中寻址MB0 –MB7就可以了。您可以参考下面的程序(可以将程序拷贝到Step7中,然后可以转成梯形图程序)。需要注意,OB1临时变量读出的时间会受OB1扫描周期的影响,例如OB1扫描周期是15ms左右,那么从OB1中读出的时间精度应该就是15ms左右。
OB1:"Main Program Sweep (Cycle)"
Network1:
A(
L LD 12
T MD 0
SET
SAVE
CLR
A BR
)
JNB _002
L LD 16
T MD 4
_002: NOP 0

如果需要设置系统时钟,还需要使用SFC0来实现。
客户使用此种方法很快就解决了问题,当然有简单的方式就是用简单的方式了。我也郁闷,难道真是Step7程序太复杂了,可能吧,哈哈,多学习就会越来越简单,而且会越来越灵活。用户朋友们,让咱们一起努力,让我们的技术越来越好,经验越来越丰富。
来自西门子技术支持热线的故事:如何利用OB1的临时变量读取CPU系统时钟 已锁定
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-300/400

共有54616条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

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

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

  • 分享

  • 只看
    楼主

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