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

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