基于Siemens S7-300/400 PLC的FIFO功能實現
一、前言
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 |
|
文章版權歸西部工控xbgk所有,未經許可不得轉載。 你可能感興趣的文章 研討培訓更多>技術視頻更多>熱門下載更多>
|