




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第5章S7系列程序結構與程序設計5.1編程方式與程序塊5.2數據塊與數據結構5.3S7系列PLC程序設計思考與練習題5.1編程方式與程序塊5.1.1S7-300編程方式簡介S7-300系列PLC的編程語言是STEP7。STEP7繼承了STEP5語言結構化程序設計的優點,用文件塊的形式管理用戶編寫的程序及程序運行所需的數據。如果這些文件塊是子程序,則可以通過調用語句,將它們組成結構化的用戶程序。這樣,PLC的程序組織明確,結構清晰,易于修改。5-1各塊的簡要說明見表5-1為支持結構化程序設計,STEP7用戶程序通常由組織塊(OB)、功能塊(FB)或功能塊(FC)等三種類型的邏輯塊和數據塊(DB)組成。組織塊(OB)是系統操作程序與用戶應用程序在各種條件下的接口界面,用于控制程序的運行。OB塊根據操作系統調用的條件(如時間中斷、報警中斷等)可分成幾種類型,這些類型有不同的優先級,高優先級的OB可以中斷低優先級的OB。每個S7CPU包含一套可編程的OB塊(隨CPU而不同),不同的OB塊執行特定的功能。OB1是主程序循環塊,在任何情況下,它都是需要的。根據過程控制的復雜程度,可將所有程序放入OB1中進行線性編程,或將程序用不同的邏輯塊加以結構化,通過OB1調用這些邏輯塊,并允許塊間的相互調用。塊的調用指令中止當前塊(調用塊)的運行調用,然后執行被調用塊的所有指令。一旦被調用的塊被完成,執行調用指令的塊繼續執行調用指令后的指令。調用塊可以是任何邏輯塊,被調用塊只能是功能塊(除OB外的邏輯塊)。圖5.1所示是一個STEP7調用實例。除了OB1,操作系統可以調用其它的OB塊以響應確定事件。其它可用的OB塊隨所用的CPU性能和控制過程的要求而定。圖5.1STEP7調用過程示意圖
功能塊(FB、FC)實際上是用戶子程序,分為帶“記憶”的功能塊FB和不帶“記憶”的功能塊FC。前者有一個數據結構與該功能塊的參數表完全相同的數據塊(DB)附屬于該功能塊,并隨功能塊的調用而打開,隨功能塊的結束而關閉。該附屬數據塊叫做背景數據塊(InstanceDataBlock),存放在背景數據塊中的數據在FB塊結束時繼續保持,即被“記憶”。功能塊FC沒有背景數據塊,當FC完成操作后數據不能保持。在調用功能塊時使用不同的背景數據塊,可以控制多個同類的對象。DB201:電動機1電動機1的背景數據塊DB202:電動機2DB203:電動機3電動機2的背景數據塊電動機3的背景數據塊FB22:電動機圖不同對象的背景數據塊數據塊(DB)是用戶定義的用于存取數據的存儲區,可以被打開或關閉。DB可以是屬于某個FB的情景數據塊,也可以是通用的全局數據塊,用于FB或FC。S7CPU還提供標準系統功能塊(SFB、SFC),它們是預先編好的,經過測試后集成在S7CPU中的功能程序庫。用戶可以直接調用它們,高效地編制自己的程序。由于它們是操作系統的一部分,因此不需將其作為用戶程序下載到PLC。與FB塊相似,SFB需要一個背景數據塊,并需將此DB塊作為程序的一部分安裝到CPU中。不同的CPU提供不同的SFB、SFC功能。系統數據塊(SDB)是為存放PLC參數所建立的系統數據存儲區。用STEP7的S7組態軟件可以將PLC組態數據和其它操作參數存放于SDB中。
5.1.2功能塊編程及調用功能塊由兩個主要部分組成:一部分是每個功能塊的變量聲明表,變量聲明表聲明此塊的局部數據;另一部分是邏輯指令組成的程序,程序要用到變量聲明表中給出的局部數據。當調用功能塊時,需提供塊執行時要用到的數據或變量,也就是將外部數據傳遞給功能塊,這被稱為參數傳遞。參數傳遞的方式使得功能塊具有通用性,它可被其它的塊調用,以完成多個類似的控制任務。1.變量聲明表(局部數據)每個邏輯塊前部都有一個變量聲明表,在變量聲明表中定義邏輯塊用到的局部數據。局部數據分為參數和局部變量兩大類,局部變量又包括靜態變量和臨時變量(暫態變量)兩種。參數是在調用塊和被調用塊間傳遞的數據。靜態變量和臨時變量是僅供邏輯塊本身使用的數據。表5.1給出了局部數據聲明類型,表中內容的排列順序也是在變量聲明表中聲明變量的順序和變量在內存中的存儲順序。在邏輯塊中不需使用的局部數據類型,可以不必在變量聲明表中聲明。表5.1局部數據類型對于功能塊FB,操作系統為參數及靜態變量分配的存儲空間是背景數據塊。這樣參數變量在背景數據塊中留有運行結果備份。在調用FB時,若沒有提供實參,則功能塊使用背景數據塊中的數值。操作系統在L堆棧中給FB的臨時變量分配存儲空間。對于功能塊FC,操作系統在L堆棧中給FC的臨時變量分配存儲空間。由于沒有背景數據塊,因而FC不能使用靜態變量。輸入、輸出、I/O參數以指向實參的指針形式存儲在操作系統為參數傳遞而保留的額外空間中。對于組織塊OB來說,其調用是由操作系統管理的,用戶不能參與。因此,OB只有定義在L堆棧中的臨時變量。1)形參為保證功能塊對同一類設備控制的通用性,用戶在編程時就不能使用具體設備對應的存儲區地址參數(如不能使用I1.0等),而是使用這類設備的抽象地址參數。這些抽象參數稱為形式參數,簡稱形參。將該設備的相應實際存儲區地址參數(簡稱實參)傳遞給功能塊,功能塊在運行時以實參替代形參,從而可通過調用功能塊實現對具體設備的控制。當對另一設備控制時,同樣也可通過調用實參將其傳遞給功能塊。形參需在功能塊的變量聲明表中定義,實參在調用功能塊時給出。在功能塊的不同調用處,可為形參提供不同的實參,但實參的數據類型必須與形參一致。用戶程序可定義功能塊的輸入值參數或輸出值參數,也可定義一參數作為輸入/輸出值。參數傳遞可將調用塊的信息傳遞給被調用塊,也能把被調用塊的運行結果返回給調用塊。2)靜態變量靜態變量在PLC運行期間始終被存儲。S7將靜態變量定義在背景數據塊中,當被調用塊運行時,能讀出或修改靜態變量;被調用塊運行結束后,靜態變量保留在數據塊中。由于只有功能塊FB有關聯的背景數據塊,因此只能為FB定義靜態變量。功能塊FC不能有靜態變量。3)臨時變量臨時變量僅在邏輯塊運行時有效,邏輯塊結束時存儲臨時變量的內存被操作系統另行分配。S7將臨時變量定義在L堆棧中,L堆棧是為存儲邏輯塊的臨時變量而專設的。當塊程序運行時,在L堆棧中建立該塊的臨時變量,一旦塊執行結束,堆棧重新分配,因而信息丟失。
2.邏輯塊局部數據的數據類型在變量聲明表中,要明確局部數據的數據類型,這樣操作系統才能給變量分配確定的存儲空間。局部數據可以是基本數據類型或復式數據類型,也可以是專門用于參數傳遞的所謂的“參數類型”。參數類型包括定時器、計數器、塊的地址或指針等,見表5.2。表5.2參數類型變量
1)定時器或計數器參數類型在功能塊中定義一個定時器或計數器類型的形參,功能塊就能使用一個定時器或計數器,而不需明確具體的定時器或計數器,等到調用該功能塊時再確定定時器或計數器號。這使用戶程序能靈活性地分配和使用定時器或計數器。當給定時器或計數器參數類型形參分配實參時,在“T”或“C”后跟一個有效整數,如T100。2)塊參數類型當定義一個作為輸入/輸出的塊時,參數聲明決定了塊的類型(FB、FC、DB等)。當為塊參數類型形參分配實參時,可以使用物理地址,如FC101,也可使用符號地址,如“valve”。3)指針參數類型一個指針給出的是變量的地址,而不是變量的數值大小。在有些功能塊中,可能使用指針編程更為方便。用定義指針類型的形參,就能在功能塊中先使用一個虛設的指針,待調用功能塊時再為其賦予確定的地址。當為指針參數類型形參分配實參時,需要指明內存地址,例如P#M50.0。4)ANY參數類型當實參的數據類型不能確定或在功能塊中需要使用變化的數據類型時,可以把形參定義為ANY參數類型。這樣就可以將任何數據類型的實參賦給ANY類形參,而不必像其它類型那樣保證實參、形參類型一致。STEP7自動為ANY類型分配80bit的內存,STEP7用這80bit存儲實參的起始地址、數據類型和長度編碼。例如,功能塊FC100有三個參數(in_par1、in_par2和in_par3),它們都被定義為ANY類型。當功能塊FB10調用功能塊FC100時,FBl0傳遞的可以是一個整數(靜態變量Speed)、一個字(MW100)或數據塊DB10中的雙字(DB10.DBD40)。而當功能塊FB11調用功能塊FC100時,FB11傳遞的可以是一個實數數組(臨時變量Thermo)、一個布爾值(M1.3)或一個定時器(T2)。FB10和FB11分別調用FC100時,傳遞的實參類型完全不同。
3.塊調用過程及內存分配CPU提供塊堆棧(B堆棧)來存儲與處理被中斷塊的有關信息。當發生塊調用或有來自更高優先級的中斷時,就有相關的塊信息存儲在B堆棧里,并影響部分內存和寄存器。圖5.2顯示了調用塊時B堆棧與L堆棧的變化。圖5.3提供了關于STEP7的塊調用情況。圖5.2堆棧與L堆棧圖5.3調用指令對CPU內存的影響a)b)c)1)B堆棧與L堆棧B堆棧是CPU系統內存中的一部分,它存儲以下被中斷塊的數據:(1)塊號、塊類型、優先級、被中斷塊的返回地址;(2)塊寄存器DB、DI被中斷前的內容;(3)臨時變量的指針(被中斷塊的L堆棧地址)。STEP7中可使用的B堆棧大小是有限制的,對于S7-300CPU,則可在B堆棧中存儲8個塊的信息。因此,塊調用嵌套深度也是有限制的,最多可同時激活8個塊。L堆棧是CPU內存中的一部分,它在塊調用時被重新分配。L堆棧用來存儲邏輯塊中定義的臨時變量,也分配給臨時本地數據使用。梯形圖的方塊指令與標準功能塊也可能使用L堆棧存儲運算的中間結果。2)調用功能塊FB當調用功能塊FB時,會有以下事件發生:(1)調用塊的地址和返回位置存儲在塊堆棧中,調用塊的臨時變量壓入L堆棧;(2)數據塊DB寄存器內容與DI寄存器內容交換;(3)新的數據塊地址裝入DI寄存器;(4)被調用塊的實參裝入DB和L堆棧上部;(5)當功能塊FB結束時,先前塊的現場信息從塊堆棧中彈出,臨時變量彈出L堆棧;(6)DB和DI寄存器內容交換。當調用功能塊FB時,STEP7并不一定要求給FB形參賦予實參,除非參數是復式數據類型的I/O形參或參數類型形參。如果沒有給FB形參賦予實參,則功能塊FB就調用背景數據塊內的數值。該數值是在功能塊的變量聲明表內或背景數據塊內設置的形參初始數值。3)調用功能塊FC當調用功能塊FC時會有以下事件發生:(1)功能塊FC實參的指針存到調用塊的L堆棧;(2)調用塊的地址和返回位置存儲在塊堆棧,調用塊的局部數據壓入L堆棧;(3)功能塊存儲臨時變量的L堆棧區被推入L堆棧上部;(4)當被調用功能塊FC結束時,先前塊的信息存儲在塊堆棧中,臨時變量彈出L堆棧。因為功能塊FC不用背景數據塊,不能分配初始數值給功能塊FC的局部數據,所以必須給功能塊FC提供實參。STEP7為功能塊FC提供了一個特殊的返回值輸出參數(關鍵字:RET_VAL)。當在文本文件中創建功能塊FC時,你可以在定義功能塊FC命令后輸入數據類型(如BOOL或INT)。對文本文件進行編譯時,STEP7會自動生成RET_VAL輸出參數。當用STEP7的程序編輯器(ProgramEditor)以增量模式創建功能塊FC時,可在FC的變量聲明表中聲明一個輸出參數RET_VAL,并指明其數據類型。5.1.3功能塊編程與調用舉例對功能塊編程分兩步進行:第一步是定義局部變量(填寫局部變量表);第二步是編寫要執行的程序,可以用梯形圖或語句表兩種形式編程,并在編程過程中使用定義了的局部變量(數據)。定義局部變量的工作內容包括:(1)分別定義形參、靜態變量和臨時變量(FC塊中不包括靜態變量);(2)確定各變量的聲明類型(Decl.)、變量名(Name)和數據類型(DataType),還要為變量設置初始值(InitialValue)(盡管對有些變量初始值不一定有意義)。如果需要還可為變量注釋(Comment)。在增量編程模式下,STEP7將自動產生局部變量地址(Address)。寫功能塊程序時,可以用以下兩種方式使用局部變量:(1)使用變量名,此時變量名前加前綴“#”,以區別于在符號表中定義的符號地址(全局符號則顯示為全局符號加引號的形勢)。增量方式下,前綴會自動產生。(2)直接使用局部變量的地址,這種方式只對背景數據塊和L堆棧有效。在調用FB塊時,要說明其背景數據塊。背景數據塊應在調用前生成,其順序格式與變量聲明表必須保持一致。在增量方式下,調用FB塊時,STEP7會自動提醒并生成背景數據塊。此時也為背景數據塊設置了初始值,該初始值與變量聲明表中的相同。當然也可以為背景數據塊設置當前值(CurrentValue),即存儲在CPU中的數值。1.發動機控制系統的用戶程序結構在右圖中組織塊OB1是主程序,用一個名為:“發動機控制”的功能塊FB1來分別控制汽油機和柴油機,控制的參數在背景數據塊DB1和DB2中。風扇控制使用功能FC1。(1)符號表為了使程序易于理解,可以給變量制定符號。(2)變量聲明表(3)局域變量的類型柴油機達到設定轉速 Q5.5 BOOL柴油機風扇運行 Q5.6 BOOL柴油機風扇運行延時 T2 TIMER柴油機故障 I1.6 BOOL柴油機數據 DB2 FB1柴油機運行 Q5.4 BOOL柴油機轉速 MW4 INT發動機控制 FB1 FB1風扇控制 FC1 FC1共享數據 DB3 DB3關閉柴油機 I1.5 BOOL關閉汽油機 I1.1 BOOL啟動柴油機 I1.4 BOOL啟動汽油機 I1.0 BOOL汽油機達到設定轉速 Q5.1 BOOL汽油機風扇延時 T1 TIMER汽油機風扇運行 Q5.2 BOOL汽油機故障 I1.2 BOOL汽油機數據 DB1 FB1汽油機運行 Q5.0 BOOL汽油機轉速 MW2 INT手動按鈕 I0.6 BOOL主程序 OB1 OB1自動按鈕 I0.5 BOOL自動模式 Q4.2 BOOL符號地址類型FB1:控制發動機的功能塊FC1
2.二分頻器假設功能塊FC1是二分頻器產生程序,功能是對不同的輸入位進行二分頻處理。以下給出了FC1的變量聲明表和程序。1)FC1的變量聲明表(見表5.3)表5.3FC1的變量聲明表FC1梯形圖程序OB1調用梯形圖程序
3.讀模擬輸入量程序一些S7-300的應用系統中,使用8通道模擬量模塊采集信號,當模塊數量較多時,讀模擬輸入量就很繁瑣。下面給出一個通用程序FC100,利用它可以方便地把模擬量讀回并順序存入數據塊,因為模入模塊的起始地址、通道數、存儲數據塊號及數據在數據塊中的存儲起始位置均是可變的,所以可在調用FC100時靈活確定。1)FC100的變量聲明表(見表5.4)表5.4FC100的變量聲明表Network1L #DB_NoT LW0OPN DB[LW0] //打開存儲數據塊L #PIW_AddrSLD 3 //形成模入模塊地址指針T LD4 //在臨時本地數據雙字LD4中存儲模入模塊地址指針L #DBW_AddrSLD 3 //形成數據塊存儲地址指針T LD8//在臨時本地數據雙字LD8中存入數據塊存儲地址指針L #CH_LEN//以要讀入的通道數為循環次數,裝入累加器1//將累加器1的值,裝入循環次數計數器LW0(臨時本地數據字)L LD4LARl //將模入模塊地址指針裝入地址寄存器1L PIW[ARl,P#0.0]//讀模入模塊裝入累加器1T LW2 //將累加器1的內容暫存入緩沖器LW2L LD8LARl //將數據塊存儲地址指針裝入地址寄存器1L LW2 //將數據緩沖器中的內容裝入累加器1T DBW[ARl,P#0.0] //將累加器的內容存入數據塊中L LD4 //AR1+P#2.0→AR1+ L#16//ACC1+(.._0001_0000)T LD4//調整模入模塊地址指針,指向下一通道Acc1+(bbbbbbbxxx)L LD8+ L#16T LD8 //調整數據塊存儲地址指針,指向下一存儲地址L LW0//將循環次數計數器LW0的值裝入累加器1LOOPNEXT//若累加器1的值不為0,將累加器減1繼續循環;若累加//器為0,則結束NEXT:TLW0在FC100中,寄存器間接尋址指令OPNDB[LW0]使用了臨時本地數據LW0,變量表中定義的臨時變量雖然也在L堆棧中,但不能用于存儲器間接尋址,從這里也可看出臨時本地數據與臨時變量的區別。程序中LW2、LD4和LD8起的作用也可用臨時變量替代。下面舉例說明如何使用FC100。在某應用中,機架0的4號槽位安裝了一個8模入模塊(地址256開始),若要將前6個模入模塊信號讀回,存入DB50.DBW10開始的6個字單元中,可按下列形式調用FC100:CALLFC100PIW_Add:= 256CH_LEN:= 6DB_No:= 50DBW_Addr:= 104.時鐘脈沖發生器使用定時器實現自由設定時鐘脈沖發生器功能(脈沖占空系數1:1)。(1)FC1變量聲明表
(2)FC1梯形圖程序(3)OB1調用梯形圖程序5.2數據塊與數據結構5.2.1數據塊數據塊定義在S7CPU存儲器中,用戶可在存儲器中建立一個或多個數據塊。每個數據塊可大可小,但CPU對數據塊數量及數據總量有限制,如對于CPU314,用作數據塊的存儲器最多為8KB(8192B),用戶定義的數據總量不能超出這個限制。對數據塊必須遵循先定義后使用的原則,否則,將造成系統錯誤。
1.定義數據塊在編程階段和運行程序中都能定義數據塊。大多數數據塊是在編程階段用STEP7開發軟件包定義的,定義內容包括數據塊號及塊中的變量(包括變量符號名、數據類型以及初始值等),定義完成后,數據塊中變量的順序及類型決定了數據塊的數據結構,變量的數量決定了數據塊的大小。數據塊在使用前,必須作為用戶程序的一部分下載到CPU中。如果確實需要,還可以在程序運行中動態定義一個數據塊。動態定義時,數據塊號是自動產生的,數據塊在存儲器中的位置是動態分配的。由于要定義的數據塊有可能大于CPU存儲器(用于數據塊的部分)的剩余空間,因此動態定義過程有可能失敗。
2.訪問數據塊在用戶程序中可能定義了許多數據塊,而每個數據塊中又有許多不同類型的數據,因此,訪問時需要明確數據塊號和數據塊中的數據類型與位置。根據明確數據塊號的不同方法,可以用多種方法訪問數據塊中的數據。直接在訪問指令中寫明數據塊號,如:LDB5.DBW10TDB10.DBW20LMotor_1.Speed//符號地址另一種方法是“先打開后訪問”。在訪問某數據塊中的數據前,先“打開”這個數據塊,也就是將數據塊號(數據塊的起始地址)裝入數據塊寄存器。這樣,存放在數據塊中的數據就可利用數據塊起始地址加偏移量的方法來訪問。如:OPN DB5L DBW10OPNDB10TDBW20在打開一個數據塊時,先打開的數據塊會自動關閉(沒有專門的數據塊關閉指令)。由于有兩個數據塊寄存器(DB和DI寄存器),因此,最多可同時打開兩個數據塊。一個作為背景數據塊,數據塊的起始地址存儲在DI寄存器中;另一個作為共享數據塊,數據塊的起始地址存儲在DB寄存器中。打開背景數據塊,在調用FB時可以自動實現。由于調用FB時使用DI寄存器,因此,一般不在FB程序中用OPNDIn指令打開數據塊。
3.背景數據塊和共享數據塊背景數據塊和共享數據塊有不同的用途。任何FB、FC或OB均可讀寫存放在共享數據塊中的數據。背景數據塊是FB運行時的工作存儲區,它存放FB的部分運行變量。調用FB時,必須指定一個相關的背景數據塊。作為規則,只有FB塊才能訪問存放在背景數據塊中的數據。一般情況下,每個FB都有一個對應的背景數據塊,一個FB也可以使用不同的背景數據塊。如果幾個FB需要的背景數據完全相同,為節省存儲器,則可以定義成一個背景數據塊,供它們分別使用。通過多重背景數據,也可將幾個FB需要的不同的背景數據定義在一個背景數據塊中,以優化數據管理。各數據塊在CPU的存儲器中是沒有區別的,只是由于打開方式不同,才在打開時有背景數據塊和共享數據塊之分。原則上,任何一個數據塊都可以當作共享數據塊或背景數據塊使用,實際上,一個數據塊由FB當作背景數據塊使用時,必須與FB的要求格式相符。4.多重背景數據塊在用戶程序中使用多重背景可以減少背景數據塊的數量。以發動機控制程序為例,原來FB1控制汽油機和柴油機時,分別使用了背景數據塊DB1和DB2。使用多重背景時只需要一個背景數據塊DB10,但是需要增加一個功能塊F10來調用作為“局域背景”的FB1,FB1的數據存儲在FB10的背景數據塊DB10中,DB10是自動生成的。不需要給FB1分配背景數據塊。但需要在FB10的變量生命表中聲明靜態局域數據(STAT)FB1。多重背景的程序結構如下:FB10變量聲明表OB1中調用多重背景5.2.2數據結構STEP7數據塊中的數據結構形式比較豐富,數據塊中的數據既可以是基本數據類型,又可以是復式數據類型。所謂復式數據類型,是指位數超過32位的數據或由其它數據類型構成的數據組。基本數據類型在第4章中已有過介紹,本節專門說明復式數據類型。STEP7允許4種復式數據類型,如表5.5所示。表5.5復式數據類型另一種復式數據類型稱為“用戶數據類型(UDT)”,它是利用STEP7“程序編輯器”產生的,可命名構造。將大量數據組織到UDT中,在生成數據塊或在變量聲明表中聲明變量時將變得更加方便。用戶還可為UDT聲明符號名。日期-時間數據類型的名稱、位數及格式是由操作系統定義的,用戶不可改變,并且該類型在S7-300中必須用標準功能塊SFC才能訪問。其它復式數據類型則由用戶在邏輯塊變量聲明表或數據塊中定義。
1.數組一個數組將同種數據類型組合成整體,但不能建立數組的數組。圖5.4表示一個二維整數數組。數組的符號名是“Op_temps”,用符號名加下標可訪問數組中的數據。以圖5.4為例,第一個整數是Op_temps[1,1],第三個為Op_temps[l,3],第四個為Op_temps[2,1],第六個為Op_temps[2,3]。圖5.4多維數組的存儲結構
1)建立數組在數據塊或變量聲明表中可定義數組。在聲明數組時,首先給數組命名,接著使用關鍵字(ARRAY),然后在方括號中給出數組的大小及維數。可以定義多達6維的數組,并用下標來標識數組的大小。在方括號中放下標,各維之間用逗號隔開,每一維的首尾之間用雙點隔開。一個下標可以為任何一個整數值(范圍:-32768~+32767),并包括負數。如用ARRAY[1‥3,1‥2,1‥3,-2‥3,30‥32,1‥4]來定義變量Op_temps為6維數組。該數組的第一個整數為Op_temps[1,1,1,-2,30,1];最后一個為Op_temps[3,2,3,3,32,4]。圖5.5顯示了建立名字為Heat_2×3的二維數組(與圖5.4中的數組相似)。圖5.5建立數組2)賦初始值在建立數組時,STEP7允許以兩種方法給數組的元素賦初始值。對圖5.5中的數組,可以為6個元素賦初始值:17,23,-45,556,3342,0;若初始值中有順序相同的元素,寫法可以簡化,如要數組的頭兩個元素設特定數值,其余4個為10,則可簡寫為17,23,4(10),其中4為重復系數,10為要重復的數值。3)訪問數組利用數組中指定元素的下標可以訪問數組數據,這時數據塊、數組符號名及下標一起使用。如圖5.5中聲明的數組在DB20(符號名:MOTOR)的第一個字節處開始,用以下地址訪問數組中的第二個元素: MOTOR.Heat_2×3[1,2]4)利用數組傳遞參數將數組作為參數傳遞時,要求形式參數和實際參數必須有同樣的數據組織結構、相同的數據類型,并按相同的順序排列。
2.構造構造將不同數據類型組合成一個整體,見圖5.6。構造的元素可以是任何基本數據類型或復式數據類型,有數組或構造元素的構造能嵌套8層。因此,STEP7允許用戶將過程中的各種關聯數據統一組織在一個構造中,也為統一處理不同類型數據或參數提供了可能性。圖5.6構造的存儲結構1)建立構造構造(STRUCT)只能在數據塊或變量聲明表中定義。圖5.7所示為由整數(存放數量)、字節(存放原始數據)、字符(存放控制碼)、浮點數(存放溫度)、布爾數(完成標志信號)組成的構造。該構造的名稱為Stack_1。圖5.7建立構造Stack_l2)賦初始值按每個元素的類型和名稱給構造的每個元素賦初始值。并將其寫入圖5.8中InitialValue(初始值欄)的相應行中。例如,可以分配如下初始值:Amount=0Original_data=B#l6#0Control_code=“Z”Temperature=98.6End:=FALSE3)訪問構造(1)用符號地址訪問:如MOTO.Stack_1.Temperature,其中,MOTO為構造所在數據塊DB20的符號名。(2)用物理地址訪問:如Stack_l從DB20的字節0開始存放,Amount的物理地址是DB20.DBW0,Temperature的地址為DB20.DBD4。4)利用構造傳遞參數構造可以作為參數來傳遞。將構造作為參數傳遞時,要求形式參數和實際參數必須有同樣的數據組織結構、相同的數據類型,并按相同的順序排列。
3.用戶數據類型STEP7允許將基本數據類型或復式數據類型組合成用戶自己定義的數據類型,這種類型稱為用戶數據類型或UDT。用戶數據類型必須首先單獨建立,并存放在稱為UDT的特殊數據塊中,見圖5.8。圖5.8是用“程序編輯器”建立的一個UDT,其數據組織結構與圖5.7相同,該用戶數據類型被定義為UDT200,并單獨存儲在被稱為UDT200的特殊塊中。也可以為UDT200建立符號名(如process_data),但是,命名只能在符號表中進行。圖5.9給出了一個使用UDT定義數據塊(如DBl0)的例子,數據塊DBl0中定義兩個變量,一個為整型,另一個為用戶數據類型(UDT200)。從圖中可以看出,數據塊中UDT的用法與基本數據類型的用法類似。圖5.8建立用戶數據類型(UDT200)圖5.9使用UDT用符號地址或物理地址兩種方式可以訪問UDT中的變量。例如,在DB10中定義了圖5.9格式的數據,DB10的符號名為Process,訪問Amount變量可分別寫為DB10.DBW2或Process.Stack_2.Amount。建立用戶數據類型的目的是為了將UDT作為一種數據類型使用,以方便定義多個結構相同的構造變量。圖5.9建立的Stack_2與圖5.7建立的Stack_1相比,不僅大小結構完全相同,而且對Stack_1和Stack_2中元素的訪問方法也完全相同。在建立DB10時,由于使用了UDT而使得數據塊建立過程方便快捷。在多處使用同樣的UDT時,這一優點將更加突出。5.3S7系列PLC程序設計5.3.1程序結構設計STEP7不僅從不同層次充分支持合理的程序結構設計,而且也簡化了結構設計的復雜程度。一個復雜的自動化過程可以被分解并定義為一個或多個項目(PROJECT);而對于每個項目,又可以進一步分解并定義給一個或多個CPU,每個CPU都有一個控制程序(CPU_PROGRAM)。圖5.10顯示了一個樣本過程,它分成4個不同的項目:項目1和項目2只有一個CPU,而項目3和項目4有多個CPU。這樣,一個很復雜的控制任務的結構設計,就被簡化為各個CPU程序的結構設計。項目間或項目中的各CPU程序之間,能以某種方式聯網,實現信息共享。如在S7協議支持下,用MPI網以全局數據通信的方式可方便地建立起聯系,實現一個項目中各CPU共享信息。圖5.10樣本過程的項目劃分典型的情況是一個過程控制任務只有一個項目,該項目下也僅有一個CPU程序,每一個CPU程序又可依據時間特性或事件觸發特性的差異分類編入不同的組織塊(OB)中。例如,需要以固定時間間隔循環執行的那部分程序編入組織塊OB35中,為PLC正常運行而需進行初始化的程序編入組織塊OBl00中。又如,由硬件觸發的中斷服務程序編入組織塊OB40中,對程序執行中產生的同步錯誤的響應處理程序編入組織塊OB121或OB122中。對于各組織塊中的程序,可以根據其復雜程度分別選用線性、分部或結構化等三種形式中的一種程序結構。由于組織塊OB1(主程序循環)中的程序是應用程序中主要的也是最復雜的部分,因此,對OB1中的程序設計合理的結構是十分重要的。下面分別說明三種典型結構的特點及選用原則。
1.線性程序結構用“線性”結構設計的程序連續放置在一個塊內(通常為OB1),塊中的程序按順序執行。這一結構是最初的PLC模擬的繼電器梯形邏輯的模型。線性程序具有簡單、直接的特點。編程時,不必考慮功能塊如何編程及如何調用,也不必考慮如何定義局部變量及如何使用背景數據塊。由于所有的指令在一個塊內,因此它適用于只需一個人編寫的、相對簡單的控制程序。
2.分部程序結構這是一種部分模塊化的程序結構,也稱為部分結構化。程序被分成各部分放在若干功能塊中,每個功能塊含有用于一種設備的一系列控制邏輯。放置在組織塊OB1中的指令決定控制程序的各功能塊的執行。比如說,一個分部程序可能包含以下內容:(1)用于控制設備每一部分的FC;(2)用于控制設備每一工作狀態的FC;(3)用于控制操作員接口的FC;(4)用于進行PLC自診斷的FC。在分部程序中,既無數據交換也沒有重復利用的程序代碼。各功能塊收集并使用自己的數據,功能塊不傳遞也不接收參數,功能塊的編程與調用比較簡單。由于每個功能區分為不同的塊,因而使得多個程序員能夠同時編程而不發生沖突。分部程序結構的編程效率比線性程序有所提高,程序測試也較方便,對程序員的要求也不太高。對不太復雜的控制程序可考慮采用這種程序結構。
3.結構化程序結構完全結構化(模塊化)的程序結構是PLC程序設計和編程最有效的結構形式,它可用于復雜程度高、程序規模大的控制應用程序設計。結構化程序可以重復使用某些功能塊,只需要在使用功能塊時為其提供不同的環境變量(實參),就能完成對不同設備的控制。例如,在工業攪拌控制過程中有三臺泵,對它們的控制功能相似,可以編寫一個用于對泵進行控制的功能塊,編程時先定義泵控制所需的變量(形參),并使用這些變量構成一個稱為“泵控制”的一般功能塊。在調用該功能塊時,通過改變傳入功能塊中的參數(實參),可以分別對成分A、成分B和攪拌桶中的三臺泵進行控制。結構化程序有最高的編程和程序調試效率,應用程序代碼量也最小。結構化程序也支持多個程序員協同編程。這種程序結構建立在對PLC系統功能的合理分析、分解及綜合的基礎之上,程序具體結構形式的確定與程序設計人員的水平及經驗關系很大,對程序員的要求也較前兩種高。5.3.2程序設計實例圖5.11工業攪拌過程示意圖
1.將過程分割為任務和區域一個自動化過程包括許多單個的任務,通過識別一個過程內的相關任務組,然后將這些組再分解為更小的任務,即使最復雜的過程也能夠被定義。下面將這個工業攪拌過程構造為四個功能區域:配料A區域、配料B區域、混合罐區域和排料區域。
2.說明各個功能區域1)配料A和配料B區域(1)每種配料的管道都配備有一個入口和一個進料閥以及進料泵。(2)進料管還有流量傳感器。(3)當罐的液面傳感器指示罐滿時,進料泵的接通必須被鎖定。(4)當排料閥打開時,進料泵的啟動必須被鎖定。(5)在啟動進料泵后1s內必須打開入口閥和進料閥。(6)在進料泵停止后(來自流量傳感器的信號)閥門必須立即被關閉以防止配料從泵中泄露。(7)進料泵的啟動與一個時間監控功能相結合,換句話說,在泵啟動后的7s之內,流量傳感器會報告溢出。(8)當進料泵運行時,如果流量傳感器沒有流量信號,進料泵必須盡可能快地斷開。(9)必須對進料泵啟動的次數進行計數(維護間隔)。2)混合罐區域(1)當罐的液面傳感器指示“液面低于最低限”或排料閥打開時,攪拌電機的啟動必須被鎖定。(2)攪拌電機在達到額定速度時要發出一個響應信號。如果在電機啟動后10s內還未接收到該信號,則電機必須被斷開。(3)必須對攪拌電機的啟動次數進行計數(維護間隔)。(4)在混合罐中必須安裝三個傳感器。①罐裝滿:一個常閉觸點。當達到罐的最高液面時,該觸點斷開。②罐中液面高于最低限:一個常開觸點。如果達到最低限,該觸點關閉。③罐非空:一個常開觸點,如果罐不空,該觸點閉合。3)排料區域(1)罐內產品的排出由一個螺線管閥門控制。(2)這個螺線管閥門由操作員控制,但是最遲在“罐空”信號產生時,該閥必須被關閉。(3)當攪拌電機在工作或罐空時打開排料閥必須被鎖定。
3.定義邏輯塊通過程序塊可以將用戶程序分布到不同的塊中并建立塊調用的分層結構來組織程序。本例中用戶程序主要由組織塊OB1、功能塊FB1、功能FC1及三個數據塊DB1~DB3組成。圖5.12所示為結構化編程的塊的分層調用結構。圖5.12工業攪拌過程的分層調用結構圖(1)OB1:與CPU操作系統的接口,包含主要程序。在OBl中調用塊FBl和FCl并傳送控制過程所需的特定參數。(2)FB1:用于配料A的進料泵、配料B的進料泵和攪拌電機的控制。由于要求一致(接通、斷開、計數應用程序等),可以通過同一個功能塊實現。(3)背景DB1~DB3:用于控制配料A、配料B的進料泵和攪拌電機的實參及靜態數據各不相同,因此分別存儲在與FBl相關的三個背景DB中。(4)FC1:用于閥的控制。配料A和B的入口閥和進料閥以及排料閥共同使用本邏輯塊。
4.指定符號名如果在用戶程序中使用了符號,則必須用STEP7在符號表中對這些符號進行定義。表5.6所示為所用的程序組件的符號名及絕對地址。表5.6程序組件的符號名及絕對地址表5.6程序組件的符號名及絕對地址續表
5.生成電機的FB電機的FB包括以下邏輯功能:(1)啟動和停止輸入。(2)允許設備操作的一系列互鎖(泵和攪拌電機)。互鎖狀態存儲在OB1的臨時局域數據(L堆棧)中(“Motor_enable”和“Valve_enable”),并且當電機的FB被處理時與啟動和停止的輸入進行邏輯組合。(3)來自設備的反饋必須在一個特定的時間內出現,否則就假定有故障或錯誤出現,并使電機停止。(4)時間點和響應時間或錯誤/故障循環持續時間都必須被指定。(5)如果啟動按鈕被按下并且電機被使能,則設備自行接通并運行直至按下停機按鈕。(6)當設備接通時,一個定時器啟動運行,如果在定時器的時間到達之前未接到來自設備的響應信號,則停機。圖5.13電機通用FB的輸入和輸出示意圖StartStopTimer_NoMotorMotorFaultStart_DspStop_DspMaintResponseReset_MaintResponse_Time在STEP7中,每一個被不同的塊調用的塊一定要在調用它的塊之前生成,因此在樣板程序中必須在OBl之前先生成電機的FB。STL編程語言的FBl程序部分如下:Networkl啟動/停止和鎖存A(O#StartO#Motor)AN#Stop=#Motor()#START#STOP#MOTOR#MOTORNetwork2啟動監控A#MotorL#Response_TimeSD#TimerNoNetwork3AN#MotorR#TimerNoNetwork4A#TimerNoAN#ResponseS#FaultR#Motor(SD)#MOTOR#TimerNo#Response_Time(S)#Fault#Motor#TimerNo#Response(R)啟動監控定時器監控時間到且沒有反應則故障指示燈亮,停止電動機(R)#MOTOR#TimerNoNetwork5啟動指示燈和故障復位A#Response=#Start_DspR#FaultNetwork6斷開指示燈AN#Response=#Stop_Dsp()(R)#Response#Start_Dsp#Fault()#Response#Stop_DspNetwork7啟動計數A#MotorFP#Start_EdgeJCNlab1L#Starts+1T#Startslab1:NOP0Network8維護指示燈L#StartsL50>=I=#Maint(P)#Motor#Start_Edge#Starts1#StartsENIN1IN2OUTENOADD_ICMP>=IIN1IN2()#Starts50#Maint電動機啟動次數記錄電動機啟動次數超過50次則維護指示燈亮Network9復位累計啟動次數的計數器A#Reset_MaintA#MaintJCNENDL0T#StartsEND:NOP0MOVEENINENOOUTW#16#0#Reset_Maint#Maint#Starts
6.生成閥門FC入口和進料閥以及排料閥的功能包含以下邏輯功能:(1)一個用于打開閥門的輸入,一個用于關閉閥門的輸入。(2)互鎖允許閥門被打開。互鎖狀態存儲在OB1的臨時局域數據(L堆棧)中(“Valve_enable”),并且在閥門的FC被處理時與打開和關閉的輸入進行邏輯組合。圖5.14閥門的通用FC的輸入和輸出示意圖OpenCloseValveDsp_OpenDsp_ClosedValve由于被調用的塊必須在調用塊之前生成,因此閥門的FCl功能必須在OB1之前生成。STL編程語言的FCl程序部分如下:Networkl打開/關閉和鎖存A(O#OpenO#Valve)AN#Close=#ValveNetwork2顯示“閥門打開”A#Valve=#Dsp_OpenNetwork3顯示“閥門關閉”AN#Valve=#DSp_Closed()#Open#Valve#Close#Valve()()#Valve#Dsp_Open#Valve#DSp_Closed
7.生成OB1OB1決定用戶程序的結構,也包含要傳送給各個功能的參數。例如:(1)為進料泵和攪拌電機而編制的STL段中為電機FB提供啟動(“Start”)、停止(“Stop”),響應(“Response”)以及復位維護顯示(“Reset_Maint”)的輸入參數。PLC的每一個循環周期都會處理這個電機的FB。(2)如果電機的FB被處理,則輸入Timer_No和Response_Time指示所使用的定時器功能以及要測量的時間。(3)因為閥門的FC和電機的FB是在OB1中調用的,所以它們在每個程序循環都會被可編程序控制器處理。程序為處理進料泵和攪拌電機的控制任務,使用電機的FB時分別配備了不同的背景DB。OB1組織塊的臨時(局域)變量定義Enable_Value:使能閥門變量Start_Fulfilled:電動機信號使能變量Stop_Fulfilled:停止電動機信號使能變量Close_Value_Fulfilled關閉閥門信號使能變量OB1:主程序()Network1進料泵的互鎖:在混合罐未滿且排料閥未開前提下()Network2使能進料泵A啟動()Network3使能進料泵A停止“EMER_STOP_off”“Tank_below_max”“Drain”#Enable_Motor“Feed_pump_A_Start”#Enable_Motor#Start_Fulfilled“Feed_Pump_A_Stop”#Enable_Motor#Stop_FulfilledNetwork4配料A進料泵A,調用DB1FB1ENStartStopResponseReset_MaintTimer_NoResponse_TimeMotorENOFaultStart_DspStop_DspMaintDB1#StartFulfilled#Stop_Fulfilled“Flow_A”“Reset_maint”T12S5T#7S“Feed_pump_A”“Feed_pump_A_fault”“Feed_pump_A_on”“Feed_pump_A_off”“Feed_pump_A_maint”(SD)Network5進料泵打開1S后,使能閥門打開()Network7使能閥關閉(停止進料后)()Network6“Feed_pump_A”T13S5T#1ST13#Enable_Valve
“Flow_A”“Feed_pump_A”#Close_Valve_FulfilledFC1ENOpenCloseValueENOOpen_DspClose_DspFC1ENOpenCloseValueENOOpen_DspClose_DspNetwork8配料A入口閥控制Network9配料A進料閥控制#Enable_Valve#Close_Valve_FulfilledInlet_Valve_A”#Inlet_Valve_A_Open#Inlet_Valve_A_Closed#Enable_Valve#Close_Valve_Fulfilled#Feed_Valve_A_Open#Feed_Valve_A_Closed“Feed_Valve_A”()Network10使能進料泵B的啟動()Network11使能進料泵B的停止“Feed_pump_B_Start”#Enable_Motor#Start_Fulfilled“Feed_Pump_B_Stop”#Enable_Motor#Stop_FulfilledNetwork12配料B進料泵,調用DB2FB1ENStartStopResponseReset_MaintTimer_NoResponse_TimeMotorENOFaultStart_DspStop_DspMaintDB2#StartFulfilled#Stop_Fulfilled“Flow_B”“Reset_maint”T14S5T#7S“Feed_pump_B_fault”“Feed_pump_B_on”“Feed_pump_B_off”“Feed_pump_B_maint”“Feed_pump_B”(SD)Network13進料泵B打開1S之后,使能閥打開()Network15使能閥門關閉(停止進料后)()Network14“Feed_pump_B”T15S5T#1ST15#Enable_Valve“Flow_B”“Feed_pump_B”#Close_Valve_FulfilledFC1ENOpenCloseValueENOOpen_DspClose_DspFC1ENOpenCloseValueENOOpen_DspClose_DspNetwork16配料B入口閥控制Network17配料B進料閥控制#Enable_Valve#Close_Valve_Fulfilled#Inlet_Valve_B_Open#Inlet_Valve_B_Closed“Inlet_Valve_B”#Enable_Valve#Close_Valve_Fulfilled#Feed_Valve_B_Open#Feed_Valve_B_Closed“Feed_Valve_B”()Network18攪拌器互鎖:在混合罐液面高于最低限且排料閥未開前提下()Network19使能攪拌器的啟動()Network20使能攪拌器的停止“EMER_STOP_off”“Tank_above_min”“Drain”#Enable_Motor“Agitator_start”#Enable_Motor#Start_Fullfilled“Agitator_stop”#Enable_Motor#Stop_FulfilledNetwork21攪拌器FB,調用DB3FB1ENStartStopResponseReset_MaintTimer_NoResponse_TimeMotorENOFaultStart_DspStop_DspMaintDB3#Start_Fulfilled#Stop_Fulfilled“Agitator_running”“Reset_maint”T16S5T#10S“Agitator_fault”“Agitator_on”“Agitator_off”“Agitator_maint”“Agitator”()Network22排料泵互鎖:在混合罐不空且攪拌器不工作的前提下()Network23使能排料閥打開()Network24使能排料閥關閉“EMER_STOP_off”“Tank_not_empty”“Agitator”“Drain_open”#Enable_Valve#Open_Drain“Drain_Closed”#Enable_Valve
#Close_Drain#Enable_ValveFC1ENOpenCloseValueENOOpen_DspClose_DspNetwork25排料閥FC控制#Open_Drain#Close_Drain#Drain_open_disp#Drain_closed_disp“Drain”()Network26混合罐液面滿顯示()Network27混合罐液面低于最低限()Network28混合罐空顯示“Tank_below_max”“Tank_max_disp”“Tank_min_disp”“TankmindiSp”“Tank_not_empty”“Tank_empty_disp”
Network1進料泵A的互鎖A “EMER_STOP_off”A “Tank_below_max”AN “Drain”= #Enable_MotorNetwork2為配料A調用電機的FBA “Feed_pump_A_Start”A #Enable_Motor= #Start_FulfilledA(O “Feed_Pump_A_Stop”ON #Enable_Motor)= #Stop_FulfilledCALL “Motor_block”,“DB_feed_pump_A”Start :=#StartFulfilledStop :=#Stop_FulfilledResponse:=“Flow_A”Reset_Maint:=“Reset_maint”Timer_No:=T12Reponse_Time:=S5T#7SFault:=“Feed_pump_A_fault”Start_Dsp :=“Feed_pump_A_on”Stop_Dsp :=“Feed_pump_A_off”Maint:=“Feed_pump_A_maint”Motor:=“Feed_pump_A”Network3延遲配料A的閥使能A “Feed_pump_A”L S5T#1SSD T13AN “Feed_pump_A”R T13A T13= #Enable_ValveNetwork4配料A的入口閥控制AN “Flow_A”AN “Feed_pump_A”= #Close_Valve_FulfilledCALL“Valve_block”Open:=#Enable_ValveClose:=#Close_Valve_FulfilledDsp_Open:=#Inlet_Valve_A_OpenDspClosed:=#Inlet_Valve_A_ClosedValve:=“Inlet_Valve_A”Network5配料A的進料閥控制AN “Flow_A”AN “Feed_pump_A”=#Close_Valve_FulfilledCALL“Valve_block”Open:=#Enable_ValveClose:=#Close_Valve_FulfilledDsp_Open:=#Feed_Valve_A_OpenDspClosed:=#Feed_Valve_A_ClosedValve:=“Feed_Valve_A”Network6進料泵B的互鎖A “EMER_STOP_off”A “Tank_below_max”AN “Drain”= #Enable_MotorNetwork7為配料B調用電機的FBA “Feed_pump_B_Start”A #Enable_Motor= #Start_FulfilledA(O “Feed_Pump_B_Stop”ON #Enable_Motor)=#Stop_FulfilledCALL“Motor_block”,“DB_feed_pump_A”Start:=#StartFulfilledStop:=#Stop_FulfilledResponse:=“Flow_B”Reset_Maint:=“Reset_maint”Timer_No:=T14Reponse_Time:=S5T#7SFault:=“Feed_pump_B_fault”Start_Dsp:=“Feed_pump_B_on”Stop_Dsp:=“Feed_pump_B_off”Maint:=“Feed_pump_B_maint”Motor:=“Feed_pump_B”Net
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 薯類批發商市場供需分析考核試卷
- 貿易代理國際市場進入與擴張策略考核試卷
- 集成服務在智能電網分布式能源管理的實現考核試卷
- 拍賣行拍賣業務智能化發展路徑考核試卷
- 熱扎帶剛車間設計
- 麻醉科無痛技術臨床應用與發展
- 寓言故事匯報展示
- 服裝設計產品開發全流程
- Siphonaxanthin-生命科學試劑-MCE
- Anticonvulsant-agent-10-生命科學試劑-MCE
- 公司企業實習鑒定表格
- 大學畢業生離校退宿申請表模板
- 檔案館建設標準
- 華中科技大學官方信紙4
- 交通運輸企業安全生產隱患排查清單
- DB22∕T 2862-2018 林木種子園營建技術規程
- 化工進展稿件編輯、排版體例格式
- 部編版四年級語文下冊期末調研測試卷(江蘇南京江寧區2021春真卷)
- 外國美術史PPT現實主義
- 手術室醫院感染風險評估與采取措施
- 房屋建筑學復習題最新版本
評論
0/150
提交評論