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