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 72 24°C PM2.5 13
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 16

HMI 與 SCADA

標籤、畫面、告警與歷史資料
Interaction 25 minute(s)

Learning Objectives

  • 說明 HMI 與 SCADA 的分工,以及標籤(tag)資料庫的角色
  • 把畫面元件綁到標籤,用資料驅動畫面
  • 設定告警的上限與遲滯,說明告警跳動是什麼、怎麼避免
  • 說明告警的確認流程,以及歷史資料怎麼記錄

操作員看的是畫面,不是暫存器

到目前為止,我們都用 Python 直接讀寫 PLC 的位址。工廠裡的操作員不會這樣做,他們看的是畫面: 水塔畫成一個桶子、泵浦是一個會變色的圖示、水位過高時跳出一行紅字。這種「人與機器之間的介面」叫 HMI(Human-Machine Interface)。

名稱 通常在哪裡 做什麼
HMI 機台旁邊的觸控面板、操作站 顯示一台機器或一個區域的狀態,讓操作員下命令
SCADA 中控室的電腦與伺服器 監控整個廠區甚至遠端站點:收集資料、告警、歷史紀錄、報表
DCS 化工、電廠等連續製程 控制器與監控軟體整合成一套系統(這一課不細談)

不管哪一種,核心都是標籤(tag):一個有名字的資料點,例如 Tank.Level。標籤資料庫記下每個標籤的來源(哪台 PLC 的哪個位址)、 型別、換算方式與單位;畫面上的元件只要「綁」到標籤,資料一變,畫面就跟著變。

這一課要回答:

  1. 標籤資料庫要記錄哪些東西?
  2. 告警為什麼需要「遲滯」?
  3. 「確認告警」是什麼意思?歷史資料要怎麼記?

逐步看:一個最小的標籤資料庫

Python 版的「SCADA」:先寫一張標籤表,再寫一個 read_tag(名稱) 函數,畫面程式只用標籤名稱,不必知道位址。 模擬的水塔一開始水位偏低,PLC 在低水位時啟動泵浦;看第 3 次讀取時泵浦的狀態。

告警:上限、遲滯與跳動

最簡單的告警是「水位 > 80 % 就告警,≤ 80 % 就恢復」。問題是真實的量測值會晃動:水面有波浪、感測器有雜訊, 水位剛好在 80 % 附近時,值會在 79、81、79、82 之間跳來跳去,告警就一直發生、恢復、發生。這叫告警跳動(chattering)。

告警跳動的壞處不只是吵:操作員會習慣性地忽略它,真正重要的告警就淹沒在裡面。解法是遲滯(deadband): 超過 80 % 才發生,但要低於 80 − 5 = 75 % 才算恢復。下一個範例用同一串資料比較兩種設定。

告警發生後還有一件事:確認(acknowledge)。操作員按下「確認」,表示「我知道了、正在處理」,畫面就不再閃爍。 告警管理標準 ISA-18.2 描述的狀態大致是:

正常 ──超過上限──▶ 未確認(閃爍)──按確認──▶ 已確認 ──恢復──▶ 正常
                       │
                       └──沒人確認就恢復──▶ 已恢復、未確認 ──按確認──▶ 正常

「已恢復、未確認」很重要:就算問題已經自己消失,系統也要讓人知道「剛才發生過」。

逐步看:有沒有遲滯的差別

同一串 10 秒的水位,第一次不用遲滯,第二次用遲滯 5。看 events 串列:第一次有 4 個事件(跳動),第二次只有 2 個。

互動練習:做一個水塔監控畫面

右邊是標籤資料庫,左邊是 HMI 畫面。按「開始接收資料」,模擬的水塔資料就會驅動畫面。依序完成任務:

  1. 加一個數值顯示綁到水位 Tank.Level。
  2. 加一個指示燈綁到泵浦運轉 Pump.Run。
  3. 加一個趨勢圖綁到水位。
  4. 設定水位上限告警(75~85 %),先把遲滯設為 0,按「跑 60 秒測試」看告警發生幾次。
  5. 調整遲滯,讓 60 秒內告警只發生 1 次。
  6. 開始接收資料,等告警出現後在告警清單按「確認告警」。
  7. 回答一個問題。

歷史資料與畫面設計

SCADA 的另一個核心是歷史資料庫(historian):把標籤的值連同時間記下來,之後畫趨勢、做報表、追查事故。 記錄方式有兩種,常常混用:

  • 固定週期:每 1 秒記一筆。簡單,但值不變時也一直記,資料量大。
  • 變化才記錄:和上一次記錄的值相差超過設定的範圍才記一筆,再加上「至少每 N 分鐘記一次」,確定系統還活著。 這和第 15 課的訂閱是同一個想法。

畫面設計也有標準可以參考。高效能 HMI(ISA-101 等指引)建議:平常的畫面用灰色等低調的顏色, 醒目的顏色只留給異常,操作員一眼就能看到哪裡出問題;把數值和趨勢放在一起,讓人看得出「正在變好還是變壞」。 上面的練習畫面就是照這個想法配色的。

互動練習:用 Python 做告警

起始程式每 0.25 秒讀一次水位(輸入暫存器 0),共 8 秒。模擬的水位會在 80 % 附近晃動。 高水位告警燈接在線圈 1(Q0.1);PLC 會計算告警燈亮了幾次,超過 1 次就記錄「告警跳動」(M0.1)。依序完成任務:

  1. 直接執行,看水位怎麼變。
  2. 水位 > 80 時寫入線圈 1 為 True 點亮告警燈、印出「告警發生」;水位回到 80 以下時關燈。
  3. 加上遲滯:低於 75 才恢復,整段只亮一次燈,最後燈是暗的。
  4. 回答一個問題。

小測驗:標籤與畫面

1.

工廠把舊 PLC 換成新的,水位改放在另一個位址。用標籤資料庫的 SCADA,要改哪裡?

2.

依照高效能 HMI 的建議,下面哪一種配色比較好?

第 1 次作答

小測驗:告警與歷史資料

1.

下面的程式用遲滯 3 判斷告警,會印出什麼?

active = False
count = 0
for v in [79, 81, 79, 82, 76, 81]:
    if not active and v > 80:
        active = True
        count += 1
    elif active and v < 80 - 3:
        active = False
print(count)
2.

操作員按下「確認告警」代表什麼?

3.

下面的程式模擬「變化超過 1 才記錄」,會印出什麼?

log = []
for v in [50.0, 50.4, 50.8, 51.3, 51.5, 49.9]:
    if not log or abs(v - log[-1]) > 1:
        log.append(v)
print(log)
第 1 次作答

重點整理

  • HMI 是機台旁的操作介面,SCADA 監控整個廠區並負責收集資料、告警、歷史紀錄與報表。
  • 標籤資料庫:名稱 → 來源位址、型別、換算、單位。畫面元件綁標籤名稱,換設備時只改標籤表。
  • 告警:超過上限發生;加遲滯避免在上限附近跳動;遲滯只要大過正常的晃動就好。
  • 告警狀態:正常 → 未確認 → 已確認 → 恢復;沒人確認就恢復的是「已恢復、未確認」。
  • 歷史資料:固定週期或變化才記錄(加上最長間隔),和訂閱是同一個想法。
  • 高效能 HMI:平常灰色,顏色只留給異常。

下一課談這些系統的安全:Modbus 沒有認證時,怎麼用網路分區與白名單保護產線。

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