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