记住密码

您所在的位置:首页 > 技术 > 专业论文

基于Siemens S7-300/400 PLC的FIFO功能实现

信息时间:2014-05-04 信息来源:西部工控网

      一、前言

      FIFO功能即FirstInputFirstOutput先进先出,在很多情况下要用到此功能。以前此技术主要在计算机高级语言开发和数据结构设计中应用,但随着PLC技术的日益突飞猛进,需要通过PLC进行数据传送、缓存存储的事件越来越多,尤其是在数据缓存过程中,对FIFO功能使用场合越来越多。西门子S7-300/400PLC是德国西门子公司的中型、大型PLC,也是当今世界上工控行业的主流产品。在SiemensS7系列PLC开发软件SimaticSTEP7工具中,Siemens公司提供了两个专用功能FC84ATT和FC85FIFO,通过这两个FC功能完成对FIFO功能数据的写入和导出,但是每次只能允许一字,也就两字节长的数据。为了实现每次多字节的FIFO功能,需要用户自己开发相应的功能块FB来实现,在本文中就介绍了实现每次20字节FIFO功能FB200功能块的代码,以及实际应用举例。

      二、SiemensFC84ATT和FC85FIFO功能的介绍

      1、FC84ATT

      1.1、FC84ATT功能和构成介绍

      FC84ATT是实现增加数据到FIFO功能的数据存储区中,通过每次执行此指令实现把一字的数据增加到FIFO功能数据存储区中,FIFO功能存储区中以字为单位,具体组成如下:

      l存储区表中第一字为FIFO存储区允许的最大数据存储个数,即最多可以存储多少个字的数据。

      l存储区表中第二字为FIFO存储区当前已经存储数据的个数,即已经存储了多少个字的数据。

      l存储区表中从第三字开始为FIFO存储区实际存储的数据。

      1.2、FC84ATT功能参数说明

      通过SimaticSTEP7进行程序开发时,调用FC84ATT功能,出现如下图:

      从图2-1中可以看到,FC84ATT共有四个参数,分别为EN、DATA、TABLE和ENO,在四门子资料中对其描述如下表2-1:

    参数

    声明

    数据类型

    内存区域

    功能描述

    EN

    输入

    布尔

    I、Q、M、D、L

    使能激活信号

    ENO

    输出

    布尔

    I、Q、M、D、L

    使能输出

    DATA

    输入

    Word

    I、Q、M、D、L、P静态存储区域

    要增加到FIFO的数据

    TABLE

    输入

    指针

    I、Q、M、D、

    FIFO区域指针

      1.3、举例说明

      如果信号M100.0的状态为1(即被激活),FC84ATT功能被执行。在下面的例子中,增加的数据写到FIFO表中的第五行,FIFO的容量也就是FIFO表中第二行由4变为5。如果FC84ATT被执行而且没有错误发生,那么使能输出ENO置为1,具体如下:

      2、FC85FIFO

      2.1、FC85FIFO功能和构成介绍

      FC85FIFO是完成把FIFO表中的数据按照先进先出原则,依次读出,以供使用,与FC84ATT配合使用,完成FIFO的写进与读出功能。通过每次执行此指令实现把一个字的数据从FIFO功能数据存储区中读出,FIFO功能存储区中以字为单位,具体组成如下:

      l存储区表中第一字为FIFO存储区允许的最大数据存储个数,即最多可以存储多少个字的数据。

      l存储区表中第二字为FIFO存储区当前已经存储数据的个数,即已经存储了多少个字的数据。

      l存储区表中从第三字开始为FIFO存储区实际存储的数据,也是FIFO指针所指向的数据。

      2.2、FC85FIFO功能参数说明

      通过SimaticSTEP7进行程序开发时,调用FC85FIFO功能,出现如下图:

      图2-2

      从图2-1中可以看到,FC85FIFO共有四个参数,分别为EN、ENO、TABLE和RET_VAL,在西门子资料中对其描述如下表2-2:

    参数

    声明

    数据类型

    内存区域

    功能描述

    EN

    输入

    布尔

    I、Q、M、D、L

    使能激活信号

    ENO

    输出

    布尔

    I、Q、M、D、L

    使能输出

    TABLE

    输入

    指针

    I、Q、M、D、

    FIFO区域指针

    RET_VAL

    输出

    I、Q、M、D、L、P

    读出的数据

      2.3、举例说明

      如果信号M100.0的状态为1(即被激活),FC85FIFO功能被执行。在下面的例子中,从FIFO存储区域中读出的数据写到RET_VAL指定的地址中,FIFO的容量也就是FIFO表中第二行由5变为4。同时整个FIFO中存储的数据依次向上移动一行。如果FC85FIFO被执行而且没有错误发生,那么使能输出ENO被置为1。

      三、多字节FIFO功能的实现

      1、从前面FC84ATT和FC85FIFO的说明中可以看出,虽然Siemens提供了针对S7

      系列PLC的FIFO功能模块,但是其只能每次写入或读出一个字节的数据,而实际上在很多情况下,每次均是一组数据需要运用FIFO功能来暂时存储起来,那么在这种情形下就不能采用Siemens提供的标准功能FC84和FC85了,需要自己开发一可以实现多字节读出写入功能的FIFO指令。

      2、SiemensSimaticSTEP7介绍

      SiemensSimaticS7300/400系列PLC是Siemens公司主推的中、大型产品,也是当今世界上的主流产品。针对这两个系列PLC开发软件工件为SimaticSTEP7,此软件有多个版本,目前已经发展到V5.4,采用次软件可以实现开发、监控等功能。

      3、多字节FIFO的实现

      打开SimaticSTEP7软件,新建一FB块,如FB200DB200,然后进入FB100

      进行编程,本文中以20字节为例,介绍如何开发实现FIFO功能具体见如下画面:

      图3-1

      源代码如下:

      FUNCTION_BLOCKFB100

      TITLE=

      //此功能块用了完成20字节的FIFO功能

      AUTHOR:Hylotus

      VERSION:0.1

      KNOW_HOW_PROTECT

      VAR_INPUT

      SOURCE_DB:BLOCK_DB;

      INPUT:BOOL;

      OUTPUT:BOOL;

      SIZE:INT;

      END_VAR

      VAR_OUTPUT

      DONE_IN:BOOL;

      DONE_OUT:BOOL;

      ERROR:BOOL;

      FULL:BOOL;

      EMPTY:BOOL;

      END_VAR

      VAR_IN_OUT

      LOCATION:INT;

      END_VAR

      VAR

      IN_START:BOOL;

      IN_ACTIVE:BOOL;

      OUT_START:BOOL;

      OUT_ACTIVE:BOOL;

      COUNT:INT;

      RET_VAL1:INT;

      END_VAR

      BEGIN

      NETWORK

      TITLE=

      A#INPUT;

      AN#IN_ACTIVE;

      =#IN_START;

      A#INPUT;

      =#IN_ACTIVE;

      A#OUTPUT;

      AN#OUT_ACTIVE;

      =#OUT_START;

      A#OUTPUT;

      =#OUT_ACTIVE;

      AN#INPUT;

      AN#OUTPUT;

      JCEND1;

      NETWORK

      TITLE=OUTPUTFIFO

      //20字节的数据从FIFO存储区域中读出

      AN#OUTPUT;

      O#DONE_OUT;

      JCIN_1;

      AN#OUT_START;

      JCOP_1;

      OPN#SOURCE_DB;

      LDW#16#0;

      TDBD40;

      TDBD44;

      TDBD48;

      TDBD52;

      TDBD56;

      TDBD60;

      TDBD64;

      TDBD68;

      TDBD72;

      TDBD76;

      L#LOCATION;

      L0;

      <=I;

      S#EMPTY;

      JCEROR;

      OPN#SOURCE_DB;

      CALL"BLKMOV"(

      SRCBLK:=P#DBX80.0BYTE40,

      RET_VAL:=#RET_VAL1,

      DSTBLK:=P#DBX40.0BYTE40);

      L#RET_VAL1;

      L0;

      <>I;

      JCEROR;

      L0;

      T#COUNT;

      OP_1:L#LOCATION;

      L0;

      <=I;

      JCEROR;

      L#LOCATION;

      L#COUNT;

      <=I;

      JCOP_3;

      L#COUNT;

      L2;

      +I;

      ITD;

      LP#40.0;

      *D;

      LAR1;

      OPN#SOURCE_DB;

      LDBD[AR1,P#40.0];

      TDBD[AR1,P#0.0];

      LDBD[AR1,P#44.0];

      TDBD[AR1,P#4.0];

      LDBD[AR1,P#48.0];

      TDBD[AR1,P#8.0];

      LDBD[AR1,P#52.0];

      TDBD[AR1,P#12.0];

      LDBD[AR1,P#56.0];

      TDBD[AR1,P#16.0];

      LDBD[AR1,P#60.0];

      TDBD[AR1,P#20.0];

      LDBD[AR1,P#64.0];

      TDBD[AR1,P#24.0];

      LDBD[AR1,P#68.0];

      TDBD[AR1,P#28.0];

      LDBD[AR1,P#72.0];

      TDBD[AR1,P#32.0];

      LDBD[AR1,P#76.0];

      TDBD[AR1,P#36.0];

      L#COUNT;

      L1;

      +I;

      T#COUNT;

      L#SIZE;

      L-1;

      +I;

      L#COUNT;

      <=I;

      JCOP_2;

      JUEND2;

      OP_2:LW#16#0;

      TDBD[AR1,P#40.0];

      TDBD[AR1,P#44.0];

      TDBD[AR1,P#48.0];

      TDBD[AR1,P#52.0];

      TDBD[AR1,P#56.0];

      TDBD[AR1,P#60.0];

      TDBD[AR1,P#64.0];

      TDBD[AR1,P#68.0];

      TDBD[AR1,P#72.0];

      TDBD[AR1,P#76.0];

      OP_3:SET;

      S#DONE_OUT;

      L#LOCATION;

      L-1;

      +I;

      T#LOCATION;

      JUEND2;

      NETWORK

      TITLE=INPUTFIFO

      //20字节的数据写入FIFO存储区表中

      IN_1:AN#IN_START;

      JCEND2;

      L#LOCATION;

      L#SIZE;

      >=I;

      S#FULL;

      JCEROR;

      L#LOCATION;

      L2;

      +I;

      ITD;

      LP#40.0;

      *D;

      LAR1;

      OPN#SOURCE_DB;

      LDBD0;

      TDBD[AR1,P#0.0];

      LDBD4;

      TDBD[AR1,P#4.0];

      LDBD8;

      TDBD[AR1,P#8.0];

      LDBD12;

      TDBD[AR1,P#12.0];

      LDBD16;

      TDBD[AR1,P#16.0];

      LDBD20;

      TDBD[AR1,P#20.0];

      LDBD24;

      TDBD[AR1,P#24.0];

      LDBD28;

      TDBD[AR1,P#28.0];

      LDBD32;

      TDBD[AR1,P#32.0];

      LDBD36;

      TDBD[AR1,P#36.0];

      L#LOCATION;

      L1;

      +I;

      T#LOCATION;

      SET;

      S#DONE_IN;

      JUEND2;

      NETWORK

      TITLE=

      EROR:SET;

      =#ERROR;

      JUEND2;

      END1:CLR;

      =#DONE_IN;

      =#DONE_OUT;

      =#ERROR;

      =#EMPTY;

      =#FULL;

      END2:NOP0;

      END_FUNCTION_BLOCK

      4、在程序中的调用

      上面已经完成了FB100FIFO功能块的编程开发,下面就是直接调用,设置

      相关参数就可以使用此功能了,举例如下:

      新建FIFO数据源数据库DB200,结构为

    Address

    Name

    Type

    Initial value

    Comment

    0.0

     

    STRUCT

     

     

    +0.0

    IN_Buffer

    STRUCT

     

     

    +0.0

    Status_Word

    INT

    0

     

    +2.0

    Data1

    INT

    0

     

    +4.0

    Data2

    INT

    0

     

    +6.0

    Data3

    INT

    0

     

    +8.0

    Data4

    INT

    0

     

    +10.0

    Data5

    INT

    0

     

    +12.0

    Data6

    INT

    0

     

    +14.0

    Data7

    INT

    0

     

    +16.0

    Data8

    INT

    0

     

    +18.0

    Data9

    INT

    0

     

    =20.0

     

    END_STRUCT

    0

     

    +0.0

    Status_Word

    INT

     

     

    +2.0

    Data1

    INT

     

     

    +4.0

    Data2

    INT

     

     

    +6.0

    Data3

    INT

     

     

    +8.0

    Data4

    INT

     

     

    +10.0

    Data5

    INT

     

     

    +12.0

    Data6

    INT

     

     

    +14.0

    Data7

    INT

     

     

    +16.0

    Data8

    INT

     

     

    +18.0

    Data9

    INT

     

     

    =20.0

     

    END_STRUCT

     

     

    +40

    Data

    Array[0..20]

     

     

    *0.0

     

    STRUCT

     

     

    +0.0

    Status_Word

    INT

    0

     

    +2.0

    Data1

    INT

    0

     

    +4.0

    Data2

    INT

    0

     

    +6.0

    Data3

    INT

    0

     

    +8.0

    Data4

    INT

    0

     

    +10.0

    Data5

    INT

    0

     

    +12.0

    Data6

    INT

    0

     

    +14.0

    Data7

    INT

    0

     

    +16.0

    Data8

    INT

    0

     

    +18.0

    Data9

    INT

    0

     

    =20.0

     

    END_STRUCT

    0

     

    =440

     

    END_STRUCT

     

     

      5、以上FIFO程序调用功能块和程序,均是可以通过Siemens公司提供的模拟运行软件SiamticSimulation进行模拟PLC确认,可以正常运行没有问题。

      四、总结

      通过自己开发弥补西门子厂家提供的专用功能模块的不足,能更大限度的发挥西门子公司产品的软件开发优势。

     

     

     

Copyright2006 www.xbgk.com Corporation,All Rights Reserved 客服电话:029-84589271 13379230080 备案号:陕ICP备05014423号
关注我们,随时随地获得最新资讯