一、前言
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确认,可以正常运行没有问题。
四、总结
通过自己开发弥补西门子厂家提供的专用功能模块的不足,能更大限度的发挥西门子公司产品的软件开发优势。