計(jì)規(guī)范實(shí)戰(zhàn):從變量命名到狀態(tài)機(jī)調(diào)試)
簡介《PLC程序設(shè)計(jì)規(guī)范》是一份面向自動(dòng)化工程師、PLC程序設(shè)計(jì)與調(diào)試人員的作業(yè)標(biāo)準(zhǔn)文檔旨在解決程序結(jié)構(gòu)混亂、安全隱患多、后期維護(hù)困難等問題。壓縮包內(nèi)共1個(gè)文件為doc格式整體約197KB內(nèi)容按條目逐一展開既保留原始規(guī)范要點(diǎn)也補(bǔ)充了詳細(xì)解讀方便直接查閱、打印或作為團(tuán)隊(duì)培訓(xùn)材料。目前已有99人學(xué)習(xí)下載。文檔圍繞PLC選型與I/O點(diǎn)數(shù)規(guī)劃、軟元件分配、程序分區(qū)注釋、手動(dòng)/自動(dòng)主控連鎖、安全優(yōu)先原則、復(fù)位與模式切換、避免雙輸出、觸摸屏與特殊模塊協(xié)同、注釋命名、版本管理及密碼備份等16項(xiàng)要點(diǎn)展開給出從設(shè)備抽象、公共因子提煉到工藝流程分段的完整編程思路無論單機(jī)設(shè)備還是多工位生產(chǎn)線均可參考該規(guī)范劃分功能單元降低開發(fā)與維護(hù)成本適合新手建立規(guī)范習(xí)慣也可作為現(xiàn)場調(diào)試和設(shè)計(jì)評(píng)審的實(shí)用檢查清單。 做設(shè)備維護(hù)這些年我經(jīng)手過的PLC程序少說也有上百套了。每次接手一套沒有任何注釋、變量命名全是X0/Y0/M0的老程序內(nèi)心都是崩潰的——不是程序跑不起來是你根本不知道它想干什么。PLC程序設(shè)計(jì)規(guī)范這件事聽起來像是寫文檔做樣子的“流程活”實(shí)際上直接決定了設(shè)備能不能順利調(diào)完、后期維護(hù)要燒掉多少人力、換人交接時(shí)會(huì)不會(huì)斷檔。今天我就把自己在項(xiàng)目里整理、踩坑、修正過的一版規(guī)范拿出來聊聊不整虛的全是能落地的干貨。這套規(guī)范適合誰剛?cè)腴T的PLC編程新手、需要跟同事協(xié)同開發(fā)整機(jī)的自動(dòng)化工程師還有被“歷史遺留代碼”折磨到懷疑人生的設(shè)備維護(hù)人員。不管你是用三菱、西門子、信捷還是匯川下面這些原則基本都通用——差異只在指令集和軟件界面思維的框架是一致的。1. 程序規(guī)范到底在解決什么問題1.1 不規(guī)范程序的三宗罪先說說我親眼見過的反面教材。第一宗罪是“零注釋裸奔”程序里清一色的X0、Y1、M50沒有任何符號(hào)表現(xiàn)場查故障全靠對(duì)著IO表一個(gè)個(gè)數(shù)數(shù)錯(cuò)了就滿柜子找線。第二宗罪是“地址隨手寫”中間繼電器從M0一路用到M800沒有任何分區(qū)規(guī)劃今天寫了明天就忘兩個(gè)程序段撞地址那是常事。第三宗罪是“邏輯全堆在主程序”一個(gè)幾千步的梯形圖從上拉到下沒有子程序、沒有功能塊CPU掃描周期被拖得很長不說想改一個(gè)動(dòng)作邏輯得翻半天圖紙。這三宗罪加起來會(huì)是什么結(jié)果設(shè)備調(diào)試期延長一倍維護(hù)時(shí)故障定位靠猜工程師一離職整套設(shè)備就成了“黑盒”。有次我在現(xiàn)場處理一臺(tái)老設(shè)備的停機(jī)故障程序步數(shù)不多但全是一坨邏輯最后實(shí)在沒辦法把程序分五段逐個(gè)屏蔽輸出才鎖定了問題點(diǎn)——光這一步就折騰了大半天。從那以后我格外重視規(guī)范這件事。1.2 規(guī)范的本質(zhì)是降低溝通成本很多人覺得寫規(guī)范是給自己找麻煩其實(shí)恰恰相反。PLC程序和高級(jí)語言不一樣它是“并行思維”的產(chǎn)物梯形圖擺在那里誰看了都得在腦子里過一遍掃描順序。規(guī)范的本質(zhì)就是讓另一個(gè)人包括三個(gè)月后的你自己在看程序時(shí)不需要猜。我常用的一個(gè)類比是程序規(guī)范就像工地上的施工圖紙標(biāo)注。你不標(biāo)清楚管線走向和預(yù)留接口后面的人只能拿電錘到處打眼。PLC的符號(hào)表、注釋、結(jié)構(gòu)分區(qū)就是那套標(biāo)注有了它們程序的“施工過程”才能被理解和追溯。2. 變量命名與地址分配程序規(guī)范的地基2.1 IO映射規(guī)則物理點(diǎn)與邏輯名分離我強(qiáng)烈建議第一件事就是把物理IO點(diǎn)全部映射成帶含義的符號(hào)名程序里不允許直接出現(xiàn)裸地址。以三菱FX系列為例X0~X7按功能命名比如X0映射為啟動(dòng)按鈕符號(hào)名叫Start_BtnY0~Y7映射為主接觸器、運(yùn)行指示燈等符號(hào)名叫Main_Contactor、Run_Lamp命名格式統(tǒng)一為“部位_動(dòng)作_性質(zhì)”例如Cyl_A_Out、Motor_Main_Run這樣做的好處是顯而易見的。第一程序可讀性大幅提升任何人打開程序看到的是一個(gè)一個(gè)“有名字的零件”而不是冰冷的地址編號(hào)第二圖紙上的線號(hào)可以跟符號(hào)表一一對(duì)應(yīng)查線效率翻倍。我在項(xiàng)目里還會(huì)專門整理一張IO映射表Excel存一份、程序注釋里存一份雙保險(xiǎn)。2.2 中間變量分區(qū)規(guī)劃從源頭避免地址沖突中間繼電器和數(shù)據(jù)寄存器是最容易失控的地方。我的習(xí)慣是提前劃好地址段每個(gè)用途一個(gè)區(qū)間不許跨界使用。以三菱FX3U為例我常用這樣一套規(guī)劃地址范圍用途說明M0~M99運(yùn)行狀態(tài)標(biāo)志設(shè)備自動(dòng)/手動(dòng)/急停等M100~M299工藝步驟狀態(tài)各工步激活標(biāo)志M300~M499報(bào)警標(biāo)志各報(bào)警條件匯總M500~M799內(nèi)部工藝連鎖互鎖、條件允許標(biāo)志D0~D99工藝參數(shù)速度、位置、時(shí)間設(shè)定值D100~D199計(jì)數(shù)值與當(dāng)前值實(shí)際位置、圈數(shù)等D200~D299報(bào)警參數(shù)與臨時(shí)計(jì)算報(bào)警閾值、中間運(yùn)算這套分區(qū)的原則是“性質(zhì)相近的放一起范圍寧多勿少”。后面程序?qū)懚嗔诵略鲆粋€(gè)功能只需要去對(duì)應(yīng)分區(qū)領(lǐng)取空閑地址完全不用翻查整本程序擔(dān)心撞車。針對(duì)標(biāo)簽編程的軟件比如西門子博途我會(huì)把命名加上前綴區(qū)分?jǐn)?shù)據(jù)類型比如b開頭是Bool、i是Int、r是Real這樣截圖到文檔里大家一看就知道變量類型。3. 程序結(jié)構(gòu)讓掃描周期和可讀性同時(shí)出彩3.1 主程序框架三層結(jié)構(gòu)走天下好的PLC程序應(yīng)該像一本目錄清晰的書。我的標(biāo)準(zhǔn)框架是三層主程序做調(diào)度、子程序做功能、功能塊做復(fù)用。主程序只干三件事初始化、調(diào)用各功能子程序、匯總報(bào)警。注意主程序里盡量不要寫實(shí)際的控制邏輯避免變成一鍋粥。所有設(shè)備動(dòng)作拆成相對(duì)獨(dú)立的子程序例如“上料機(jī)構(gòu)”、“夾緊機(jī)構(gòu)”、“分度轉(zhuǎn)盤”每個(gè)子程序只管自己的那攤事。在西門子博途或信捷XDPPro里這對(duì)應(yīng)FB/FUN功能塊在三菱GX Works里對(duì)應(yīng)子程序和功能塊指令信捷的FB塊本質(zhì)上也一樣——把一組輸入輸出封裝好內(nèi)部邏輯可以重復(fù)調(diào)用。這個(gè)結(jié)構(gòu)的好處是調(diào)試時(shí)能單獨(dú)監(jiān)控某個(gè)子程序出問題知道去哪里查新增功能不影響老邏輯多人協(xié)作時(shí)各寫各的子程序最后合入主框架沖突面小很多。3.2 工藝步驟的狀態(tài)機(jī)寫法凡是有順序動(dòng)作的設(shè)備我建議一律用“狀態(tài)機(jī)”而不是“置位復(fù)位大法”。用M0~M99作為步驟標(biāo)志的時(shí)候每一步有唯一的激活位通過轉(zhuǎn)移條件去驅(qū)動(dòng)下一步激活、當(dāng)前步復(fù)位。有次我在現(xiàn)場給一條半自動(dòng)裝配線做改造原來程序用的是S/R指令一條一條往下串中間還夾著各種跳轉(zhuǎn)排查斷點(diǎn)時(shí)錯(cuò)誤地復(fù)位了一個(gè)關(guān)鍵輸出結(jié)果整條線亂套。改成狀態(tài)機(jī)后每一步非常清晰核心是好排查——檢查當(dāng)前在哪一步、為什么卡住一目了然。狀態(tài)機(jī)的轉(zhuǎn)移條件我只用“輸入條件延時(shí)確認(rèn)”。比如氣缸伸出到位我不僅看磁性開關(guān)的信號(hào)還會(huì)加一個(gè)50~100ms的濾波延時(shí)再確認(rèn)到位防止信號(hào)抖動(dòng)導(dǎo)致誤判。這個(gè)細(xì)節(jié)看著不起眼實(shí)際調(diào)試中被它救過好多次。4. 注釋、文檔與版本看不見的硬實(shí)力4.1 注釋到底寫什么、怎么寫很多工程師寫注釋只寫“啟動(dòng)電機(jī)”四個(gè)字這種注釋寫了等于沒寫。規(guī)范的做法是寫清楚“為什么”不是“是什么”。比如* 當(dāng)料倉檢測到無料且前工位已完成時(shí) * 才允許啟動(dòng)送料電機(jī)防止料件堆積。好注釋的核心是傳達(dá)設(shè)計(jì)意圖讓后人知道“這里為什么要有這個(gè)條件”而不是機(jī)械地復(fù)述梯形圖。我寫注釋的習(xí)慣是每個(gè)子程序頭部必須有“功能說明、輸入輸出參數(shù)、修改記錄、修改人、日期”五行頭注每段邏輯必須有段注釋說明這段在干什么每個(gè)報(bào)警輸出必須有報(bào)警原因和復(fù)位條件的注釋。4.2 版本管理與變更記錄程序規(guī)范里很容易被忽略的是版本管理。別小看這個(gè)現(xiàn)場程序改過幾版之后沒人記得清楚哪版對(duì)應(yīng)哪臺(tái)設(shè)備。我的做法是每次修改程序前先導(dǎo)出備份文件名帶版本號(hào)和日期例如攪拌機(jī)控制_V2.3_20240115同時(shí)在一個(gè)變更記錄.txt里寫下本次修改了哪個(gè)功能塊、改了哪些邏輯、為什么改。這個(gè)習(xí)慣在設(shè)備出問題需要“回退版本”時(shí)價(jià)值千金。另一方面不同客戶、不同設(shè)備的程序不要混用一套。哪怕是同一型號(hào)的設(shè)備現(xiàn)場接線稍有差異程序就完全不同盲目替換程序會(huì)造成輸出口錯(cuò)亂甚至設(shè)備事故。每次出差到現(xiàn)場我第一件事就是核對(duì)PLC程序版本和圖紙版本是否一致。4.3 程序上載與比對(duì)維修時(shí)最怕的是現(xiàn)場程序跟備份不一致又不知道差在哪。現(xiàn)在的GX Works、博途、信捷XDPPro都支持程序比對(duì)功能把現(xiàn)場上載的程序和備份文件做在線比較能直接列出差異步數(shù)和觸點(diǎn)。我每次去現(xiàn)場第一件大事就是把設(shè)備PLC里的程序和母公司的備份做一次比對(duì)確認(rèn)現(xiàn)場改過什么再?zèng)Q定下一步動(dòng)作。這個(gè)操作建議寫進(jìn)維護(hù)SOP里是排查“程序被現(xiàn)場修改過”這類疑難雜癥的最有效手段。5. 常見問題與排查技巧實(shí)錄5.1 IO點(diǎn)不夠用怎么辦項(xiàng)目做到一半發(fā)現(xiàn)輸入輸出點(diǎn)不夠很多人第一反應(yīng)是加PLC擴(kuò)展模塊但實(shí)際上在選型階段就應(yīng)該留出15%~20%的余量我在設(shè)計(jì)IO表時(shí)上限直接畫死超過95%就必須擴(kuò)容防止后期調(diào)試時(shí)加一個(gè)傳感器都要改硬件。如果確實(shí)彈性有限優(yōu)先考慮三方面檢查有沒有重復(fù)占用的點(diǎn)位、能不能用組態(tài)王的內(nèi)部變量替代部分中間邏輯、有沒有標(biāo)志位可以由上位機(jī)算好后再下發(fā)的。5.2 步進(jìn)狀態(tài)不切換的排查思路狀態(tài)機(jī)程序最常見的問題就是“卡在某一步不往下走”。排查思路建議固定成一套動(dòng)作先看當(dāng)前步激活標(biāo)志是否為ON再看下一步轉(zhuǎn)移條件涉及的輸入信號(hào)在監(jiān)控表里的實(shí)時(shí)狀態(tài)然后確認(rèn)是否存在多個(gè)步驟同時(shí)被激活的情況這通常是編程時(shí)S/R指令沒復(fù)位干凈導(dǎo)致的。用Excel做一個(gè)轉(zhuǎn)移條件真值表排查時(shí)逐列打勾效率極高。我靠這個(gè)方法處理過不下十次卡程序故障每次都是十分鐘內(nèi)鎖定問題點(diǎn)。5.3 程序掃描周期過長程序體量大到一定程度掃描周期變長會(huì)影響高速IO的響應(yīng)。排查方案是主程序只做任務(wù)調(diào)度把實(shí)時(shí)性要求高的邏輯放進(jìn)定時(shí)中斷把不常用的初始化邏輯放到上電脈沖里執(zhí)行一次即可不要每個(gè)掃描周期都跑能用功能塊封裝的邏輯盡量封裝西門子等支持局部變量的軟件尤其要注意變量的生命周期。調(diào)試中我用博途的“實(shí)時(shí)監(jiān)控”功能查看每個(gè)程序塊的執(zhí)行時(shí)間找出耗時(shí)大戶然后優(yōu)化掉實(shí)測能讓掃描周期縮短一半以上。5.4 現(xiàn)場干擾導(dǎo)致的誤動(dòng)作干擾問題是最難排查的一類。我的經(jīng)驗(yàn)是傳感器信號(hào)全部經(jīng)過PLC輸入濾波濾波時(shí)間按實(shí)際用途設(shè)置——普通按鈕10ms就夠高速編碼器則需要特殊高速輸入口模擬量信號(hào)全部用屏蔽雙絞線且屏蔽層單端接地所有24V感應(yīng)負(fù)載必須并續(xù)流二極管否則關(guān)斷時(shí)的反電動(dòng)勢會(huì)直接干擾PLC。6. 最后再分享兩個(gè)小技巧第一PLC程序要做到“上電可自檢”。規(guī)范的程序里一定包含上電自檢邏輯檢查急停回路是否正常、檢查關(guān)鍵傳感器是否信號(hào)沖突、檢查氣缸是否在初始位置。設(shè)備上電時(shí)先跑一遍自檢再進(jìn)入待機(jī)狀態(tài)能避免大量因“開機(jī)位置不對(duì)”造成的撞機(jī)事故。我吃過這個(gè)虧之后把自檢邏輯列為所有項(xiàng)目的標(biāo)配。第二把梯形圖打印出來對(duì)照現(xiàn)場看。雖然現(xiàn)在都用電腦監(jiān)控了但有些老工程師的經(jīng)驗(yàn)反而被我繼承了下來——把程序關(guān)鍵頁打印塑封掛在電柜門內(nèi)側(cè)現(xiàn)場排查時(shí)邊看邊對(duì)比抱著電腦方便得多。而且在打印過程中你會(huì)被迫重新審視程序的排布邏輯常常能發(fā)現(xiàn)平時(shí)監(jiān)控畫面里注意不到的梯形圖左右母線連接問題。最后說句實(shí)在話程序規(guī)范不是一天就能建好的也沒有一套標(biāo)準(zhǔn)能適配所有品牌和行業(yè)。關(guān)鍵是先跑起來在一兩個(gè)項(xiàng)目里強(qiáng)制自己按固定規(guī)則命名、分區(qū)、寫注釋形成肌肉記憶之后你會(huì)發(fā)現(xiàn)后續(xù)項(xiàng)目越來越順同事和客戶對(duì)你的評(píng)價(jià)也會(huì)明顯不一樣。希望這份總結(jié)對(duì)正在建規(guī)范的朋友們有點(diǎn)實(shí)際參考價(jià)值。本文還有配套的精品資源點(diǎn)擊獲取