技术论坛

 分享别人做的如何用SFC0和SFC1来设置和读取时钟

返回主题列表
作者 主题
liuliusheng
至圣

经验值: 26219
发帖数: 5838
精华帖: 5
楼主    2015-12-30 09:48:40
主题:分享别人做的如何用SFC0和SFC1来设置和读取时钟

如何用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



如果对时间误差的要求到分就可以,所以推荐一种简单的方法,不知大家之前用过没有,就是使用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来实现。


 

西门子官网有一篇《如何用 SFC1 (READ_CLK)读取时间和日期以及如何用 SFC0 (SET_CLK) 设定系统时间》详细说明了如何利用SFC1和SFC0读取和设置PLC的系统时间。

 

这个程序是利用系统功能块读出系统的日期和时间信息(Date and time格式,占用8个字节),然后通过将每个字节分解后得到年、月、日、时、分、秒、毫秒、周的具体值。因为毫秒实际使用了12位,周使用了4位,所以毫秒和周的数据一起使用了两个字节,在程序中用字与的办法将其分解出来。整个程序如下:

 

      CALL  "READ_CLK"                  //调用系统功能块SFC1

       RET_VAL:=MW10

       CDT    :=#Date_time

 

 

      LAR1  P##Date_time                //利用SFC1读出的日期时间值

      L     B [AR1,P#0.0]

      T     #Year                       //年

      L     B [AR1,P#1.0]

      T     #Month                      //月

      L     B [AR1,P#2.0]

      T     #Day                        //日

      L     B [AR1,P#3.0]

      T     #Hour                       //时

      L     B [AR1,P#4.0]

      T     #Minutes                    //分

      L     B [AR1,P#5.0]

      T     #Second                     //秒

 

      L     W#16#FFF0

      L     W [AR1,P#6.0]

      AW                                //毫秒

      T     #Millisecond

 

      L     B#16#F

      L     B [AR1,P#7.0]

      AW                                //周

      T     #Week

 

      CLR  

 

 

对于时间设置的程序,是将读取时间的步骤反过来,先将数据整合到一个Date_and_time格式的存储器,再用SFC0将这个数值设置为当前时间。

 

程序如下:

 

      LAR1  P##Date_time

      L     #Year

      T     B [AR1,P#0.0]

      L     #Month

      T     B [AR1,P#1.0]

      L     #Day

      T     B [AR1,P#2.0]

      L     #Hour

      T     B [AR1,P#3.0]

      L     #Minutes

      T     B [AR1,P#4.0]

      L     #Second

      T     B [AR1,P#5.0]

 

      L     #Week

      T     B [AR1,P#7.0]

 

 

      CALL  "SET_CLK"

       PDT    :=#Date_time

       RET_VAL:=MW20

-------------------------------------------------

 

实际上,对于读取时间,我们可以直接用程序库中的FC6、FC7、FC8分别将日期、周、时间读出来,这样程序编写只需要指定一些存储区域即可,而且得到的是年月日的组合、时分秒毫秒的组合,程序如下:

 

      CALL  "DT_DATE"

       IN     :=#Date_time

       RET_VAL:=#Date_FC

 

 

      CALL  "DT_DAY"

       IN     :=#Date_time

       RET_VAL:=#Week_FC

 

 

      CALL  "DT_TOD"

       IN     :=#Date_time

       RET_VAL:=#Time_FC

 

 

相应的,设置系统时间也可以直接利用FC3将指定的日期和时间组合起来,然后调用SFC0写入到系统中。程序如下:

 

      CALL  FC     3

       IN1    :=#Set_date

       IN2    :=#Set_time

       RET_VAL:=#Date_time

      CALL  SFC    0

       PDT    :=#Date_time

       RET_VAL:=MW30

------------------------------------------------------

 

本附件中是利用这两个办法写的系统时间读取和设置的程序,实际应用中选择其中一种即可:Step7time

 

本附件中是西门子官网的 如何用 SFC1 (READ_CLK)读取时间和日期以及如何用 SFC0 (SET_CLK) 设定系统时间

 

 

本文来自: 高校自动化网(Www.zdh1909.com) 详细出处参考(转载请保留本链接):http://www.zdh1909.com/html/PLC/9690.html

109 97


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