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