技術頻道

      基于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,結構為

      <strike id="ocysu"></strike>
    1. <dl id="ocysu"></dl>
      • 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所有,未經許可不得轉載。

        主站蜘蛛池模板: 一区二区三区久久精品| 国产一区二区视频免费| 国产精品乱码一区二区三| 中文字幕精品一区| 亚洲一区二区观看播放| 黑巨人与欧美精品一区| 影院成人区精品一区二区婷婷丽春院影视 | 中文字幕在线看视频一区二区三区| 中文字幕aⅴ人妻一区二区| 无码人妻视频一区二区三区| 中文字幕一区日韩精品| 精品一区二区三区电影| 久久青草国产精品一区| 国产微拍精品一区二区| 丰满爆乳一区二区三区| 日韩免费一区二区三区在线播放 | 日本强伦姧人妻一区二区| 国产亚洲一区二区精品| 亚洲熟女综合一区二区三区| 久久se精品一区精品二区国产 | 一区二区传媒有限公司| 国产韩国精品一区二区三区| 97精品国产一区二区三区| 亚洲爽爽一区二区三区| 精品久久久久久无码中文字幕一区| AV天堂午夜精品一区| 国产主播福利一区二区| 日韩精品无码一区二区视频| 欧美日韩精品一区二区在线视频| 伊人久久精品无码av一区| 在线免费观看一区二区三区| 无码少妇一区二区三区浪潮AV| 国产精品一区二区久久沈樵| 蜜臀Av午夜一区二区三区| 国产精品小黄鸭一区二区三区| 成人精品一区二区不卡视频| 色欲综合一区二区三区| 国产亚洲一区区二区在线| 国产无人区一区二区三区| 影音先锋中文无码一区| 国产AV午夜精品一区二区三|
          • <abbr id="ocysu"></abbr>