1. INV_I指令
INV_I(對整數求反碼)在ACCU 1-L中形成16位數值的二進製反碼。二進製反碼是通過將各個位的值取反形成的,即用“0”替換“1”,用“1”替換“0”,結果存儲在累加器1的低字中。
如果I0.0為“1”,則將MW8的每一位都取反。例如:MW8=01000001 10000001,則取反結果為MW10=10111110 01111110。如果未執行轉換(ENO=EN=0),則輸出Q4.0的狀態為“1”。
2. INV_DI指令
INV_DI (對長整數求反碼)在ACCU1中形成32位數值的二進製反碼。二進製反碼是通過將各個位的值取反形成的,即用“0”替換“1”,用“1”替換“0”,結果存儲在累加器1中。
3. NEG_I指令
NEG_I(對整數求補碼)在ACCU 1-L中形成16位數值的二進製補碼。二進製補碼是通過將各個位取反(即用“0”替換“1”,用“1”替換“0”)後加“1”形成的,結果存儲在累加器1的低字中。二進製補碼相當於原碼乘以“-1”。
狀態位CC1、CC0、OS和OV則根據函數運算的結果來設置。
4. NEG_DI指令
NEG_DI (對長整數求補碼)在ACCU 1中形成32位數值的二進製補碼。二進製補碼是通過將各個位取反(即用“0”替換“1”,用“1”替換“0”)後加“1”形成的,結果存儲在累加器1中。二進製補碼指令相當於原碼乘以“-1”。執行該指令時不涉及RLO,也不影響RLO。
狀態位CC 1、CC 0、OS和OV則根據函數運算的結果來設置。
5. NEG_R指令
NEG_R (將32位IEEE浮點數取反)將ACCU 1中的浮點數(32位,IEEE 754)取反。該指令將ACCU 1中位31的狀態(尾數符號)取反,結果存儲在累加器1中
第五節數據運算指令
運算指令主要用於對存儲器數據進行四則運算、函數運算處理等,數據可以是整數、浮點數。
運算指令是在累加器中執行的。S7係統提供了兩個累加器,在算數運算中將累加器1作為主累加器,累加器2作為輔助累加器,與主累加器進行運算的數據存儲在累加器2中。在執行算數運算指令時,累加器2中的值作為被減數和被除數,而算術運算的結果則保存在累加器1中,等待將結果傳輸到指定的存儲單元中進行保存,而累加器1中原有的數據將被運算結果所覆蓋,累加器2中的值保持不變。
在進行運算之前,需要將涉及的數據讀入到累加器中。S7係統讀入數據都是通過累加器1進行的。算術運算的兩個數據是按如下方式讀入的:
① 先讀入一個數據A存儲在累加器1中;
② 再讀入另一個數據B到累加器1中。(在讀入數據B之前,係統自動將數據A傳送到累加器2中)。
一、整數運算指令
1.整數運算指令
其中,標題ADD_I用於指明運算類型及參加運算的數據類型,如ADD、SUB、MUL、DIV、MOD分別表示加、減、乘、除和求餘數運算;I表示16位整數運算,DI表示32位整數運算。使能輸入EN控製指令的執行,當使能(EN)輸入端為邏輯“1”時激活ADD_I (整數加);輸出端ENO的狀態與EN的狀態保持一致。數據輸入端IN1和IN2用於輸入參加運算的數據;數據輸出端OUT用於輸出運算結果,並指定運算結果存儲位置。對於ADD_I、SUB_I、MUL_I、DIV_I指令,如果結果超出了整數(16位)允許的範圍,OV位和OS位將為“1”,並且ENO為邏輯“0”,這樣便不執行此數學框後由ENO連接的其它函數(層疊排列);對於ADD_DI、SUB_DI、MUL_DI、DIV_DI、MOD_DI指令,如果結果超出了長整數(32位)允許的範圍,OV位和OS位將為“1”,ENO為邏輯“0”,不再執行此數學框後由ENO連接的其它函數(層疊排列)。
EN、ENO、OUT的存儲區為I、Q、M、L、D;IN1和IN2的存儲區為I、Q、M、L、D或常數。
2.整數運算注意事項
(1)梯形圖中的整數乘法指令的輸出是16位整數地址,累加器1的乘積的低16位被送給輸出地址。因此梯形圖中的整數乘法指令的乘積是16位,而不是32位。
(2)除法的商和餘數:雙整數除法指令隻能得到32位的商,餘數被丟掉,可以用MOD指令來求雙整數除法的餘數。
(3)整數運算指令影響狀態字中的以下位:CC1和CC0,OV和OS。
【例9-13】梯形圖敘述其執行過程。
如果I0.0=1,則激活ADD_I框,執行過程如下:
① 將操作數1——MW2中的數據讀入到累加器1中;
② 將操作數2——MW12中的數據讀入到累加器1中,原累加器1中的操作數移動到累加器2中;
③ 累加器2中的內容與累加器1中的數據進行運算,結果存儲在累加器1中;
④ 將存儲在累加器1中的運算結果傳送到結果存儲器中,即存儲在MW10的存儲單元中;
⑤ 如果結果超出整數的允許範圍,則設置輸出Q4.0為“1”。
【例9-14】壓力變送器的量程為0~10MPa,輸出信號為4~20mA,S7-300的模擬量輸入模塊的量程為4~20mA,轉換後的數字量為0~27648,設轉換後的數字為N,試求以kPa為單位的壓力值。
解:0~10MPa(0~10000kPa)對應於轉換後的數字0~27648,轉換公式為:
P=(10000×N)/27648(kPa)
值得注意的是,在運算時一定要先乘後除,否則會損失原始數據的精度。假設A/D 轉換後的數據N在MD6 中,以kPa為單位的運算結果在MW10中。
MUL_D指令的運算結果為16位整數,A/D轉換後的最大數字為27648,乘以10000以後可能超過16位整數的允許範圍,所以需要使用雙字乘法指令MUL_DI。雙字除法指令DIV_DI的運算結果為雙字,但由上式可知運算結果實際不會超過16位正整數的最大值32767,所以用MOVE指令將MD20的低字MW22的16位整數運算結果傳送到MW10。
二、浮點數運算指令
1.浮點數運算指令
在S7-300中,浮點數的運算指令除了整數運算指令中的運算外,還包括正弦、餘弦、正切、平方根、自然對數、平方、反正弦、反餘弦、求絕對值等運算。對於浮點數的函數運算,同樣需要遵守函數運算的基本要求,保證程序中操作數取值範圍的正確性。
(1)對於LAD浮點數運算指令:其中,標題ADD_R用於指明運算類型及參加運算的數據類型,如ADD、SUB、MUL、DIV分別表示加、減、乘、除;R表示浮點數運算。使能輸入EN控製指令的執行;ENO為使能輸出端。數據輸入端IN1和IN2用於輸入參加運算的數據;數據輸出端OUT用於輸出運算結果,並指定運算結果存儲位置。如果該結果超出了浮點數允許的範圍(溢出或下溢),OV位和OS位將為“1”,並且ENO為邏輯“0”,這樣便不執行此數學框後由ENO連接的其它函數(層疊排列)。
(2)對於LAD擴展浮點數運算指令:其中,標題SQR用於指明運算類型。EN為啟動輸入,ENO為啟動輸出。IN是浮點數的輸入端;數據輸出端OUT用於輸出運算結果,並指定運算結果存儲位置。
EN、ENO、OUT的存儲區為I、Q、M、L、D;IN的存儲區為I、Q、M、L、D或常數。
2.浮點數運算注意事項
(1)浮點數三角函數指令的輸入值是以弧度為單位的浮點數,如果輸入值是以角度為單位的浮點數,求三角函數之前應先將角度值乘以π/180,轉換為弧度值。
(2)浮點數反正弦指令ASIN和浮點數反餘弦函數指令ACOS的輸值應≥-1和≤+1,-π/2≤ASIN的運算結果≤+π/2,0≤ACOS的運算結果≤π;浮點數反正切函數指令的運算結果≥-π/2和≤+π/2。
(3)浮點指令影響狀態字中的下列位:CC1和CC0、OV和OS。
【例9-15】試用算術邏輯指令完成(238.5+120.5)×15.7÷8.8運算。
三、字邏輯指令
字邏輯指令按照布爾邏輯逐位比較字(16位)和雙字(32位)對。 如果輸出OUT的結果不等於0,將把狀態字的CC1位設置為“1”; 如果輸出OUT的結果等於0,將把狀態字的CC1位設置為“0”。
1. WAND_W(字)(單字“與”運算)
使能(EN)輸入的信號狀態為“1”時將激活WAND_W (字“與”運算),並逐位對IN1和IN2處的兩個字值進行“與”運算。數值用純二進製位的形式表示。結果可以在輸出OUT中掃描。ENO與EN的邏輯狀態相同。
2. WOR_W(字)(單字“或”運算)
使能(EN)輸入的信號狀態為“1”時將激活WOR_W (單字“或”運算),並逐位對IN1和IN2處的兩個字值進行“或”運算。數值用純二進製位的形式表示。結果可以在輸出OUT中掃描。ENO與EN的邏輯狀態相同。
3.WAND_DW(字)(雙字“與”運算)
使能(EN)輸入的信號狀態為“1”時將激活WAND_DW (雙字“與”運算),並逐位對IN1和IN2處的兩個字值進行“與”運算。數值用純二進製位的形式表示。結果可以在輸出OUT中掃描。ENO與EN的邏輯狀態相同。
4.WOR_DW(字)(雙字“或”運算)
使能(EN)輸入的信號狀態為“1”時將激活WOR_DW (雙字“或”運算),並逐位對IN1和IN2處的兩個字值進行“或”運算。數值用純二進製位的形式表示。結果可以在輸出OUT中掃描。ENO與EN的邏輯狀態相同。
5.WXOR_W(字)(單字“異或”運算)
使能(EN)輸入的信號狀態為“1”時將激活WXOR_W (單字“異或”運算),並逐位對IN1和IN2處的兩個字值進行“異或”運算。數值用純二進製位的形式表示。可以在輸出OUT掃描結果。ENO與EN的邏輯狀態相同。
6.WXOR_DW(字)(雙字“異或”運算)
使能(EN)輸入的信號狀態為“1”時將激活WXOR_DW (雙字“異或”運算),並逐位對IN1和IN2處的兩個字值進行“異或”運算。數值用純二進製位的形式表示。可以在輸出OUT掃描結果。ENO與EN的邏輯狀態相同。
不難看出,與DW#16#FFFFFFFF取“異或”關係相當於將MD0取反。
【例9-16】加熱爐控製。
操作員通過按啟動按鈕來啟動加熱爐。操作員設置的值以二進製編碼的十進製(BCD)格式顯示,單位為s。
第六節控製指令
一、邏輯控製指令
邏輯控製指令是指邏輯塊內的跳轉和循環指令。在沒有執行邏輯控製指令之前,各程序按照從上到下的先後順序逐條執行,這種執行方式稱為線性掃描。邏輯控製指令中止當前的線性掃描,跳轉到指令的地址標號所在的目的地地址。跳到目的地後,程序繼續按線性掃描的方式執行。跳轉指令與對應的跳轉目的地址應在同一個邏輯塊內。在同一個塊內,同一個跳轉目的地址隻能出現一次。
跳轉或循環指令的操作數是地址標號,該地址標號指出程序要跳往何處,標號最多為4個字符,第一個字符必須是字母,其餘字符可為字母或數字。在語句表中,跳轉標號與目標指令用冒號“:”分隔,且在行中必須位於程序語句之前。
1.無條件跳轉
〈標號名稱〉
——(JMP)
跳轉指令“——(JMP)”直接連接到梯形圖的左母線上,當程序運行到這條指令時必然發生跳轉,即無條件跳轉。對於每一個“——(JMP)”都必須有與之對應的目標(標號)。跳轉指令和標號間的所有指令都不予執行。
2.條件跳轉
條件跳轉,當某條指令執行完畢時使跳轉的條件滿足了,才能執行跳轉。“——(JMP)”(RLO為“1”時在塊內跳轉)當前一邏輯運算的RLO為“1”時用作條件跳轉功能。每一個“——(JMP)”都還必須有與之對應的目標(標號)。跳轉指令和標號間的所有指令都不予執行。如果未執行條件跳轉,RLO將在執行跳轉指令後變為“1”。
3.——(JMPN)(若“否”則跳轉)
〈標號名稱〉
——(JMPN)
“——(JMPN)”(若“否”則跳轉)相當於在RLO為“0”時執行的“轉到標號”功能。每一個“——(JMPN)”都還必須有與之對應的目標(標號)。 跳轉指令和標號間的所有指令都不予執行。如果未執行條件跳轉,RLO將在執行跳轉指令後變為“1”。
4.LABEL標號指令
標記程序段,作為跳轉指令執行時跳轉到目的位置。LABEL是跳轉指令目標的標識符。第一個字符必須是字母表中的字母,其它字符可以是字母或數字(例如CAS1)。每個 “——(JMP)”或“——(JMPN)”都還必須有與之對應的跳轉標號(LABEL)。
二、程序控製指令
程序控製指令是指功能塊(FB、FC、SFB、SFC)調用指令和邏輯塊(OB、FB、FC)結束指令。調用塊或結束塊可以是條件的或是無條件的。STEP 7中的功能塊實質上就是子程序。
1.—(CALL)[從線圈調用FC/SFC(無參數)]
符號:〈FC/SFC號〉
——(CALL)
說明:“——(CALL)”(無參數調用FC或SFC指令)用來調用不帶參數的功能(FC)或係統功能(SFC)。隻有當CALL線圈的RLO為“1”時,才執行調用。如果執行“——(CALL)”,則完成以下操作:
① 存儲調用塊的返回地址;
② 將當前的本地數據區代替以前的本地數據區;
③ 將MA位(有效MCR位)移位到B堆棧中;
④ 為被調用的功能創建一個新的本地數據區;
⑤ 在此之後,在被調用的FC或SFC中繼續執行程序處理。
在返回調用塊之後,以前打開的DB將不再總是打開。
梯形圖的梯級是由用戶編寫的功能塊中的程序段。在該FB中,打開DB10,並激活MCR功能。
(1)當執行無條件調用FC10時,發生下麵情況:保存調用FB的返回地址,並保存DB10和調用FB的實例數據塊的選擇數據。在MCRA指令中設置成“1”的MA位被推入到B堆棧中,然後為被調用塊(FC10)將MA位設置成“0”。繼續在FC10中進行程序處理。當FC10要求MCR功能時,必須在FC10內重新激活該功能。當完成FC10時,程序處理返回調用FB。不管FC10使用了哪個DB,都恢複MA位,DB10和用戶編寫FB的實例數據塊重新成為當前DB。通過將I0.0的邏輯狀態分配給輸出Q4.0,程序繼續處理下一個梯級。
(2)FC11的調用為條件調用。隻有在I0.1為“1”時,才執行調用。執行調用後,將程序控製傳遞給FC11並從FC11返回程序控製的過程,與已經描述過的FC10的過程相同。
另外,對於S7-300/400,CALL_FB可以從方塊調用FB;CALL_FC可以從方塊調用FC;CALL_SFB從方塊調用SFB;CALL_SFC從方塊調用SFC;還可以調用多背景塊,從庫中調用塊。
2.——(RET)(返回)
符號:——(RET)
RET (返回)用於有條件地退出塊。對於該輸出,要求在前麵使用一個邏輯運算。
3.主控繼電器指令
主控繼電器(MCR)是一種繼電器梯形圖邏輯的主開關,用於控製電流(能流)的通斷。
主控繼電器觸點前的母線(電源母線A)稱為主母線,其後的母線(電源母線B)稱為子母線。若MCR線圈得電(I0.0閉合),則MCR常開觸點閉合,子母線得電,與子母線相連的控製線路則處於可控狀態。若MCR線圈失電(I0.0斷開),則MCR常開觸點斷開,與子母線相連的控製線路將不能工作。
使用MCR指令時要注意:
① “MCR(T)MCR”必須成對出現,以表示子母線的開始與結束。
② MCR控製可以嵌套。由於MCR嵌套堆棧是一個LIFO(後進先出)堆棧,隻能有8個堆棧輸入,因此最多可以嵌套8層。
③ 若在MCRA和MCRD之間有塊結束指令BEU,CPU執行BEU的同時也會結束MCR區;如果在MCR區內有塊調用指令,MCR的激活狀態不能繼承到被調用的塊中,必須在被調用的塊內重新激活新的MCR區。
④ 在實際應用中,為了安全,對於緊急停機功能,禁止用MCR功能代替硬接線機械式主控繼電器。
三、數據塊指令
可以使用“打開數據塊”(OPN)指令將數據塊作為共享數據塊或背景數據塊打開。程序本身可同時容納一個打開的共享數據塊和一個打開的背景數據塊。
符號:
〈DB編號〉或〈DI編號〉
——(OPN)
尋址存儲區:DB,DI
“——(OPN)”(打開數據塊)可以打開共享數據塊(DB)或背景數據塊(DI)。“——(OPN)”函數是一種對數據塊的無條件調用。將數據塊的編號傳送到DB或DI寄存器中,之後,DB和DI指令根據寄存器的內容訪問相應的數據塊。
打開數據塊10 (DB10),觸點地址(DBX0.0)引用數據塊DB10中包含的當前數據記錄的數據字節0的第0位,該位的信號狀態被賦值給輸出Q4.0。
四、應用程序舉例
物料混合裝置用來將粉末狀的固體物料(粉料)和液體物料(液料)按一定的比例混合在一起,經過一定時間的攪拌後便得到成品。粉料和液料都用電子秤來計量。
初始狀態時,粉料秤料鬥、液料秤料鬥和攪拌器都是空的,它們底部的排料閥關閉;液料倉的放料閥關閉,粉料倉下部的螺旋輸送機的電機和攪拌機的電機停轉;Q4.0~Q4.4均為“0”狀態。
PLC 開機後用OB100 將初始步對應的M0.0 置為“1”狀態,將其餘各步對應的存儲器位複位為“0”狀態,並將MW10和MW12中的計數預置值分別送給減計數器C0 和C1。按下啟動按鈕I0.0,Q4.0變為“1”狀態,螺旋輸送機的電動機旋轉,粉料進入粉料秤的秤鬥;同時Q4.1變為“1”狀態,液料倉的放料閥打開,開始進料,液料進入液料秤的秤鬥。電子秤的光電碼盤輸出與秤鬥內物料重量成正比的脈衝信號。減計數器C0 和C1 分別對粉料秤和液料秤產生的脈衝計數,脈衝計數值減至0時,其常閉觸點閉合,秤鬥內的物料等於預置值。Q4.0、Q4.1 變為“0”狀態,停止進料,進入等待步後預置計數器。
計數器的當前值非0時,計數器的輸出位為“1”,反之為“0”。粉料稱量結束後,C0的常閉觸點閉合,轉換條件C0滿足,粉料秤從步M0.1轉換到等待步M0.2,預置值送給C0,為下次稱量做好準備;同樣,液料稱量結束後,液料秤從步M0.3轉換到等待步M0.4,預置值送給C1。步M0.2和M0.4後麵的轉換條件“=1”,表示轉換條件為二進製常數“1”,即轉換條件總是滿足的。因此,在兩個秤的稱量都結束後,M0.2和M0.4同時為活動步,係統將無條件地轉換到步M0.5,Q4.2變為“1”狀態,打開電子秤下部的排料門,兩個電子秤開始排料,排料過程用定時器T0定時;同時Q4.3變為“1”狀態,攪拌機開始攪拌。T0的定時時間到時排料結束,轉換到步M0.6,攪拌機繼續攪拌。T1的定時時間到時停止攪拌,轉換到步M0.7,Q4.4變為“1”狀態,攪拌機底部的排料門打開,經過T2的定時時間後,關閉排料門,一個工作循環結束。按了停止按鈕I0.1後,本程序並不立即停止運行,要等到當前工藝周期的全部工作完成,成品排放結束後,再從步M0.7返回到初始步M0.0。
按下啟動按鈕I0.0後,M1.0變為“1”,並保持自鎖狀態,係統處於連續工作方式。
在順序功能圖最下麵一步M0.7步執行完後,T2的常開觸點閉合,轉換條件T2·M1.0滿足,將從步M0.7轉換到步M0.1和M0.3,開始下一個周期的工作。在工作循環中的任意一步(步M0.1~M0.7)為活動步時按下停止按鈕I0.1,“連續”標誌位M1.0變為“0”狀態,但是不會立刻停止,要等到最後一步M0.7的工作結束,T2的常開觸點閉合,轉換條件T2·M1.0滿足,才會從步M0.7轉換到初始步M0.0,係統停止運行。
步M0.7之後有一個選擇序列的分支,當它的後續步M0.0、M0.1和M0.3變為活動步時,它都應變為不活動步。但是M0.1和M0.3是同時變為“1”狀態的,所以隻需要將M0.0和M0.1的常閉觸點或M0.0和M0.3的常閉觸點與M0.7線圈串聯。
步M0.1和步M0.3之前有一個選擇序列的合並,當步M0.0為活動步並且轉換條件I0.0滿足,或步M0.7為活動步並且轉換條件T2·M1.0滿足,步M0.1和 M0.3都應變為活動步。即代表這兩步的存儲器位M0.1和步M0.3的啟動條件應為M0.0·I0.0+M0.7·T2·M1.0,對應的啟動電路由兩條並聯支路組成,每條支路分別由M0.0、I0.0或M0.7、T2和M1.0的常開觸點串聯而成。
步M0.0之後有一個並行序列的分支,當M0.0是活動步,並且轉換條件I0.0滿足;或者M0.7為活動步,並且轉換條件T2·M1.0滿足,步M0.1與步M0.3都應同時變為活動步。M0.1和M0.3的啟動電路完全相同,保證了這兩步同時變為活動步。
步M0.1和步M0.3是同時變為活動步時,它們的常閉觸點同時斷開,因此M0.0的線圈隻需串聯M0.1或M0.3的常閉觸點就可以了。當然也可以同時串聯M0.1與M0.3的常閉觸點,但是要多用一條指令。
步M0.5之前有一個並列序列的合並,由步M0.2和步M0.4轉換到步M0.5的條件是所有的前級步(即步M0.2和M0.4)都是活動步和轉換條件(=1)滿足。因為轉換條件總是滿足的,所以隻需將M0.2和M0.4的常開觸點串聯,作為M0.5的啟動電路就可以了。轉換條件“=1”可以理解為一條看不見的短接線。
實際的物料混合係統要複雜得多,輸入/輸出量要多得多,本例對實際係統作了大量簡化。
五、小結
SIMATIC S7-300有350多條指令,包括熟知的、功能強大的STEP 5指令和SIMATIC TISOFT指令。本章介紹了德國西門子S7-300PLC的指令係統,對指令係統中各種指令的輸入形式、初始狀態、動作時序及指令的置位、複位條件進行了詳細的講解,並以例題的形式進一步介紹了指令的使用方法。
思考題與習題
1. S7-300的基本數據類型有哪些?
2. S7-300有幾種形式的定時器?脈衝定時器和擴展脈衝定時器有何區別?
3.對觸點的邊沿檢測與對RLO的邊沿檢測指令有何區別?
4. S7-300的計數器有幾種計數方式?
5.對兩個數的大小進行判斷通常用什麼指令進行?該指令的輸入數據類型有哪幾種?輸出為什麼類型?
6.編寫出將IB0字節高4位和低4位數據交換,然後送入定時器T37作為定時器預置值的程序。
7.設計一個2h40min延時電路程序。
8.把DB10/DBW2的BCD數轉為整數,結果存入MW20。
9.試完成以下控製要求:
I0.0一旦點動,Q4.0~Q4.7得電輸出,Q5.0~Q5.7沒有輸出;I0.1一旦點動,Q4.0~Q4.7沒有輸出,Q5.0~Q5.7得電輸出。
10.把DB10的DBW2的內容左移3位後與MW100做加法運算,運算結果送入DB12的DBW10。
11.試設計一個搶答器電路程序。出題人提出問題,三個答題人按動按鈕,僅僅是最早按的人麵前的信號燈亮;然後出題人按動複位按鈕後,提出下一個問題。