National Central University
Uedu Main Site
Explore Uedu
Student Console
Register as Member/Login
Research Informed Consent Center
Survey Center
Educational Big Data Challenge
Claim or create a course
Try an AI Scenario Task
Support & Messages
Uptime Data

UeduGPTs

--

Jupyters

3

Local AI

--

Uedu Code

--

中央大學 AQI 80 24°C PM2.5 21
AI Reply Desktop Notifications

Show a desktop notification when the AI TA finishes replying

Chat Message Notifications

Notify me when classmates post messages in the forum

Sound notification

Play an alert sound whenever there is a new notification

Unit 18

專題:輸送帶分揀站

PLC 階梯圖加 Python 監控面板的整合作品
Interaction 30 minute(s)

Learning Objectives

  • 從需求整理出 I/O 表與 Modbus 對照表
  • 用上升緣、SET/RST、TON、CTU 與 MOV 寫出分揀站的階梯圖
  • 用 Python 監控產量、計算剔除率,並經由約定好的暫存器下遠端停機命令
  • 寫出測試計畫,說明為什麼安全功能不能依賴網路與上位程式

專題:輸送帶分揀站

最後一課把前面學的東西串成一個完整的作品:一條輸送帶把箱子往前送,經過感測器時, 高箱子被推桿推到旁邊的滑道(剔除),一般的箱子繼續往前(良品)。PLC 負責即時控制,Python 負責監控與紀錄。

需求

  1. 按「啟動」輸送帶運轉,按「停止」(常閉按鈕)就停;上位系統也可以下「遠端停機」命令。
  2. 箱子到達感測器時,如果高度感測是 ON,推桿伸出 0.5 秒再收回。
  3. 分別計算良品與剔除的數量,放在保持暫存器讓監控程式讀。
  4. 監控程式每秒更新一次產量與剔除率;剔除太多時下遠端停機命令。

I/O 表與 Modbus 對照表

寫程式之前先把表寫好,PLC 程式、監控程式、HMI 都照這張表做:

位址 設備 說明 Modbus
I0.0 啟動按鈕 常開,按下=1 離散輸入 0
I0.1 停止按鈕 常閉,沒按=1、按下或斷線=0 離散輸入 1
I0.2 箱子感測器 箱子在感測器前=1 離散輸入 2
I0.3 高度感測 高箱子=1 離散輸入 3
Q0.0 輸送帶馬達 1=運轉 線圈 0
Q0.1 推桿 1=伸出 線圈 1
MW0 良品數 PLC 寫、上位讀 保持暫存器 0
MW1 剔除數 PLC 寫、上位讀 保持暫存器 1
MW5 遠端停機命令 上位寫 1=停機 保持暫存器 5

注意最後一列:上位系統不直接寫馬達的線圈,而是寫一個「命令」暫存器,由 PLC 程式決定要不要照做。 這樣 PLC 的邏輯(例如停止按鈕優先)永遠有效,上位系統出錯也不會繞過它。

互動練習:分揀站的階梯圖

起始程式已經有輸送帶的啟停(第 1 條)、良品計數(第 2 條)與把良品數放到 MW0(第 3 條)。 按「執行」再按住「啟動」,輸送帶就會送箱子過來;箱子經過感測器時按住「高度感測」,就是高箱子。依序完成任務:

  1. 新增一條 rung:箱子剛到達(上升緣 P I0.2)而且是高箱子(I0.3)時,SET Q0.1 推桿伸出。
  2. 再加兩條 rung:推桿伸出時用 TON T0 500 計時,T0 時間到就 RST Q0.1 收回。
  3. 加一條 rung 用 CTU C1 計算剔除數,並在第 3 條 rung 加一個輸出,把 C1.CV 搬到 MW1。
  4. 回答一個問題。

逐步看:Python 監控產量

PLC 程式已經寫好並在執行:0.1 秒時有人按了啟動,第 1、3、4 個箱子是高箱子。 Python 每秒讀一次 MW0、MW1 與線圈 0,算出剔除率。看 PLC 畫面的推桿與計數器,和 Python 印出的數字對照。

互動練習:剔除太多就遠端停機

起始程式就是上面的監控程式。品管規定:剔除數達到 2 個就要停線檢查。依序完成任務:

  1. 直接執行,看每秒的產量。
  2. 剔除數 ≥ 2 時,寫入保持暫存器 5 為 1(write_register(5, 1))下遠端停機命令,只下一次,並印出「遠端停機」。輸送帶應該停下來。
  3. 回答一個問題。

測試計畫與安全

完成的程式要照測試計畫一項一項驗證,而不是「跑一次看起來對」。分揀站可以這樣列:

編號 操作 預期結果
T1 按啟動再放開 輸送帶持續運轉(自保持)
T2 運轉中按停止 輸送帶停止,放開後不會自己再啟動
T3 一般箱子經過 推桿不動,良品數 +1
T4 高箱子經過 推桿伸出約 0.5 秒後收回,剔除數 +1
T5 兩個高箱子連續經過 每個都被剔除,剔除數 +2
T6 上位寫 MW5=1 輸送帶停止
T7 拔掉停止按鈕的線(模擬斷線) 輸送帶停止(常閉接點的故障安全)
T8 監控程式關掉 產線照常運作,只是沒有人看報表

T7 和 T8 說明一個原則:保護人的功能不能依賴網路與上位程式。 停止按鈕直接接到 PLC(更嚴格的場合還有獨立的急停迴路與安全控制器),Python、HMI、網路都只是監控與方便的命令來源; 它們故障時,產線應該維持安全的狀態。真實的機台還要有機器防護與上鎖掛牌(lockout/tagout)程序,維修前切斷並鎖住能源。

可以再做的延伸

  • 監控程式把每秒的資料寫成 CSV(第 12 課),再畫出產量趨勢。
  • 用第 13 課的 Python 從站,先模擬這台 PLC,在沒有設備時測試監控程式。
  • 用第 15 課的 OPC UA 公開「良品數」「剔除數」並用訂閱取代輪詢。
  • 依第 17 課的區域與管道,替這條產線畫一張網路分區圖。

小測驗:程式設計

1.

監控程式想停線,下面哪一種做法比較好?

2.

推桿用 SET 伸出、TON 計時、時間到 RST 收回。如果少了 RST 那一條 rung,會發生什麼事?

第 1 次作答

小測驗:監控與測試

1.

下面的程式計算剔除率,會印出什麼?

records = [(3, 1), (5, 0), (2, 2)]
good = sum(g for g, r in records)
reject = sum(r for g, r in records)
print(round(reject / (good + reject) * 100), "%")
2.

監控用的 Python 程式當掉了。依照本課的設計,產線會怎樣?

3.

測試「停止按鈕斷線時輸送帶會停」這一項,主要在驗證什麼?

第 1 次作答

重點整理

  • 動手寫程式前先寫 I/O 表與 Modbus 對照表,PLC、監控程式、HMI 都依同一份文件。
  • 分揀邏輯:上升緣 P 讓動作只觸發一次;SET 伸出、TON 計時、RST 收回;CTU 計數;MOV 把計數放到 MW 給上位讀。
  • Python 監控:每秒讀 MW0、MW1、線圈 0,計算剔除率;要停線時寫命令暫存器,讓 PLC 保有最後決定權。
  • 用測試計畫逐項驗證,包括斷線與上位程式故障的情況。
  • 保護人的功能(停止、急停、機器防護、上鎖掛牌)不依賴網路與上位程式。

恭喜完成 PLC 與工業通訊軌:從掃描週期、階梯圖、計時計數、類比與 PID,到 Modbus、OPC UA、HMI 與工控資安, 你已經能把一台 PLC 和 Python 接成一個可以監控、可以紀錄的系統。

這一課完成了!
看我的學習進度
你目前沒有登入,學習進度只存在這個瀏覽器。 Login 後,進度會跟著帳號,換電腦也看得到。