西門子PLC在用戶程序中使用的堆棧有哪幾種
發(fā)布于2022-11-16 15:41
34
2
標簽:堆棧
堆棧(見圖4-4)是CPU中的一塊特殊的存儲區(qū),它采用“先入后出”的規(guī)則存入和取出數(shù)據(jù)。堆棧最上面的存儲單元稱為棧頂,要保存的數(shù)據(jù)從棧頂“壓入”堆棧時,堆棧中原有的數(shù)據(jù)依次向下移動一層,最下面的存儲單元的數(shù)據(jù)丟失。在取出棧頂?shù)臄?shù)據(jù)后,堆棧中所有的數(shù)據(jù)依次向上移動一層。堆棧的這種“先人后出”的存取順序,剛好滿足塊調(diào)用時(包括中斷處理的塊調(diào)用)存儲和取出數(shù)據(jù)的要求,因此堆棧在計算機的程序設(shè)計中得到了廣泛的應(yīng)用。下面介紹STEP7中3種不同的堆棧。
1.局部數(shù)據(jù)堆棧(L堆棧)
各邏輯塊都有它的局部變量(L)存儲區(qū),局部變量在邏輯塊的變量聲明表中生成,只在它被創(chuàng)建的塊中有效。每個組織塊用20B的臨時局部數(shù)據(jù)來存儲它的啟動信息。局部數(shù)據(jù)可以按位、字節(jié)、字和雙字來存取,例如L0.0、LB9、LW4和LD52。
CPU分配給當(dāng)前正在處理的塊的臨時局部數(shù)據(jù)的存儲器容量是有限的,這一存儲區(qū)(即局部堆棧)的大小與CPU的型號有關(guān)。CPU給每一優(yōu)先級分配了局部數(shù)據(jù)區(qū),這樣可以保證不同優(yōu)先級的OB都有它們可以使用的局部數(shù)據(jù)空間。
通過在STEP7中設(shè)置參數(shù),可以給S7-400CPU的每一優(yōu)先級指定不同大小的局部數(shù)據(jù)區(qū)。S7-300 CPU每一優(yōu)先級的局部數(shù)據(jù)區(qū)的大小是固定的。
2. 塊堆棧(B 堆棧)
如果一個塊的處理因為調(diào)用另外一個塊,或者被更高優(yōu)先級的OB塊中止,CPU將在塊堆棧中存儲以下信息
1)被中斷的塊的類型(OB、FB、FC、SFB、SFC)、編號和返回地址。
2)從DB和DI寄存器中獲得的塊被中斷時打開的共享數(shù)據(jù)塊和背景數(shù)據(jù)塊的編號。3)局部數(shù)據(jù)堆棧的指針。
利用這些數(shù)據(jù),可以在中斷它的任務(wù)處理完后恢復(fù)被中斷的塊的處理。在多重調(diào)用時,堆棧可以保存參與嵌套調(diào)用的幾個塊的信息。圖4-5中的OB1調(diào)用功能FC2,F(xiàn)C2的執(zhí)行被電源故障組織塊OB81中斷,圖中給出了塊堆棧中的數(shù)據(jù)動態(tài)變化的情況。
CPU處于STOP模式時,可以在CPU的模塊信息對話框中,查看塊堆棧保存的進入STOP模式時沒有處理完的塊,在塊堆棧中,信息按照它們被處理的順序存儲(見圖4-5)。
每個中斷優(yōu)先級對應(yīng)的塊堆??梢詢Υ娴臄?shù)據(jù)的字節(jié)數(shù)與CPU的型號有關(guān)。

3.中斷堆棧(1堆棧)
如果程序的執(zhí)行被優(yōu)先級更高的OB中斷,操作系統(tǒng)將保存下述寄存器的內(nèi)容當(dāng)前的累加器和地址寄存器的內(nèi)容、數(shù)據(jù)塊寄存器中DB和DI的內(nèi)容、局部數(shù)據(jù)的指針、狀態(tài)字、MCR(主控繼電器)寄存器和塊堆棧的指針。新的OB執(zhí)行完后,操作系統(tǒng)讀取中斷堆棧中的信息,從被中斷的塊被中斷的地方開始繼續(xù)執(zhí)行程序。