
1. 項目緣起一個經典但易錯的工業控制場景在工廠的自動化產線上我們經常會遇到這樣的需求幾臺電動機需要按照特定的順序啟動比如先啟動主傳動電機再啟動送料電機最后啟動冷卻風機而在停機時又需要按照相反的順序關閉比如先停冷卻風機再停送料電機最后停主傳動電機。這個“順序啟動、逆序停止”的邏輯聽起來簡單但真要在PLC里把它做穩定、做可靠里面有不少門道。我最早接觸這個需求是在一個物料輸送系統的改造項目里。當時產線要求三臺電機順序啟動間隔5秒逆序停止間隔3秒。最初的方案是用多個延時繼電器硬接線搭出來的線路復雜不說還經常因為繼電器觸點抖動導致順序錯亂維護工每次排查都得對著圖紙琢磨半天。后來改用PLC控制邏輯清晰了但第一次編程時我也踩了坑——只考慮了正常的啟停按鈕信號沒處理好急停和故障復位時的狀態結果在一次模擬測試中急停后恢復電機“嘩”一下全同時啟動了差點造成機械干涉。所以今天我就結合自己多次實戰和踩坑的經驗來詳細拆解一下如何用PLC里最基礎的定時器指令和比較指令穩健地實現多臺電機的順序啟停控制。這個方案不依賴復雜的順序功能圖或高級指令用最通用的梯形圖就能實現而且邏輯透明易于調試和維護非常適合中小型項目或者作為理解更復雜順序控制的基礎。2. 核心控制邏輯與電氣原理圖設計在動手寫程序之前我們必須先把控制邏輯和外圍電路理清楚。程序是大腦電路是手腳手腳不靈光大腦再聰明也白搭。2.1 “順序起動、逆序停止”的工藝要求詳解我們以一個經典的三臺電機M1, M2, M3控制系統為例把工藝要求具體化啟動過程按下啟動按鈕后M1立即啟動延時T1秒后M2自動啟動再延時T2秒后M3自動啟動。至此所有電機啟動完畢。停止過程按下停止按鈕后M3立即停止延時T3秒后M2自動停止再延時T4秒后M1自動停止。系統回到待機狀態。安全與故障處理任何時刻按下急停按鈕所有電機必須立即無條件停止。系統運行中若某臺電機發生過載故障該電機及其所有后續啟動的電機應立即停止而先于它啟動的電機則應按逆序延時停止。例如若M2故障則M2和M3立刻停M1則在延時T4后停止。這模擬了故障連鎖和系統安全泄放的過程。系統必須具備“啟動中”和“停止中”的狀態指示方便操作人員監控。2.2 主電路與控制電路設計要點雖然重點是PLC程序但硬件設計是根基。這里給出關鍵的設計注意事項主電路每臺電機依然采用經典的“斷路器接觸器熱繼電器”保護模式。接觸器KM1, KM2, KM3的線圈由PLC的輸出點驅動。熱繼電器FR1, FR2, FR3的常閉觸點應接入PLC的輸入點作為故障信號而不是僅串在接觸器線圈回路中。這樣做的好處是PLC可以精確知道是哪一臺電機故障從而執行上述復雜的故障順序停止邏輯??刂齐娐方oPLC的輸入信號至少應包括I0.0: 啟動按鈕常開I0.1: 停止按鈕常開I0.2: 急停按鈕常閉接入常閉點并使用正邏輯或接入常開點但在程序里取反I0.3,I0.4,I0.5: 電機M1, M2, M3的熱繼電器故障信號常閉觸點故障時斷開I0.6: 系統復位按鈕用于故障復位PLC的輸出點驅動Q0.0,Q0.1,Q0.2: 分別驅動接觸器KM1, KM2, KM3的線圈。Q0.3,Q0.4: 可用來驅動“系統運行”和“系統停止中”指示燈。注意急停按鈕必須采用硬件優先的原則。除了接入PLC輸入點參與邏輯處理外強烈建議將其常閉觸點直接串聯在PLC輸出回路的總電源或所有接觸器線圈的公共端上。這樣即使PLC程序跑飛或通信故障拍下急停也能物理切斷輸出這是保障安全的最重要防線。3. PLC程序架構與核心變量定義接下來我們進入PLC編程環節。我會以西門子S7-1200/1500的梯形圖LAD和SCL語言為例進行說明其思想同樣適用于三菱、歐姆龍等其他品牌的PLC。3.1 變量表規劃與數據類型選擇清晰的變量定義是程序可讀性的關鍵。我們規劃以下主要變量變量名 (符號)數據類型地址 (示例)說明StartPBBoolI0.0啟動按鈕StopPBBoolI0.1停止按鈕E_StopBoolI0.2急停按鈕 (常閉接入True為正常)Fault_M1BoolI0.3M1熱繼故障Fault_M2BoolI0.4M2熱繼故障Fault_M3BoolI0.5M3熱繼故障ResetPBBoolI0.6復位按鈕KM1,KM2,KM3BoolQ0.0,Q0.1,Q0.2電機控制輸出Sys_RunningBoolM0.0系統運行標志內部Sys_StoppingBoolM0.1系統停止中標志內部T_Start_CycleTimeT#5s啟動間隔時間如5秒T_Stop_CycleTimeT#3s停止間隔時間如3秒TON_StartTimerTimerDB1.TON_Start啟動過程延時定時器TON_StopTimerTimerT#3s停止過程延時定時器Start_Time_ElapsedIntMW10啟動定時器當前值毫秒Stop_Time_ElapsedIntMW12停止定時器當前值毫秒Motor_StepIntMW14步驟標志0待機1M1運行2M2運行3M3運行關鍵點這里我引入了Motor_Step這個整型變量來標識系統當前所處的步驟。很多初學者喜歡用一堆輔助繼電器M點來互鎖邏輯容易混亂。用一個步序號管理邏輯會清晰很多。定時器我們選用TON接通延時定時器并計劃通過比較指令來判斷是否到達每一步的時間點。3.2 主程序流程框架設計整個程序可以圍繞一個主狀態機來構建狀態由Motor_Step變量控制Step 0 (待機)等待啟動命令。收到啟動命令且無急停、無故障時置Sys_RunningMotor_Step置1啟動M1同時啟動TON_StartTimer。Step 1 (M1運行等待啟動M2)TON_StartTimer計時。通過比較指令判斷Start_Time_Elapsed T#5s。若成立則Motor_Step置2啟動M2重置并重啟TON_StartTimer為下一步計時。Step 2 (M1M2運行等待啟動M3)同上判斷Start_Time_Elapsed T#5s成立則Motor_Step置3啟動M3。此時所有電機已啟動Sys_Running保持停止TON_StartTimer。Step 3 (全速運行)等待停止命令或故障信號。停止或故障觸發一旦收到停止命令或某個故障信號Sys_Running復位Sys_Stopping置位Motor_Step根據當前值進入逆序停止流程。例如若從Step 3觸發停止則先停M3Motor_Step置為2啟動TON_StopTimer依次類推。急停處理在任何步驟急停信號直接清零所有輸出和狀態標志跳回Step 0。這個框架的核心在于用同一個定時器配合重置為順序啟動的每一步計時而不是為每一步單獨分配一個定時器。這樣做節省了定時器資源邏輯也更集中。4. 梯形圖程序逐行解析與關鍵指令應用現在我們把這個框架用梯形圖實現。為了便于理解我分網絡進行說明。4.1 網絡1系統啟動與運行標志控制StartPB E_Stop Fault_M1 Fault_M2 Fault_M3 Sys_Running --| |-----------| |---------|/|----------|/|---------|/|-------( )--- | | | | | StopPB | | | | --|/|-----------| |---------| |----------| |---------| |------- | Sys_Running | | | --| |-------------------------|------------|-----------|------- (S) ResetPB --| |-----------這個網絡是程序的“總開關”。啟動條件按下StartPB且急停正常(E_Stop常閉觸點導通)且所有電機無故障故障信號Fault_Mx為常閉觸點正常時導通。停止條件按下StopPB常閉觸點按下斷開或Sys_Running自鎖后急停斷開或任一故障發生。Sys_Running線圈上的(S)表示置位一旦啟動條件滿足就置位并保持。底部的ResetPB用于在故障排除后復位整個系統狀態需在其他網絡復位相關標志和輸出。4.2 網絡2啟動過程定時器與步序邏輯這是最核心的部分我們使用一個TON定時器和一個比較指令。Sys_Running TON_StartTimer.IN --| |----------------------( )--- | | | T#5s | | ---(PT)--- | | | TON_StartTimer | ---(TON)--- | | | TON_StartTimer.ET | ---[MOV]--- Start_Time_ElapsedSys_Running Motor_Step --| |-----------[MOV 1]------( )--- //啟動瞬間步序置1Motor_Step Start_Time_Elapsed T#5s --| |---[1]---[]----------------( )--- //步序1時計時5秒 | | | [MOV 2]---(Motor_Step) //步序進到2 | | | [TON_StartTimer.RESET] //復位定時器 | | | [TON_StartTimer.IN] //重新觸發定時器因IN一直為True復位后立即開始新周期Motor_Step Start_Time_Elapsed T#5s --| |---[2]---[]----------------( )--- //步序2時計時5秒 | | | [MOV 3]---(Motor_Step) //步序進到3 | | | [TON_StartTimer.RESET] //停止計時關鍵技巧定時器復用TON_StartTimer在步序1和步序2中被重復使用。每次滿足時間條件、步序遞增后立即復位(RESET)該定時器。由于Sys_Running和TON_StartTimer.IN一直為True定時器復位后會立刻從0開始重新計時為下一步等待。比較指令的應用[]比較指令用于判斷定時器當前值(ET)是否達到設定間隔。這里將定時器的經過時間(ET)賦值給Start_Time_Elapsed再比較是為了程序可讀性和便于在線監控。你也可以直接比較TON_StartTimer.ET T#5s。步序管理通過Motor_Step的值清晰地劃分了階段。在步序3時定時器被復位且不再啟動因為啟動過程已完成。4.3 網絡3電機輸出控制邏輯電機輸出由Motor_Step、Sys_Running、Sys_Stopping以及故障信號共同決定。Motor_Step Sys_Running Fault_M1 --| |---[1]-----| |----------|/|---------( KM1 )Motor_Step Sys_Running Fault_M2 --| |---[2]-----| |----------|/|---------( KM2 )Motor_Step Sys_Running Fault_M3 --| |---[3]-----| |----------|/|---------( KM3 )邏輯解釋M1啟動只要系統在運行(Sys_Running)且步序1即步序1,2,3并且M1自身無故障則KM1得電。M2啟動系統在運行步序2即步序2,3且M2無故障。M3啟動系統在運行步序3且M3無故障。任何一個電機的故障信號(Fault_Mx)會直接切斷其自身的輸出這是最基本的安全邏輯。故障的連鎖停止邏輯將在下一節實現。這種用比較指令來控制輸出的方式非常簡潔地實現了順序啟動步序到1M1開步序到2M2開步序到3M3開。4.4 網絡4逆序停止與故障連鎖邏輯停止邏輯是啟動邏輯的“鏡像”但更復雜因為它可能由正常停止或故障觸發且觸發點可能在任何運行步序。首先我們需要一個網絡來觸發停止過程并設置目標步序(Target_Stop_Step)。StopPB Sys_Running (S) //正常停止觸發 --| |------------| |----------------( )---[MOV 0]--- Target_Stop_Step | | Fault_M1 | (S) //M1故障目標步序0全停 --| |------------| |----------------( )---[MOV 0]--- | | Fault_M2 | (S) //M2故障目標步序1停M2,M3 --| |------------| |----------------( )---[MOV 1]--- | | Fault_M3 | (S) //M3故障目標步序2停M3 --| |------------| |----------------( )---[MOV 2]---當Sys_Stopping被置位后啟動逆序停止定時器TON_StopTimer邏輯與啟動定時器類似但步序遞減。Sys_Stopping TON_StopTimer.IN --| |----------------------( )--- | T#3s | | ---(PT)--- | TON_StopTimer | ---(TON)---Sys_Stopping Motor_Step Target_Stop_Step --| |-----------[]-----------------( )--- //當前步序大于目標步序則需要執行停止步驟 | | TON_StopTimer.ET T#3s | ---[]-------------------( )--- //停止間隔時間到 | | | [DEC 1]---(Motor_Step) //步序減1 | | | [TON_StopTimer.RESET] //復位并重啟停止定時器故障連鎖的精髓M3故障Target_Stop_Step設為2。此時若Motor_Step為3則滿足Motor_Step Target_Stop_Step進入停止流程先將Motor_Step減到2停M3定時器計時時間到再減到1...直到等于2停止過程結束。由于M2、M1的故障條件為假它們會繼續運行。M2故障Target_Stop_Step設為1。系統會先將Motor_Step從3減到2停M3再減到1停M2。M1在步序1且無故障時保持運行直到其自身的故障信號或停止命令將其停止。急停急停信號應直接復位Sys_Running、Sys_Stopping、所有電機輸出KMx并將Motor_Step和Target_Stop_Step清零定時器復位。5. 程序調試、優化與常見問題排查程序寫完只是第一步調試和優化才能讓它真正可靠。我分享幾個實戰中總結的關鍵點。5.1 在線調試與監控技巧強制與修改值在模擬或連接真實PLC后充分利用編程軟件的“強制”和“修改值”功能。例如你可以強制StartPB為True然后在線觀察Motor_Step、定時器ET值、Start_Time_Elapsed的變化以及KMx輸出的動作是否符合預期。切記強制輸出點如Q點在真實設備上非常危險務必在確保機械安全的前提下進行或僅用于模擬。變量表監控創建變量表將Motor_Step、Start_Time_Elapsed、Sys_Running、Sys_Stopping等關鍵變量添加進去實時監視其變化。這對于分析故障觸發時的邏輯流向至關重要。分段調試先屏蔽故障和急停邏輯只調試正常的順序啟動和停止。調通后再單獨測試急停功能最后測試各種故障場景。復雜邏輯不要試圖一次性調通。5.2 提升程序穩健性的優化措施增加狀態互鎖在啟動邏輯中可以增加對Sys_Stopping的互鎖防止在停止過程中誤觸發啟動。例如啟動條件里可以串聯Sys_Stopping的常閉觸點。使用邊沿檢測對啟動、停止、復位按鈕信號使用上升沿(P)或下降沿(N)檢測指令。避免因按鈕信號抖動或長按導致邏輯多次執行。(StartPB) --|P|--。定時器保護在定時器IN端增加更嚴格的條件。例如啟動定時器僅在Sys_Running為True且Motor_Step為1或2時為True而不是簡單地一直為True。這可以防止在非預期狀態下定時器意外運行。初始化組織塊OB在OB100啟動組織塊中將所有用于控制的中間變量如Motor_Step,Sys_Running,Sys_Stopping等復位到初始狀態。確保PLC從STOP切換到RUN模式時系統處于確定的待機狀態避免“帶電重啟”導致設備誤動作。時間參數變量化不要將T#5s、T#3s這樣的時間常量直接寫在定時器或比較指令中。而是將它們定義為Time類型的全局變量或靜態變量如Start_IntervalStop_Interval。這樣以后需要修改時間參數時只需在變量表中修改一處無需翻找和修改程序極大提高了可維護性也方便做HMI連接。5.3 典型問題排查清單現象可能原因排查思路電機不按順序啟動同時啟動1. 定時器未工作或時間設置過短。2.Motor_Step邏輯錯誤步序切換條件不滿足。3. 電機輸出控制邏輯未與Motor_Step正確關聯。1. 在線監控定時器IN、PT、ET值是否變化。2. 監控Motor_Step變量看是否從1逐步遞增到3。3. 檢查控制KM2、KM3的輸出網絡條件是否包含Motor_Step2和3。停止時電機不按逆序停止同時停止1. 停止過程標志Sys_Stopping未正確置位。2. 逆序停止定時器未工作。3.Target_Stop_Step計算或設置錯誤。4.Motor_Step遞減邏輯未執行。1. 監控停止按鈕按下或故障時Sys_Stopping是否變為True。2. 監控停止定時器。3. 檢查故障邏輯中Target_Stop_Step的賦值是否正確。4. 監控Motor_Step在停止過程中是否逐步遞減。故障時前序電機未延時停止故障連鎖邏輯中Target_Stop_Step設置錯誤或停止定時器邏輯未在故障觸發后正確激活。模擬故障信號監控Target_Stop_Step值。檢查Sys_Stopping是否因故障置位以及Motor_Step Target_Stop_Step條件是否成立。急停后恢復電機亂動急停復位后程序狀態變量如Motor_Step,Sys_Running未清零或啟動條件瞬間滿足。1. 確保急停程序段復位了所有關鍵狀態標志和輸出。2. 在啟動邏輯中增加系統必須處于“完全待機狀態”如Motor_Step0的條件。時間參數修改不生效時間常量直接寫在指令中未變量化。將定時器PT管腳和比較指令中的時間值替換為全局變量并通過HMI或變量表修改該變量的值。6. 從基礎方案到高級演進的思考用定時器和比較指令實現順序控制是一個非常好的起點它讓我們深入理解了狀態、時間和邏輯之間的關系。但在更復雜的項目中我們可以考慮更優的架構。方案一使用計數器Counter簡化步序管理我們可以用一個CTU加計數器來替代Motor_Step的部分功能。啟動時每步時間到計數器加1停止時每步時間到計數器減1。電機的啟動條件變為計數器值 X。這樣省去了對Motor_Step的顯式賦值和比較邏輯更緊湊。但故障時設置目標步序會稍微麻煩一些。方案二采用順序功能圖SFC或GRAPH編程對于步驟清晰、轉移條件明確的順序過程西門子的GRAPH語言、三菱的步進順控指令STL是更專業的選擇。它們提供了“步”Step和“轉移”Transition的專有結構能直觀地描述流程并且自帶步的激活、禁用管理簡化了編程和調試。當步驟超過5個或者有并行分支、選擇分支時GRAPH的優勢會非常明顯。方案三面向對象OOP與函數塊FB封裝如果我們有多組相同的設備需要同樣的順序控制邏輯比如多條相同的產線那么為單臺電機組編寫一個函數塊FB是最高效的。在這個FB內部封裝好所有的啟動、停止、故障處理、定時邏輯并對外提供Start、Stop、Reset、Fault等接口和Step_Current、Is_Running等狀態輸出。在主程序中我們只需要實例化這個FB多次并傳入不同的參數如電機數量、時間參數即可。這極大地提高了代碼的復用性和可維護性。從最基礎的定時器比較法到更高級的架構其核心思想都是一致的明確狀態劃分、嚴格時間管理、規范信號傳遞。把這次分享的基礎方案吃透再去看那些高級的編程方法你會更有底氣也更能理解它們為何要那樣設計。