一、CPU寄存器
CPU的寄存器用于尋址或處理數據。在相關(guān)命令(L, T,...)的配合下,可以在CPU存儲器區和寄存器之間進(jìn)行數據交換。
1)累加器: S7-300CPU有2個(gè)累加器,S7-400CPU有4個(gè)累加器,用于算術(shù)、比較指令或者用于其他字節、字及雙字指令。
2)地址寄存器:要S7-300/400有2個(gè)地址寄存器作為指針用于寄存器間接尋址。
3)數據塊寄存器:有2個(gè),數據塊寄存器里包含打開(kāi)的(活動(dòng)的)數據塊的號碼。因此可能有2個(gè)DB同時(shí)打開(kāi),其中一個(gè)DB使用DB 寄存器,另一個(gè)作為背景DB 使用DI寄存器。打開(kāi)DB時(shí),其長(cháng)度自動(dòng)裝載到相應的DB長(cháng)度寄存器中。
4)狀態(tài)字:狀態(tài)字包含各個(gè)不同的狀態(tài)位,這些狀態(tài)位反應程序執行過(guò)程中各個(gè)指令的執行結果或狀態(tài)。
二、存儲器區域
S7-300/400CPU 存儲器可以分為4個(gè)區域:
1)裝載存儲器用于存儲用戶(hù)程序,不包括符號地址賦值或注釋。裝載存儲器可以是RAM或者是FLASH EPROM存儲器。
2)工作存儲器用于存儲與執行程序相關(guān)的那部分S7程序。程序只能在工作存儲區內執行。
3)I/O存儲區允許對所連接信號模塊的輸入和輸出進(jìn)行直接存取。
4)系統存儲區(RAM)包括過(guò)程映像輸入和輸出表、位存儲器、定時(shí)器和計數器等區域,此外還包括局部數據堆棧、塊堆棧和中斷堆棧。
三、狀態(tài)字
狀態(tài)字各位給出了有關(guān)指令狀態(tài)或結果的信息以及所出現的錯誤?梢杂枚M(jìn)制邏輯操作將狀態(tài)位信號狀態(tài)直接集成到程序中,以控制程序執行的流程。
1)首次檢查位:狀態(tài)字的0位稱(chēng)作首次檢查位,如果/FC 位的信號狀態(tài)為“0”,則表示伴隨著(zhù)下一條邏輯指令,程序中將開(kāi)始一個(gè)新的邏輯串。FC前面的斜杠表示對FC取反。
2)邏輯運算結果:狀態(tài)字的第1位為RLO 位(RLO= “邏輯運算結果”),在二進(jìn)制邏輯運算中用作暫時(shí)存儲位。比如,一串邏輯指令中的某個(gè)指令檢查觸點(diǎn)的信號狀態(tài),并根據布爾邏輯運算規則將檢查的結果(狀態(tài) 位)與RLO位進(jìn)行邏輯門(mén)運算,然后邏輯運算結果又存在RLO位中。
3)狀態(tài)位:狀態(tài)位(第2位)用以保存被尋址位的值。狀態(tài)位總是向掃描指令(A,AN,O,…)或寫(xiě)指令(=,S,R,)顯示尋址位的狀態(tài)(對于寫(xiě)指令,保存的尋址位狀態(tài)是本條寫(xiě)指令執行后的該尋址位的狀態(tài))。
4)OR位:在用指令OR執行或邏輯操作之前,執行與邏輯操作的時(shí)候,就需要用到OR這一狀態(tài)位。OR位表示先前執行的與邏輯操作產(chǎn)生的值為“1”,于是, 邏輯操作或的執行結果就已被確定為“1”。
5)OV位:溢出表示算術(shù)或比較指令執行時(shí)出現了錯誤。根據所執行的算術(shù)或邏輯指令結果對該位進(jìn)行設置。
6)OS位:溢出存儲位是與OV位一起被置位的,而且在更新算術(shù)指令之后,它能夠保持這種狀態(tài),也就是說(shuō),它的狀態(tài)不會(huì )由于下一個(gè)算術(shù)指令的結果而改變。 這樣,即使是在程序的后面部分,也還有機會(huì )判斷數字區域是否溢出或者指令是否含有無(wú)效實(shí)數。OS位只有通過(guò)如下這些命令進(jìn)行復位:JOS(若OS = 1,則跳轉)命令,塊調用和塊結束命令。
7)CC1及CC0位:CC1和CC0(條件代碼)位給出有關(guān)下列結果的相關(guān)信息:
? 算術(shù)指令結果
? 或者,比較指令結果
? 字邏輯指令,或
? 在移位功能中,移出位相關(guān)信息。
可以用以下指令來(lái)檢查條件代碼CC1和CC0。
CC1 CC0 檢查完成后,如果:
0 0 A == 0 結果 = 0 (ACCU2 = ACCU1)
1 0 A > 0 結果 > 0 (ACCU2 > ACCU1)
0 1 A monitor功能激活的時(shí)候,BR位的值也會(huì )影響LAD/STL/FBD 編輯器中處理的塊的顯示。 BR位設置為“1”的調用塊,表明了狀態(tài)完成,否則即表明狀態(tài)未完成。
四、狀態(tài)指令
1)跳轉功能 使用跳轉功能,可以中斷程序線(xiàn)性處理過(guò)程而轉向塊的另一個(gè)位置接著(zhù)執行。程序分支的執行可能無(wú)關(guān)任何條件,或者僅當滿(mǎn)足特定條件后才執行。
2)無(wú)條件跳轉 JU 跳轉功能總是執行的,也就是說(shuō),它的執行不依賴(lài)于任何條件。JU跳轉功能可以中斷程序的線(xiàn)性處理過(guò)程而轉向跳轉標號處執行程序。JU 跳轉功能不論是在跳轉處,還是在目的標號處都不影響狀態(tài)位。
3)帶有RLO和BR 依據RLO位和BR位的狀態(tài),程序可實(shí)現分支執行。而且,能夠在RLO位檢查的跳轉功能,同時(shí)將其保存到BR位中去。
根據RLO位狀態(tài)而跳轉的功能(JC, JCN)指令,無(wú)論條件滿(mǎn)足與否,都將狀態(tài)位STA和RLO設置為“1”,將OR和/FC位設置為“0”。
具有RLO位狀態(tài)保存能力的跳轉功能指令(JCB, JNB)將RLO位的狀態(tài)保存到BR位中。其余的狀態(tài)位:STA、RLO、R和/FC位的處理方式與那些不保存RLO狀態(tài)的跳轉功能相同。
取決于BR位狀態(tài)的跳轉功能指令(JBI, JNBI),不論條件滿(mǎn)足與否,都將把狀態(tài)位STA設置為“1”,將OR位和/FC位設置為“0”。而RLO位和BR位的狀態(tài)則保持不變。
4)取決于OV和OS位, 如果有溢出發(fā)生,則執行跳轉指令JO和JOS。在需要執行多個(gè)連續指令的串運算的跳轉功能 中,每次算術(shù)計算功能執行完畢后,就必須要對OV 的狀態(tài)進(jìn)行評估。如果算術(shù)指令執行后,其結果在所允許的數值范圍之內,而且之前產(chǎn)生的是一個(gè)溢出,則將OV 位復位。為了在串計算結束后檢測可能出現的數值范圍溢出,就必須要檢查OS位的狀態(tài)。OS位只能由塊調用和塊結束指令或者跳轉指令JOS進(jìn)行復位。 跳轉功能指令JO和JOS不會(huì )改變狀態(tài)字其余各位的狀態(tài)值。
5)根據CC0和CC1位: 根據狀態(tài)位CC0和CC1的狀態(tài),可以執行某一程序功能。據此,您可以檢查計算狀態(tài)而跳轉的功能 ,結果是正值、零、或者負值?
根據狀態(tài)位C0和CC1的狀態(tài)而跳轉的跳轉功能指令不改變任何狀態(tài)位的狀態(tài),而且邏輯操作結果RLO值也會(huì )“隨著(zhù)”該跳轉功能帶到跳轉程序段中,供用戶(hù)程序其它邏輯操作之用(不改變/FC狀態(tài))。
示例 兩個(gè)整數相減并需進(jìn)行連續判斷:
L MW2
L MW8
-I
JZ ZERO // 如果結果等于“0”,則跳轉至標號ZERO處
// 結果不等于“0”時(shí)所執行的指令
ZERO: . // 結果等于“0”時(shí),所要執行的指令
6)跳轉分配器 JL指令的跳轉分配器允許根據跳轉分支號,使程序跳轉到塊內跳轉目標程序段。JL指令是與JU跳轉功能表一起配合工作的。
該JU功能列表緊接在JL指令之后,它可以含有最大256個(gè)跳轉入口。JL指令所帶的標號指向JU功能列表的末端,也即,指向列表后面的第一條指令。
在JL 和 :之間,只能是跳轉指令JU。如果“0”位于寄存器ACCU1-L-L中,那么就執行第一個(gè)跳轉指令,如果“1”位于寄存器ACCU1-L-L,那么就執行第二個(gè)跳轉指令,等等,依此類(lèi)推。如果其中的數字大于列表長(cháng)度,則JC分支跳轉到列表末端。
JL指令的執行不依賴(lài)于任何條件,而且不會(huì )改變狀態(tài)位值。
7)Loop 指令 循環(huán)指令LOOP簡(jiǎn)化了循環(huán)程序的編程。
要編寫(xiě)一個(gè)循環(huán)指令程序,需將期望執行的循環(huán)掃描數裝入寄存器ACCU1-L中。 LOOP 指令就會(huì )把累加器ACCU1右邊的字看成是一個(gè)16位無(wú)符號數,范圍是0-65535。
LOOP 指令每執行一次,ACCU1-L中的值就減1,接著(zhù)將該值與0進(jìn)行比較。如果比較結果不等于0,程序就會(huì )跳轉到LOOP指令中所指定的標號處;如果比較結果等于0,程序不發(fā)生跳轉,而是執行緊接下來(lái)的一條指令。
8)BE BE指令用來(lái)結束當前程序塊中的程序執行,BE始終是塊中的最后一條指令。 當保存塊時(shí),該指令由PG自動(dòng)產(chǎn)生,因而不必單獨輸入,此BE指令是不可見(jiàn)的。 操作系統將程序返回到主調塊,并從程序調用操作后面的第一條指令開(kāi)始接著(zhù)執行程序。當前保存的局部數據區重新激活。
9)BEU BEU 指令象BE指令一樣,用來(lái)結束當前程序塊中的程序執行。與BE指令不同的是,可在塊內重復編程BEU。緊接著(zhù)BEU指令后面的程序段,只有在使用跳轉功能指向它的時(shí)候才得以執行。
10)BEC BEC指令根據RLO位的值來(lái)結束塊。如果RLO = 1,則結束當前塊的程序執行,并且從程序調用語(yǔ)句后面的第一條指令開(kāi)始接著(zhù)執行程序。如果RLO=0,則不執行BEC指令。這時(shí),CPU將RLO位設置為“1”,執行BEC后面的指令。