亚洲www免费,久久se精品一区二区,国产一区二区三区不卡av,91免费精品国自产拍在线不卡

技術頻道

基于Siemens S7-300/400 PLC的FIFO功能實現(xiàn)

  一、前言

  FIFO功能即FirstInputFirstOutput先進先出,在很多情況下要用到此功能。以前此技術主要在計算機高級語言開發(fā)和數(shù)據(jù)結構設計中應用,但隨著PLC技術的日益突飛猛進,需要通過PLC進行數(shù)據(jù)傳送、緩存存儲的事件越來越多,尤其是在數(shù)據(jù)緩存過程中,對FIFO功能使用場合越來越多。西門子S7-300/400PLC是德國西門子公司的中型、大型PLC,也是當今世界上工控行業(yè)的主流產品。在SiemensS7系列PLC開發(fā)軟件SimaticSTEP7工具中,Siemens公司提供了兩個專用功能FC84ATT和FC85FIFO,通過這兩個FC功能完成對FIFO功能數(shù)據(jù)的寫入和導出,但是每次只能允許一字,也就兩字節(jié)長的數(shù)據(jù)。為了實現(xiàn)每次多字節(jié)的FIFO功能,需要用戶自己開發(fā)相應的功能塊FB來實現(xiàn),在本文中就介紹了實現(xiàn)每次20字節(jié)FIFO功能FB200功能塊的代碼,以及實際應用舉例。

  二、SiemensFC84ATT和FC85FIFO功能的介紹

  1、FC84ATT

  1.1、FC84ATT功能和構成介紹

  FC84ATT是實現(xiàn)增加數(shù)據(jù)到FIFO功能的數(shù)據(jù)存儲區(qū)中,通過每次執(zhí)行此指令實現(xiàn)把一字的數(shù)據(jù)增加到FIFO功能數(shù)據(jù)存儲區(qū)中,F(xiàn)IFO功能存儲區(qū)中以字為單位,具體組成如下:

  l存儲區(qū)表中第一字為FIFO存儲區(qū)允許的最大數(shù)據(jù)存儲個數(shù),即最多可以存儲多少個字的數(shù)據(jù)。

  l存儲區(qū)表中第二字為FIFO存儲區(qū)當前已經存儲數(shù)據(jù)的個數(shù),即已經存儲了多少個字的數(shù)據(jù)。

  l存儲區(qū)表中從第三字開始為FIFO存儲區(qū)實際存儲的數(shù)據(jù)。

  1.2、FC84ATT功能參數(shù)說明

  通過SimaticSTEP7進行程序開發(fā)時,調用FC84ATT功能,出現(xiàn)如下圖:

  從圖2-1中可以看到,F(xiàn)C84ATT共有四個參數(shù),分別為EN、DATA、TABLE和ENO,在四門子資料中對其描述如下表2-1:

參數(shù)

聲明

數(shù)據(jù)類型

內存區(qū)域

功能描述

EN

輸入

布爾

I、Q、M、D、L

使能激活信號

ENO

輸出

布爾

I、Q、M、D、L

使能輸出

DATA

輸入

Word

I、Q、M、D、L、P靜態(tài)存儲區(qū)域

要增加到FIFO的數(shù)據(jù)

TABLE

輸入

指針

I、Q、M、D、

FIFO區(qū)域指針

  1.3、舉例說明

  如果信號M100.0的狀態(tài)為1(即被激活),F(xiàn)C84ATT功能被執(zhí)行。在下面的例子中,增加的數(shù)據(jù)寫到FIFO表中的第五行,F(xiàn)IFO的容量也就是FIFO表中第二行由4變?yōu)?。如果FC84ATT被執(zhí)行而且沒有錯誤發(fā)生,那么使能輸出ENO置為1,具體如下:

  2、FC85FIFO

  2.1、FC85FIFO功能和構成介紹

  FC85FIFO是完成把FIFO表中的數(shù)據(jù)按照先進先出原則,依次讀出,以供使用,與FC84ATT配合使用,完成FIFO的寫進與讀出功能。通過每次執(zhí)行此指令實現(xiàn)把一個字的數(shù)據(jù)從FIFO功能數(shù)據(jù)存儲區(qū)中讀出,F(xiàn)IFO功能存儲區(qū)中以字為單位,具體組成如下:

  l存儲區(qū)表中第一字為FIFO存儲區(qū)允許的最大數(shù)據(jù)存儲個數(shù),即最多可以存儲多少個字的數(shù)據(jù)。

  l存儲區(qū)表中第二字為FIFO存儲區(qū)當前已經存儲數(shù)據(jù)的個數(shù),即已經存儲了多少個字的數(shù)據(jù)。

  l存儲區(qū)表中從第三字開始為FIFO存儲區(qū)實際存儲的數(shù)據(jù),也是FIFO指針所指向的數(shù)據(jù)。

  2.2、FC85FIFO功能參數(shù)說明

  通過SimaticSTEP7進行程序開發(fā)時,調用FC85FIFO功能,出現(xiàn)如下圖:

  圖2-2

  從圖2-1中可以看到,F(xiàn)C85FIFO共有四個參數(shù),分別為EN、ENO、TABLE和RET_VAL,在西門子資料中對其描述如下表2-2:

參數(shù)

聲明

數(shù)據(jù)類型

內存區(qū)域

功能描述

EN

輸入

布爾

I、Q、M、D、L

使能激活信號

ENO

輸出

布爾

I、Q、M、D、L

使能輸出

TABLE

輸入

指針

I、Q、M、D、

FIFO區(qū)域指針

RET_VAL

輸出

I、Q、M、D、L、P

讀出的數(shù)據(jù)

  2.3、舉例說明

  如果信號M100.0的狀態(tài)為1(即被激活),F(xiàn)C85FIFO功能被執(zhí)行。在下面的例子中,從FIFO存儲區(qū)域中讀出的數(shù)據(jù)寫到RET_VAL指定的地址中,F(xiàn)IFO的容量也就是FIFO表中第二行由5變?yōu)?。同時整個FIFO中存儲的數(shù)據(jù)依次向上移動一行。如果FC85FIFO被執(zhí)行而且沒有錯誤發(fā)生,那么使能輸出ENO被置為1。

  三、多字節(jié)FIFO功能的實現(xiàn)

  1、從前面FC84ATT和FC85FIFO的說明中可以看出,雖然Siemens提供了針對S7

  系列PLC的FIFO功能模塊,但是其只能每次寫入或讀出一個字節(jié)的數(shù)據(jù),而實際上在很多情況下,每次均是一組數(shù)據(jù)需要運用FIFO功能來暫時存儲起來,那么在這種情形下就不能采用Siemens提供的標準功能FC84和FC85了,需要自己開發(fā)一可以實現(xiàn)多字節(jié)讀出寫入功能的FIFO指令。

  2、SiemensSimaticSTEP7介紹

  SiemensSimaticS7300/400系列PLC是Siemens公司主推的中、大型產品,也是當今世界上的主流產品。針對這兩個系列PLC開發(fā)軟件工件為SimaticSTEP7,此軟件有多個版本,目前已經發(fā)展到V5.4,采用次軟件可以實現(xiàn)開發(fā)、監(jiān)控等功能。

  3、多字節(jié)FIFO的實現(xiàn)

  打開SimaticSTEP7軟件,新建一FB塊,如FB200DB200,然后進入FB100

  進行編程,本文中以20字節(jié)為例,介紹如何開發(fā)實現(xiàn)FIFO功能具體見如下畫面:

  圖3-1

  源代碼如下:

  FUNCTION_BLOCKFB100

  TITLE=

  //此功能塊用了完成20字節(jié)的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字節(jié)的數(shù)據(jù)從FIFO存儲區(qū)域中讀出

  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字節(jié)的數(shù)據(jù)寫入FIFO存儲區(qū)表中

  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功能塊的編程開發(fā),下面就是直接調用,設置

  相關參數(shù)就可以使用此功能了,舉例如下:

  新建FIFO數(shù)據(jù)源數(shù)據(jù)庫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所有,未經許可不得轉載。

      主站蜘蛛池模板: 永宁县| 阜南县| 浦城县| 航空| 孟津县| 额尔古纳市| 普格县| 红原县| 盐池县| 时尚| 江阴市| 巩留县| 长治市| 沂源县| 岫岩| 涞源县| 会理县| 阜平县| 苗栗市| 平顶山市| 军事| 平舆县| 宕昌县| 错那县| 类乌齐县| 襄城县| 乌兰察布市| 香格里拉县| 通州市| 肃宁县| 恩施市| 阿拉善右旗| 奉化市| 平罗县| 绥江县| 景洪市| 天气| 五原县| 蚌埠市| 西平县| 绥中县|