1.程序家族有哪些成員?
PLC的控制程序一般由主程序、子程序和中斷程序組成。西門(mén)子的S7-300/400將子程序分為功能(Function,或稱(chēng)為函數)和功能塊(Function Block)。
在每一個(gè)掃描循環(huán)周期,CPU都要調用一次主程序,用戶(hù)程序必須有一個(gè)并且只能有一個(gè)主程序。小型控制系統可以只有主程序。
中斷程序用于快速響應中斷事件。在中斷事件發(fā)生時(shí),CPU將停止執行當時(shí)正在處理的程序或任務(wù),去執行用戶(hù)編寫(xiě)的中斷程序。執行完中斷程序后,繼續執行被暫停執行的程序或任務(wù)。
2.哪些情況需要使用子程序?
當系統規模很大、控制要求復雜時(shí),如果將全部控制任務(wù)放在主程序中,主程序將會(huì )非常復雜,既難以調試,也難以閱讀。使用子程序可以將程序分成容易管理的小塊,使程序結構簡(jiǎn)單清晰,易于調試、查錯和維護。
子程序也可以用于需要多次反復執行相同任務(wù)的地方,只需要編寫(xiě)一次子程序,別的程序在需要的時(shí)候多次調用它,而無(wú)需重寫(xiě)該程序。
3.怎樣調用子程序?
主程序可以調用子程序,子程序也可以嵌套調用別的子程序。嵌套調用的層數是有限制的,例如S7-200的最大嵌套深度為8級。
執行完子程序后,返回調用它的程序中的調用指令的下一條指令。
4.每個(gè)掃描周期都會(huì )執行子程序嗎?
子程序的調用可以是有條件的,在被調用期間,每個(gè)掃描周期都要執行一次被調用的子程序。調用條件不滿(mǎn)足時(shí)不會(huì )執行子程序中的指令,因此使用子程序可以減少掃描循環(huán)時(shí)間。
5.停止調用子程序后,子程序中的線(xiàn)圈處于什么狀態(tài)?
停止調用子程序后,不再執行子程序中的指令。子程序中線(xiàn)圈對應的編程元件如果沒(méi)有受到別的程序的控制,將保持子程序最后一次執行后的狀態(tài)不變。即使控制這些線(xiàn)圈的觸點(diǎn)的狀態(tài)變化,該線(xiàn)圈對應的元件的狀態(tài)也不會(huì )變化,因為這時(shí)根本就沒(méi)有執行子程序中的指令。
6.怎樣實(shí)現子程序的無(wú)條件調用?
有的PLC的子程序調用指令不能直接接到左側的垂直“電源”線(xiàn)上,需要通過(guò)觸點(diǎn)電路來(lái)控制是否調用子程序,即子程序的調用是有條件的?梢杂靡恢睘镺N的特殊位元件(例如S7-200的SM0.0或FX系列的M8000)的常開(kāi)觸點(diǎn)來(lái)實(shí)現子程序的無(wú)條件調用。
不同品牌的PLC的子程序大致可以分為兩種,一種子程序沒(méi)有輸入、輸出參數和局部變量,另一種則有。
1.什么是全局變量和局部變量?
以西門(mén)子的S7-200為例,輸入I、輸出Q、變量存儲器V、內部存儲器位M、定時(shí)器T、計數器C等屬于全局變量,可以在符號表中為全局變量定義符號名。
程序組織單元(Program Organizational Unit)簡(jiǎn)稱(chēng)為POU,包括主程序、子程序和中斷程序。每個(gè)POU均有自己的64字節局部變量,局部變量用L(Local)來(lái)表示,局部變量只能在它所在的POU中使用。與此相反,全局變量可以在各POU中使用。
2.局部變量有哪些類(lèi)型?
子程序可以使用下列局部變量:
1) TEMP (臨時(shí)變量)是暫時(shí)保存在局部數據區中的變量。只有在執行該POU時(shí),定義的臨時(shí)變量才被使用,POU執行完后,不再保存臨時(shí)變量的數值。主程序和中斷程序的局部變量表中只有TEMP變量。
2) IN(輸入參數)由調用它的POU提供的傳入子程序的輸入參數。
3) OUT(輸出參數)是子程序的執行結果,它被返回給調用它的POU。
4) IN_OUT(輸入_輸出參數)的初始值由調用它的POU傳送給子程序,并用同一變量將子程序的執行結果返回給調用它的POU。
主程序和中斷程序的局部變量表中只有臨時(shí)變量TEMP。
3.子程序的輸入、輸出參數有什么作用?
具有輸入、輸出參數和局部變量的子程序易于實(shí)現結構化編程,對于長(cháng)期生產(chǎn)同類(lèi)設備或生產(chǎn)線(xiàn)的廠(chǎng)家尤為有用。編程人員為設備的各部件或工藝功能編寫(xiě)了大量的通用的子程序。即使不知道子程序的內部代碼,只要知道子程序的功能和輸入、輸出參數的意義,就可以用它們快速“組裝”出滿(mǎn)足不同的用戶(hù)要求的控制程序。就好像可以用數字集成電路芯片組成復雜的數字電路一樣。
如果子程序沒(méi)有輸入、輸出參數,這種子程序沒(méi)有明確的軟件接口,使用起來(lái)很不方便。
4.局部變量有什么優(yōu)點(diǎn)?
1) 子程序如果沒(méi)有局部變量,它和調用它的程序之間只能通過(guò)全局變量來(lái)交換數據,子程序內部也只能使用全局變量。將它移植到別的項目時(shí),需要對各POU使用的全局變量作統一安排,以保證不會(huì )出現地址沖突。當程序很復雜,子程序很多時(shí),這種地址分配是很花時(shí)間的。
如果子程序有局部變量,并且在子程序中只使用局部變量,不使用全局變量,因為與其他POU沒(méi)有地址沖突,不作任何改動(dòng),就可以將子程序移植到別的項目中去。
為了減少移植子程序的工作量,在子程序中應盡量避免使用全局變量和全局符號。
2) 如果使用局部變量表中的臨時(shí)變量(TEMP),同一片物理存儲器可以在不同的程序中重復使用。
下面以S7-200為例,介紹子程序的編程和調用的過(guò)程。
1.創(chuàng )建子程序
生成項目時(shí),自動(dòng)生成一個(gè)子程序。打開(kāi)程序編輯器,執行“編輯”菜單中的命令“插入”→“子程序”,將自動(dòng)生成和打開(kāi)新的子程序。
2.生成局部變量
名為“模擬量計算”的子程序如下圖所示,在該子程序的局部變量表中,定義了3個(gè)輸入(IN)參數,一個(gè)輸出(OUT)參數,和名為“暫存1”的臨時(shí)(TEMP)變量。局部變量表最左邊的一列是自動(dòng)分配的每個(gè)變量在局部存儲器(L)中的地址。
3.編寫(xiě)子程序的梯形圖
局部變量表的下面是程序區(見(jiàn)上圖),輸入參數“轉換值”是來(lái)自模擬量輸入模塊的與模擬量成正比的轉換值,輸出參數“模擬值”是計算出的對應的模擬量(例如壓力、溫度等)的工程值。子程序中變量名稱(chēng)前的“#”表示該變量是局部變量,它是編程軟件自動(dòng)添加的,輸入局部變量時(shí)不用輸入“#”號。特殊存儲器位SM0.0的常開(kāi)觸點(diǎn)總是閉合。
4.子程序的調用
可以在主程序、其他子程序或中斷程序中調用子程序,調用子程序時(shí)將執行子程序中的指令,直至子程序結束,然后返回調用它的程序中該子程序調用指令的下一條指令之處。
創(chuàng )建子程序后,在上圖左邊指令樹(shù)最下面的“調用子程序”文件夾中自動(dòng)生成剛創(chuàng )建的子程序“模擬量計算”對應的圖標。
在梯形圖程序中插入子程序調用指令時(shí),首先打開(kāi)主程序,顯示出需要調用子程序的網(wǎng)絡(luò )。打開(kāi)指令樹(shù)最下面的“調用子程序”文件夾,用鼠標左鍵按住需要調用的子程序圖標,將它“拖”到程序編輯器中需要的位置。放開(kāi)左鍵,子程序塊便被放置在該位置。
子程序方框中左邊的“轉換值”等是在子程序“模擬量計算”的變量聲明表中定義的輸入參數,右邊的“模擬值”是輸出參數。它們被稱(chēng)為子程序的形式參數,簡(jiǎn)稱(chēng)為形參,形參在子程序內部的程序中使用。調用子程序時(shí),需要為每個(gè)形參指定實(shí)際的參數(簡(jiǎn)稱(chēng)為實(shí)參),例如為形參“轉換值”指定的實(shí)參為模擬量輸入字AIW2(見(jiàn)上圖)。
子程序調用指令中的實(shí)參的有效操作數為存儲器地址、常量、全局符號和調用指令所在的POU中的局部變量,不能指定被調用子程序中的局部變量。
CPU調用子程序時(shí),輸入參數被復制到子程序的局部存儲器,子程序執行完后,從局部存儲器復制輸出參數到指定的輸出參數地址。