兌幸福
摘 要:PLC(程序邏輯控制器)采用循環(huán)掃描的方式執(zhí)行用戶程序,邏輯執(zhí)行狀態(tài)和數(shù)據(jù)運行結(jié)果監(jiān)視,需借助斷點功能或其他工具對PLC的存儲器和寄存器等內(nèi)部存儲器進行查詢。該文借助西門子編程軟件STEP7斷點功能,闡述如何在程序調(diào)試中設(shè)置斷點,通過斷點操作,逐步執(zhí)行程序,觀察程序運行時狀態(tài)字和累加器的數(shù)值改變,既可監(jiān)視程序的運行情況,又可查看程序數(shù)據(jù)塊、背景數(shù)據(jù)塊、堆棧指針等數(shù)值的變化,通過實際的邏輯結(jié)果監(jiān)視和數(shù)據(jù)實時查詢,對PLC的運行過程進行分析與探索,揭示PLC的工作原理。
關(guān)鍵詞:斷點功能 PLC測試 循環(huán)處理 存儲器 寄存器
中圖分類號:TP31 文獻標(biāo)識碼:A 文章編號:1674-098X(2015)12(b)-0100-06
隨著科學(xué)技術(shù)的發(fā)展,以微處理器為基礎(chǔ)的工業(yè)用PLC(程序邏輯控制器),已經(jīng)廣泛應(yīng)用于各種機械設(shè)備及生產(chǎn)線過程的自動化控制系統(tǒng)中,它功能強大、使用方便,成為當(dāng)代工業(yè)自動化領(lǐng)域的主要技術(shù)支柱之一。目前各廠商推出的PLC產(chǎn)品,基本結(jié)構(gòu)相同,工作原理相似,隨著國際標(biāo)準(zhǔn)化編程語言IEC61131-3的推出,編程方式也趨于統(tǒng)一,但不同品牌又各有特點,針對不同的應(yīng)用領(lǐng)域,開發(fā)出專用的功能模塊,對PLC性能進行優(yōu)化;編程軟件的輔助功能也在進行功能拓展,應(yīng)用于特殊的編程、測試、仿真等。
西門子公司編程軟件STEP7中的斷點調(diào)試功能,以其功能強大、操作簡單、設(shè)置方便、界面友好等特點,成為最好的探索PLC工作原理的工具之一,通過斷點調(diào)試功能結(jié)合PLC SIM仿真軟件或在線監(jiān)控PLC硬件運行,可以分解程序運行步驟,觀察累加器和狀態(tài)字寄存器、塊寄存器、輸入/輸出變量、位存儲器等內(nèi)部核心器件的運行狀態(tài),了解PLC的工作過程。
1 PLC的運行工作過程
PLC的程序分為操作系統(tǒng)和用戶程序,操作系統(tǒng)用來處理PLC的啟動、刷新輸入/輸出過程映像區(qū)、調(diào)用用戶程序、處理中斷和錯誤、管理存儲區(qū)和通訊等任務(wù)。PLC采用循環(huán)掃描方式執(zhí)行由若干條指令組成的用戶程序,指令在存貯器中順序排列。從第一條指令開始,逐條順序執(zhí)行,直至掃描到最后一條,其間還會執(zhí)行跳轉(zhuǎn)指令和塊調(diào)用指令,在執(zhí)行指令時,從輸入/輸出過程映像區(qū)或其他存儲區(qū)讀入數(shù)據(jù),按指令執(zhí)行相應(yīng)邏輯運算、算術(shù)運算,運算的結(jié)果寫入指定的存儲區(qū)域,因此與程序執(zhí)行相關(guān)的執(zhí)行器存儲區(qū)的內(nèi)容會隨著程序的執(zhí)行而變化,觀察和跟蹤這些核心器件內(nèi)數(shù)據(jù)的變化過程,可以實現(xiàn)了解PLC的運行過程和工作原理的目的。
2 STEP7斷點測試功能
STEP7的斷點測試功能是在程序運行過程中產(chǎn)生斷點,該功能的初衷是調(diào)試程序,在設(shè)備運行初期或出現(xiàn)故障時,通過斷點操作,逐行在線掃描程序,同時觀察寄存器里狀態(tài)字的變化,累加器、存儲器中數(shù)據(jù)的運算以及檢測程序的運行結(jié)果,從而查找編程錯誤或故障點,最終解決問題。正是這樣逐步觀察程序運行的過程,為探索PLC的運行原理提供了技術(shù)手段。
2.1 斷點測試功能的內(nèi)容
在STEP7測試模式下,斷點的限制數(shù)目可以通過選項設(shè)置,使用斷點可以在用戶程序的指定點停止程序處理。當(dāng)PLC在程序中執(zhí)行到斷點時,CPU會切換到STOP模式?;跀帱c,可以逐步運行程序處理,檢測每條語句執(zhí)行的結(jié)果,并通過窗口顯示PLC內(nèi)部寄存器的內(nèi)容、狀態(tài)和數(shù)值,如圖1所示。
2.2 斷點測試功能設(shè)置步驟
此例使用西門子的S7 PLC SIM仿真器進行演示,使用真實PLC時,要盡量隔離I/O信號,如果必須在線調(diào)試程序,就要做好相關(guān)設(shè)備的防護措施,減少設(shè)備誤動作造成的損害。注意:并非所有的PLC都可以使用斷點測試功能,測試前要查閱相關(guān)可編程控制器的文檔,確定PLC是否支持該功能。
2.2.1 設(shè)置斷點測試運行模式
在西門子STEP7編程軟件中打開需要調(diào)試的程序,在編程窗口使用調(diào)試/操作……菜單命令,就會打開操作窗口,如圖2所示,可以在過程操作和測試操作之間選擇需要的操作模式。
兩種模式是有區(qū)別的,過程操作模式下,測試功能程序狀態(tài)被限定為要保證在掃描周期時間上處理的程序最少,這就意味著不允許任何子程序調(diào)用,也不能進行HOLD測試和單步執(zhí)行程序。測試操作模式下,所有的測試功能都可用,且不受限制,PLC掃描周期時間會明顯增加,這是因為,需要手動控制程序的進程,并且程序回路中的語句狀態(tài)在每個周期都被記錄。
2.2.2 設(shè)置程序狀態(tài)
通過離線/在線伙伴命令按鈕,可以切換PLC的離線/在線狀態(tài),只有PLC處于在線狀態(tài)時,才能運行斷點測試功能,此時,頂部狀態(tài)欄會顯示為淺藍色,用來區(qū)分離線/在線狀態(tài),如圖3所示。
2.2.3 在程序中設(shè)置斷點
將PLC設(shè)置為在線狀態(tài)后,使用視圖>斷點欄命令可以調(diào)出斷點工具欄,按鈕功能如圖4所示。
將光標(biāo)移動到需要測試或觀察的程序行前端,點擊設(shè)置/刪除斷點按鈕,即可在此處設(shè)置斷點測試的起點,該程序行前端出現(xiàn)一個空心圓圈標(biāo)記,如圖5所示,再點擊斷點激活(開/關(guān)),斷點變?yōu)閷嵭膱A圈標(biāo)記,同時彈出圖1所示的PLC寄存器內(nèi)容窗口。
此時要將PLC切換到RUN-P模式,然后點擊下一個語句按鈕,即可顯示一個箭頭,指向要運行的程序,隨著按鈕的點擊,程序逐步開始執(zhí)行,執(zhí)行過程中的狀態(tài)和運行數(shù)據(jù)都可以通過PLC寄存器內(nèi)容窗口觀察到,直至程序結(jié)束。注意:斷點測試只能在STL視圖模式下進行。建議不要調(diào)用整個程序進行調(diào)試,而是逐個調(diào)用功能塊,應(yīng)當(dāng)從調(diào)用子程序體系最深的嵌套層開始。
3 斷點測試實例
為了能夠全面了解斷點測試功能,在編寫的測試程序中盡量涉及PLC的典型應(yīng)用實例,包括邏輯判斷、數(shù)據(jù)運算、子程序調(diào)用、數(shù)據(jù)塊調(diào)用、背景數(shù)據(jù)塊等,基本能夠滿足對PLC運行和工作原理的探索與研究。
3.1 編寫測試程序
3.1.1 測試程序的功能
基于以上目的,編寫一個按鈕控制16盞燈的測試程序,當(dāng)按鈕按下2次后16盞燈全亮,當(dāng)按鈕按到第3次時16盞燈全滅,然后重新開始循環(huán),具體過程如下。
(1)在主程序OB1中滿足M0.0=1條件后,調(diào)用子程序功能塊FB1,背景數(shù)據(jù)塊為DB3。
(2)在子程序FB1功能塊中點擊按鈕I0.0,點擊次數(shù)記錄在全局數(shù)據(jù)塊DB1的DB1.DBW0中。
(3)調(diào)用結(jié)束,回到主程序OB1。
(4)如果DB1.DBW0>=1(記錄到按鈕按下次數(shù)為1或以上),將DB2.DBW0賦值為1。
(5)DB1.DBW0和DB2.DBW0相加,計算結(jié)果送到MW100中。
(6)如果MW100>=3(即按鈕按下2次),PQW0控制下的16盞燈全亮。
(7)如果MW100>=4(即按鈕按下3次),PQW0控制下的16盞燈全滅,此時DB1.DBW0、DB2.DBW0、MW100復(fù)位為0,程序結(jié)束。
3.1.2 程序控制邏輯
程序邏輯如圖6所示。
滿足M0.0=1條件后,程序跳轉(zhuǎn)到功能FB1,完成按鈕計數(shù)后,轉(zhuǎn)回主程序,再對計數(shù)進行判斷,滿足條件燈亮,否則燈滅。
3.1.3 編寫程序
首先編寫子程序FB1功能塊,在變量聲明表中設(shè)置內(nèi)部變量,“a”為布爾型數(shù)據(jù),“zhongjian”為整數(shù)型數(shù)據(jù)。
在FB1中編寫程序如下:
程序段1
A I 0.0
FP #a
CU C 1
BLD 101
A M 0.3
L C#1
S C 1
A M 0.4
R C 1
L C 1
T #zhongjian
NOP 0
NOP 0
程序段2
L #zhongjian
T DB1.DBW 0
NOP 0
在OB1中編寫主程序,在程序段1中有條件調(diào)用功能塊FB1,會提示自動生成背景數(shù)據(jù)塊,這里指定的背景數(shù)據(jù)塊為DB3。
程序段1
A M 0.0
JNB _001
CALL FB 1 , DB3
a :=M0.1
zhongjian:=DB1.DBW2
_001: NOP 0
程序段2
A(
L DB1.DBW 0
L 1
>=I
)
JNB _002
L 1
T DB2.DBW 0
_002: NOP 0
程序段3
L DB1.DBW 0
L DB2.DBW 0
+I
T MW 100
NOP 0
程序段4
L MW 100
L 4
>=I
= M 0.4
程序段5
A M 0.4
= L 20.0
A L 20.0
JNB _003
L 0
T MW 100
_003: NOP 0
A L 20.0
JNB _004
L 0
T DB1.DBW 2
_004: NOP 0
A L 20.0
JNB _005
L 0
T DB2.DBW 0
_005: NOP 0
程序段6
L MW 100
L 3
>=I
JN noze
L DW#16#FFFF
T PQW 0
JU next
noze: L 0
T PQW 0
next: NOP 0
3.2 測試程序下載和運行
保存編寫完成的程序,STEP7會對編寫的程序進行檢測,如果發(fā)現(xiàn)問題會給出錯誤提示,幫助編程人員修改程序,然后下載到PLC的裝載存儲器中,工作時,由CPU調(diào)度指揮,將程序和系統(tǒng)存儲器中的數(shù)據(jù)放在工作存儲器中運行,再將結(jié)果送回各個系統(tǒng)存儲器,具體功能如下。
3.2.1 裝載存儲器
編寫的程序和系統(tǒng)數(shù)據(jù)(組態(tài)、連接和模塊參數(shù))被下載到CPU的裝載存儲器內(nèi)。程序運行時,CPU把程序中的可執(zhí)行部分復(fù)制到工作存儲器內(nèi)。隨PLC的型號不同,裝載存儲器可能是RAM和FEPROM等。
3.2.2 工作存儲器
集成高速存取的RAM存儲器,用于存儲CPU運行時的用戶程序和數(shù)據(jù)。在CPU斷電或復(fù)位操作時,RAM中的程序會被清除。
3.2.3 系統(tǒng)存儲器
系統(tǒng)存儲器是CPU為用戶程序提供的存儲器組件,被劃分為若干個地址區(qū)域,用于存放用戶程序的操作數(shù)據(jù),如過程映像輸入/輸出、位存儲器、定時器、計數(shù)器、數(shù)據(jù)塊與背景數(shù)據(jù)塊、塊堆棧、中斷堆棧和診斷緩沖區(qū)等,該區(qū)域還提供臨時存儲器,可以存放程序塊的臨時數(shù)據(jù),當(dāng)用戶生成塊時,可以聲明臨時變量,該區(qū)域只在執(zhí)行該塊時有效,執(zhí)行完后被覆蓋,該例在FB1功能塊中聲明的布爾量“a”和整數(shù)“zhongjian”即為臨時變量。
如圖7所示:掃描循環(huán)開始時,CPU讀取過程映像輸入/輸出區(qū)域里的I0.0(按鈕)的輸入信號,在計數(shù)器存取區(qū)域記錄FB1功能塊中點擊按鈕的次數(shù),并存儲在臨時存儲器里,背景數(shù)據(jù)塊DB3與之相關(guān)聯(lián),然后送到共享數(shù)據(jù)塊DB1中的DB1.DBW0,同時使共享數(shù)據(jù)塊DB2中的DB2.DBW0等于1,DB1.DBW0與DB2.DBW0相加,結(jié)果送到位存儲器MW100中,通過對MW100的判斷,如果大于等于3,將FF賦值給過程映像輸入/輸出區(qū)域PQW0,控制16盞燈全部亮起,如果大于等于4,則將0賦值給PQW0,燈全部滅。
4 斷點測試過程
CPU中的狀態(tài)字寄存器和累加器寄存器擔(dān)負著PLC的程序控制和數(shù)值運行,通過斷點測試可以觀察到狀態(tài)字的狀態(tài)變化與控制程序運行的對應(yīng)關(guān)系,以及累加器寄存器中數(shù)值的計算過程。
4.1 運行測試程序
在OB1的程序段1中設(shè)置斷點,在線開始測試,該行程序是一個條件調(diào)用,當(dāng)M0.0=0時,程序向下進行,當(dāng)M0.0=1時,調(diào)用FB1功能塊。
當(dāng)M0.0=0時,狀態(tài)字寄存器的/FC=0,表示一行程序的開始,STA=1,與命令A(yù)相對應(yīng),隨著程序執(zhí)行到第二行,/FC=1,表示程序正在執(zhí)行中,繼續(xù)執(zhí)行時,由于沒有滿足調(diào)用條件,程序沒有執(zhí)行調(diào)用FB1功能塊,而是直接跳過,進入下一段程序。
當(dāng)M0.0=1時,程序執(zhí)行到第二行,狀態(tài)字寄存器/FC=1、STA=1、ROL=1,狀態(tài)為存儲的是尋址位的狀態(tài),邏輯位為1,表示能流可以到達該運算處(滿足條件),可以跳轉(zhuǎn),兩種條件下狀態(tài)字寄存器對比如圖8所示。
程序執(zhí)行到第三行時,狀態(tài)字寄存器/FC=1、STA=1、ROL=1,表示程序重新開始,因此,一行程序的開始并不是以段落和行來劃分的,而是由狀態(tài)字根據(jù)程序執(zhí)行的狀態(tài),結(jié)合狀態(tài)位、邏輯位的結(jié)果來決定的。此時要點擊“執(zhí)行調(diào)用”按鈕,程序執(zhí)行調(diào)用,自動在編程窗口打開FB1程序塊,箭頭指示到程序段1的第一行,此時在PLC寄存器內(nèi)容中可以看到,背景數(shù)據(jù)塊為DB3。
在FB1中,當(dāng)I0.0=0時,/FC=1、STA=0、BR=1、ROL=0,程序執(zhí)行到此處時,邏輯結(jié)果為0;當(dāng)I0.0=1時, /FC=1、STA=1、BR=1、ROL=1,說明程序執(zhí)行到該行時,對I0.0的信號做出狀態(tài)和邏輯判斷,邏輯結(jié)果為1,在隨后執(zhí)行的程序中計數(shù)器值為1,記錄到按鈕的點擊次數(shù),其余程序與此類同,不再分析。
4.2 狀態(tài)字寄存器
通過上面的實例,可以看出狀態(tài)字是一個16位的寄存器(高7位未用),用于存儲CPU執(zhí)行指令的狀態(tài)。狀態(tài)字中的某些位用于決定指令是否執(zhí)行和以什么樣的方式執(zhí)行,此時,狀態(tài)字中的變化為了解程序的運行提供了參考,指示程序運行的情況,而且,位邏輯指令和字邏輯指令還可以訪問和檢測狀態(tài)字,將狀態(tài)位信號直接集成到程序中,控制程序執(zhí)行的流程。
狀態(tài)字的每個位都與程序運行相關(guān),如圖9所示。
4.2.1 /FC:首位檢測位
第0位稱為首次檢測位,F(xiàn)C前面的斜杠表示對FC取反,用于判斷一個邏輯串(一系列的邏輯運算指令)的起止。 /FC為0,表明一個新邏輯串的開始,邏輯串指令執(zhí)行過程中/FC為1,邏輯串指令結(jié)束時,/FC位清零。
4.2.2 RLO:邏輯運算結(jié)果位
第1位為RLO,位稱為邏輯運算結(jié)果(Result of Logic Operation)。該位用來存儲執(zhí)行位邏輯指令或比較指令的結(jié)果。RLO的狀態(tài)為1,表示有能流流過運算點處;為0則表示無能流流過該點。可以用RLO觸發(fā)跳轉(zhuǎn)指令。
4.2.3 STAT:狀態(tài)位
第2位為狀態(tài)位,用以保存被尋址位的值。狀態(tài)位不能用指令檢測,它只是在程序測試中被CPU解釋并使用。如果一條指令是對存儲區(qū)操作的位邏輯指令,則無論是對該位的讀或?qū)懖僮鳎琒TA總是與該位的值取得一致;對不訪問存儲區(qū)的位邏輯指令來說,STA位沒有意義,此時它總被置為1。
4.2.4 BR:二進制結(jié)果位
第8位為二進制結(jié)果位,它將字處理程序與位處理聯(lián)系起來,在一段既有位操作又有字操作的程序中,用于表示字邏輯是否正確。如果字邏輯指令或者功能、功能塊出現(xiàn)錯誤,把BR置為0,能流中斷,下條指令不被執(zhí)行。字邏輯指令或者功能、功能塊被正確執(zhí)行后,使BR位為1,能流就可以傳遞到下條指令。
其余的OR、OV、OS、CC0、CC1位也與指令的邏輯操作和字運算等相關(guān)聯(lián),都可以通過邏輯位來訪問,作為狀態(tài)位常開/常閉觸點用于編程。
4.3 程序運算測試
在FB1功能塊將記錄的按鈕動作次數(shù)送入DB1.DBW 0中(為了更清楚地分析數(shù)據(jù),假設(shè)這里已經(jīng)記錄了兩次,即DB1.DBW 0=2),并返回OB1,運行到到程序段3 L DB1.DBW 0時,先將DB1.DBW 0中的數(shù)值2內(nèi)容裝入ACCU1(全局數(shù)據(jù)塊為DB1),再執(zhí)行L DB2.DBW 0,將數(shù)值1裝入ACCU1(全局數(shù)據(jù)塊為DB2),ACCU1原來的2移動到ACCU2中,執(zhí)行整數(shù)相加命令后,結(jié)果送入ACCU1,此時ACCU1=3,ACCU執(zhí)行前后對比如圖10所示。
4.4 CPU的累加器
從上面的測試可以看出,累加器是CPU中的專用寄存器。S7_300有兩個累加器,S7_400有4個累加器,數(shù)據(jù)的傳送與變換一般通過累加器進行,而不是在存儲區(qū)進行,還可以把操作數(shù)送入累加器,在累加器中進行運算和處理,處理后的運算結(jié)果保存在累加器1中,并可傳送到存儲區(qū)。數(shù)據(jù)運行原理如圖11所示。
5 結(jié)語
通過西門子STEP7斷點功能測試,為觀察PLC程序運行找到了一種技術(shù)途徑。編輯完成的程序下載到裝載存儲器,再將程序和系統(tǒng)存儲器中的數(shù)據(jù)調(diào)入工作存儲器中運行,由CPU狀態(tài)寄存器里的控制字控制執(zhí)行程序,由累加器完成數(shù)據(jù)運算和數(shù)據(jù)傳遞,使人們對PLC的工作原理有了更深入的了解。
參考文獻
[1]廖常初.S7-300/400PLC應(yīng)用技術(shù)[M].北京:機械工業(yè)出版社,2008.
[2]王安兵.什么是狀態(tài)字?狀態(tài)字的作用[J/OL].百度文庫:http://wenku.baidu.com/link?url=F-IF3lCjaiR80vvTiuLIaJgUvs0YepwAJls-a8ZqvID1Hub0m1g9MuAgDcFvUEXaV9imLPyjNIi-E4-oh1PfWNMy9dsdQPnE0Ycr28JTpkS.
[3]劉玉蓉.西門子狀態(tài)字九個位的含義[J/OL].技成文章:http://www.diangon.com/wenku/PLC/ximenzi/201308/00004968.html.