?
對于 PLC 初學者來說,“流水燈” 是繞不開的經典入門案例 —— 它看似簡單,卻濃縮了 PLC 編程的核心邏輯:初始化、時序控制、指令應用與狀態判斷。今天我們就以 S7-200 SMART 為例,逐行拆解一段 8 位流水燈控制程序,帶你從 “看懂代碼” 到 “理解思想”,為后續復雜控制打下基礎。
一、程序核心功能:先明確 “它能做什么”
在拆解代碼前,先搞清楚程序的最終效果,這樣后續分析會更有目標感:
- 控制對象:8 個輸出點(Q0.0~Q0.7,對應 8 個 LED 燈)
- 觸發條件:按下啟動按鈕(I0.0)
- 運行邏輯:按下按鈕后 Q0.0 先亮,之后每 1 秒燈光向左移動 1 位(Q0.0→Q0.1→…→Q0.7)
- 停止條件:完成 8 次移位后,所有燈自動熄滅,等待下一次啟動
二、逐網絡拆解:從 “代碼” 到 “邏輯”
S7-200 SMART 的程序以 “網絡” 為單位,每個網絡實現一個獨立功能。我們按邏輯順序逐一分析,重點解讀關鍵指令的作用。
網絡 1:上電初始化 —— 給系統 “設定初始狀態”
LD ????SM0.1 ???// 加載“首次掃描周期”特殊位 MOVB ??2#00000001, VB100 ?// 給VB100賦初始值(二進制00000001) MOVB ??0, VB101 ?// 給VB101賦0(移位計數器清零) MOVB ??0, VB200 ?// 給VB200賦0(運行標志位設為“停止”) |
關鍵指令解讀:
- SM0.1(首次掃描位):PLC 從 “停止” 切換到 “運行” 的第一個掃描周期,SM0.1 會短暫置 1,之后永久為 0。這意味著 ——網絡 1 的代碼只在 “上電瞬間” 執行一次,不會重復運行。
- MOVB(字節移動指令):把一個字節的數值,復制到另一個字節寄存器中。這里三個 MOVB 的作用是:
- VB100:控制燈光的 “核心寄存器”,二進制00000001表示 “只有最低位(V100.0)為 1”,對應 Q0.0 亮(后續會關聯到輸出);
- VB101:移位計數器,初始化為 0,用來記錄 “已經移了多少次”;
- VB200:運行標志位,0 = 停止、1 = 運行,初始設為停止,避免上電后自動運行。
網絡 1 的核心作用:上電瞬間給系統 “復位”,確保每次啟動都從 “Q0.0 亮” 開始。
網絡 2:啟動觸發 —— 按下按鈕,系統 “開始運行”
LD ????I0.0 ????// 加載啟動按鈕(I0.0)狀態 EU ?????????????// 上升沿檢測指令 MOVB ??2#00000001, VB100 ?// 重置VB100為初始值(Q0.0亮) MOVB ??0, VB101 ?// 移位計數器清零 MOVB ??1, VB200 ?// 運行標志位置1(系統進入“運行”狀態) |
關鍵指令解讀:
- EU(上升沿檢測):這是避免 “按鈕長按重復觸發” 的核心!它只在 “前一個邏輯從 0 變 1 的瞬間”(即按鈕按下的那一刻)產生 1 個掃描周期的脈沖,哪怕按鈕一直按著,后續也不會再觸發。
- 舉個例子:如果沒有 EU,按鈕長按 10 秒,后面的 MOVB 會重復執行 10 秒,導致程序混亂;有了 EU,無論按鈕按多久,代碼只執行一次。
- 啟動后的狀態變化:按下按鈕后,程序會做三件事:
- 重置 VB100:確保每次啟動都從 Q0.0 開始亮(哪怕上次停在 Q0.5,這次也重新來);
- 清零 VB101:重新開始計數移位次數;
- 置 1 VB200:告訴系統 “可以開始運行了”,為后續的移位做準備。
網絡 2 的核心作用:響應 “啟動按鈕”,讓系統從 “停止” 切換到 “運行初始狀態”。
網絡 3:產生移位脈沖 —— 控制 “燈光移動的節奏”
LD ????VB200 ???// 加載運行標志位(只有VB200=1時,后續邏輯才有效) AN ????SM0.5 ???// “與非”SM0.5(取反SM0.5的狀態) = ?????M0.0 ????// 結果輸出到輔助繼電器M0.0 |
關鍵指令解讀:
- SM0.5(1 秒時鐘脈沖):S7-200 SMART 的內置脈沖位,固定輸出 “1 秒通、1 秒斷” 的循環信號(占空比 50%),相當于一個 “精準的 1 秒計時器”。
- AN(與非)邏輯:先判斷 “VB200 是否為 1”(系統在運行),再判斷 “SM0.5 是否為 0”,兩者都滿足時,M0.0 才會置 1。
為什么能產生 “1 秒一次的移位脈沖”?
我們用表格看 M0.0 的狀態變化(假設 VB200=1,系統在運行):
時間階段 | SM0.5 狀態 | AN SM0.5 結果 | M0.0 狀態 |
0~1 秒 | 0 | 1 | 1 |
1~2 秒 | 1 | 0 | 0 |
2~3 秒 | 0 | 1 | 1 |
3~4 秒 | 1 | 0 | 0 |
可見:M0.0 會每 1 秒產生一個 “從 1 變 0” 的下降沿脈沖,這個脈沖就是后續 “燈光移位” 的觸發信號 —— 每 1 秒觸發一次移位。
網絡 3 的核心作用:在系統運行時,生成 “1 秒一次” 的移位觸發脈沖。
網絡 4:執行移位 + 控制輸出 —— 讓 “燈光動起來”
LD ????M0.0 ????// 加載移位脈沖(M0.0有脈沖時執行后續操作) SHL_B ?VB100, 1, VB100 ?// 字節左移:VB100左移1位,結果存回VB100 MOVB ??VB100, QB0 ??????// 把VB100的值傳給輸出字節QB0(控制燈光亮滅) |
關鍵指令解讀:
- SHL_B(字節左移指令):把一個字節的 8 位二進制數 “整體向左移動 N 位”,移出的高位丟失,低位補 0。這里 “SHL_B VB100,1,VB100” 表示:
- 原始 VB100:00000001(Q0.0 亮)→ 左移 1 位后:00000010(Q0.1 亮);
- 再左移 1 位:00000100(Q0.2 亮);
- 以此類推,直到左移 7 次后:10000000(Q0.7 亮)。
- QB0(輸出字節):S7-200 SMART 的輸出點按 “字節” 分組,QB0 對應 Q0.0~Q0.7。MOVB VB100, QB0相當于 “把 VB100 的每一位狀態,直接復制到 QB0 的對應位”——VB100 哪一位是 1,QB0 對應的燈就亮。
移位次數 | VB100 二進制 | 對應亮燈的輸出點 |
0(初始) | 00000001 | Q0.0 |
1 | 00000010 | Q0.1 |
2 | 00000100 | Q0.2 |
... | ... | ... |
7 | 10000000 | Q0.7 |
網絡 4 的核心作用:用移位指令讓 “亮燈位置左移”,再通過輸出指令控制實際燈光。
網絡 5:計數停止 —— 移位 8 次后,讓系統 “自動收尾”
LD ????M0.0 ????// 加載移位脈沖(每次移位都計數) INCB ??VB101 ???// 字節加1:VB101的值+1(記錄移位次數) LDB= ??VB101, 8 // 比較VB101是否等于8(判斷是否完成8次移位) MOVB ??0, VB200 // 若等于8,運行標志位置0(停止移位) MOVB ??0, QB0 ??// 若等于8,QB0置0(所有燈熄滅) |
關鍵指令解讀:
- INCB(字節加 1 指令):每次 M0.0 有脈沖(即每移位一次),VB101 就加 1—— 相當于 “給移位次數記賬”。
- LDB=(字節等于比較指令):持續判斷 “VB101 是否等于 8”,只有滿足時,后面的兩條 MOVB 才會執行。
為什么是 “8 次”?
因為我們控制 8 個燈(Q0.0~Q0.7),從 Q0.0 移到 Q0.7 需要 7 次移位,但程序中 “移位 1 次計數 1 次”,當計數到 8 時,意味著 “所有燈都輪過一次”,此時需要停止:
- 置 0 VB200:系統從 “運行” 切回 “停止”,網絡 3 不再產生移位脈沖;
- 置 0 QB0:強制所有輸出點斷電,燈光全滅。
網絡 5 的核心作用:通過計數判斷 “流水燈是否完成一輪”,完成后自動停止并滅燈。
三、核心知識點總結:從案例到通用邏輯
這段程序雖然簡單,但覆蓋了 PLC 編程的 5 個核心思想,學會后能遷移到大部分控制場景:
- 初始化邏輯:用 SM0.1 在啟動時設置初始狀態,避免混亂;
- 邊沿觸發:用 EU 檢測按鈕 “按下瞬間”,避免長按重復觸發;
- 時序控制:用 SM0.5 等時鐘脈沖控制 “動作節奏”(如 1 秒一次);
- 數據操作:用移位(SHL_B)、加減(INCB)指令處理控制數據;
- 狀態判斷:用比較指令(LDB=)判斷 “是否達到目標狀態”,實現自動停止。
四、實際應用拓展:讓程序更靈活
學會基礎程序后,我們可以簡單修改,實現更多功能:
- 右移流水燈:把 SHL_B(左移)換成 SHR_B(右移),燈光從 Q0.7 向 Q0.0 移動;
- 調整速度:把 SM0.5(1 秒)換成 SM0.4(2 秒),移位間隔變成 2 秒;
- 增加暫停按鈕:在網絡 3 中增加 “LD NOT I0.1”(I0.1 為暫停按鈕),按下 I0.1 時暫停移位;
- 循環流水燈:刪除網絡 5 的 “MOVB 0, VB200”,讓燈光移到 Q0.7 后繼續從 Q0.0 開始(需處理移位溢出,可結合 SM1.1)。
五、結語
流水燈是 PLC 入門的 “敲門磚”,它的價值不在于 “控制燈光”,而在于幫我們理解 “PLC 如何按邏輯一步步工作”。建議大家在 S7-200 SMART 的編程軟件(STEP 7-Micro/WIN SMART)中實際搭建這段程序,模擬運行時觀察每個寄存器(VB100、VB101、M0.0)的狀態變化 —— 親手操作后,很多抽象的指令邏輯會瞬間清晰。