PLC結(jié)構(gòu)化編程是對(duì)應(yīng)于典型的控制要求,將過(guò)程要求中的類似或相關(guān)的任務(wù)歸類,在功能或功能塊中編寫(xiě)通用的程序塊,這些程序塊可以反復(fù)被調(diào)用,以控制不同的目標(biāo),形成通用的解決方案。這些的通用的程序塊就稱為結(jié)構(gòu),利用各種結(jié)構(gòu)組成程序就稱為結(jié)構(gòu)化編程。可以通過(guò)不同的參數(shù)調(diào)用相同的功能或通過(guò)不同的背景數(shù)據(jù)塊調(diào)用相同的功能塊。結(jié)構(gòu)化編程過(guò)程中通用的數(shù)據(jù)和代碼可以共享,其特點(diǎn)是,編寫(xiě)通用程序塊,對(duì)不同的控制任務(wù)代入不同的地址和數(shù)據(jù),使更多的控制任務(wù)可以使用此通用程序塊,因此具有很高的編程和編程調(diào)試效率,并且編程結(jié)構(gòu)清晰,適合于復(fù)雜的控制任務(wù)。

在塊調(diào)用時(shí),調(diào)用者可以是各種邏輯塊,包括用戶編寫(xiě)的組織塊(OB)、FB、FC和系統(tǒng)提供的SFB和SFC,被調(diào)用的塊是除OB1外的所有邏輯塊。調(diào)用功能塊時(shí)需要為其指定一個(gè)背景數(shù)據(jù)塊,背景數(shù)據(jù)塊在功能塊調(diào)用的同時(shí)被打開(kāi),在調(diào)用結(jié)束時(shí)被關(guān)閉。
在給功能塊編程時(shí)使用的是形參,調(diào)用它時(shí)需要使用實(shí)參來(lái)為形參賦值。在一個(gè)項(xiàng)目中,可以多次調(diào)用同一個(gè)塊,如在調(diào)用控制電動(dòng)機(jī)的塊時(shí),將不同的實(shí)參賦值給形參,就可以實(shí)現(xiàn)對(duì)類似但不完全相同的被控對(duì)象(如直流電動(dòng)機(jī)和交流電動(dòng)機(jī))的控制。
塊及子程序的調(diào)用,可以嵌套調(diào)用,即被調(diào)用的塊同時(shí)還可以調(diào)用其他的塊。嵌套調(diào)用的嵌套深度與CPU的型號(hào)相關(guān)。
嵌套調(diào)用的深度同時(shí)還與局部數(shù)據(jù)堆棧(L堆棧)有關(guān)。每個(gè)OB需要至少20 B的L內(nèi)存。當(dāng)塊A調(diào)用塊B時(shí),塊A的臨時(shí)變量將被壓入L堆棧進(jìn)行現(xiàn)場(chǎng)保護(hù)。
程序被分為不同的邏輯塊,每個(gè)塊包含了完成部分控制任務(wù)所需的邏輯指令。組織塊OB1(主程序)中的指令決定在什么情況下調(diào)用哪一個(gè)塊,功能和功能塊(子程序)用來(lái)完成不同的過(guò)程任務(wù)。被調(diào)用的塊執(zhí)行完后,返回到OB的調(diào)用點(diǎn),繼續(xù)執(zhí)行OB1。模塊化編程,將一個(gè)較大的程序分成若干塊,易于實(shí)現(xiàn)多人同時(shí)對(duì)一個(gè)項(xiàng)目編程。由于只在需要時(shí)執(zhí)行相關(guān)的指令,因此提高了CPU的執(zhí)行效率。
線性化編程是將整個(gè)系統(tǒng)的控制程序放在主循環(huán)控制組織塊OB1(主程序)中,每一次循環(huán)掃描都要不斷地順序執(zhí)行OB1中的全部指令。這種方法的程序結(jié)構(gòu)簡(jiǎn)單,不涉及功能、功能塊、數(shù)據(jù)塊、局部變量和中斷等比較復(fù)雜的概念。
由于所有的指令都集中在一個(gè)塊中,即使程序中的某些部分在大多數(shù)時(shí)候都不需要執(zhí)行,但每個(gè)掃描周期都需要執(zhí)行所有指令,CPU的執(zhí)行效率比較低。此外如果需要多次執(zhí)行相同或相似的程序就需要重復(fù)編寫(xiě)程序。因此,這種編程方法,一般只在編寫(xiě)簡(jiǎn)單的控制系統(tǒng)程序時(shí)使用。

模塊化程序的執(zhí)行
模塊化編程中OB1起著主程序的作用,F(xiàn)C或FB控制著不同的過(guò)程任務(wù),相當(dāng)于主循環(huán)程序的子程序。模塊化編程中被調(diào)用塊不向調(diào)用塊返回?cái)?shù)據(jù)。
模塊化編程實(shí)例
1.模塊化編程實(shí)例1 - 液位監(jiān)視
• 監(jiān)視一個(gè)慢變得過(guò)程不需要每次掃描都進(jìn)行。如果過(guò)程每隔一定時(shí)間或根據(jù)需要進(jìn)行處理,程序?qū)⒏行А?#8226; 在OB1循環(huán)掃描處理時(shí),可以按照一定的周期對(duì)液位進(jìn)行監(jiān)視。
設(shè)計(jì)方法:
• 確定液位監(jiān)視的組成部分和它們的關(guān)系;
• 設(shè)計(jì)完成所要求控制任務(wù)的功能;
• 規(guī)劃從OB中調(diào)用塊完成功能的程序執(zhí)行
過(guò)程;
• 對(duì)程序塊的每個(gè)段加上文字注釋和標(biāo)題。
解決方案:
• 建立一個(gè)功能FC,可以監(jiān)視和控制任務(wù);
• 建立一個(gè)OB,其中每隔一定時(shí)間調(diào)用塊
(功能)。
2.模塊化編程實(shí)例2
有兩臺(tái)電動(dòng)機(jī),控制模式是相同的,按下啟動(dòng)按鈕(電動(dòng)機(jī)1為I0.0,電動(dòng)機(jī)2為I1.0),電動(dòng)機(jī)起動(dòng)運(yùn)行(電動(dòng)機(jī)1為Q4.0,電動(dòng)機(jī)2為Q4.1);按下停止按鈕(電動(dòng)機(jī)1為I0.1,電動(dòng)機(jī)2為I1.1),電動(dòng)機(jī)停止運(yùn)行。
分析:
這是典型的起保停電路,采用模塊化編程的思想,分別在FC1和FC2中編寫(xiě)電機(jī)的控制程序,在主程序OB1中進(jìn)行FC1和FC2的調(diào)用。

結(jié)構(gòu)化編程
Ø 將復(fù)雜的任務(wù)分解成一些能夠反映過(guò)程的工藝、功能或可以反復(fù)使用的單獨(dú)解決的小任務(wù),這些任務(wù)由相應(yīng)的程序塊來(lái)表示;
Ø 某些程序塊可以用來(lái)實(shí)現(xiàn)相同或相似的功能;
Ø 調(diào)用者可以是各種邏輯塊,包括用戶編寫(xiě)的OB、FB、FC和系統(tǒng)提供的SFB與SFC;
Ø 被調(diào)用的塊是OB之外的邏輯塊;
Ø 通用的數(shù)據(jù)和代碼可以共享。
結(jié)構(gòu)化編程
結(jié)構(gòu)化編程的優(yōu)點(diǎn):
1各單個(gè)任務(wù)塊的創(chuàng)建和測(cè)試可以相互獨(dú)立地進(jìn)行;
2通過(guò)使用參數(shù),可將塊設(shè)計(jì)得十分靈活;
3塊可以根據(jù)需要在不同的地方以不同的參數(shù)數(shù)據(jù)記錄進(jìn)行調(diào)用;
4在預(yù)先設(shè)計(jì)的庫(kù)中,能夠提供用于特殊任務(wù)的“可重用”塊。
結(jié)構(gòu)化編程實(shí)例-油漆調(diào)制
1選擇產(chǎn)品添加劑,需要決定哪個(gè)罐的成分要加到混合罐內(nèi)。
2在選擇開(kāi)關(guān)的選擇基礎(chǔ)上,組織塊調(diào)用相應(yīng)的程序塊,分配當(dāng)前的參數(shù),控制混合罐的流入量。
設(shè)計(jì)方法:
1. 確定哪些部件和操作可以應(yīng)用于所有的罐和相關(guān)的控制;
2. 建立功能或功能塊,完成所要求的控制;
3. 建立塊的變量定義表,以便于對(duì)要操作的罐和控制進(jìn)行地址分配;
4. 設(shè)計(jì)一個(gè)程序來(lái)根據(jù)選擇開(kāi)關(guān)調(diào)用功能或功能塊。
解決方案:
1. 建立一個(gè)功能塊或功能控制罐的流出量;
2. 為相關(guān)的塊建立變量定義表;
3. 建立一個(gè)OB塊來(lái)根據(jù)選擇開(kāi)關(guān)調(diào)用功能或功能塊。