Learning Objectives
- 說明 4~20 mA 電流訊號的優點,以及 4 mA 的「活零點」怎麼用來偵測斷線
- 把類比模組的原始值換算成工程單位,也能把工程值反算成比較用的門檻
- 用 CMP 與 SET/RST 寫出有遲滯的液位控制
- 說出 PID 的 P、I、D 各自的作用,以及調太大或太小會看到什麼
從「有沒有」到「有多少」
前幾課的輸入只有 0 與 1:按鈕有沒有按、箱子有沒有到。但工廠裡很多量是連續的:水箱裡有多少水、爐子幾度、管路壓力多大。 這些量要靠變送器(transmitter)把感測器的讀數轉成標準的電子訊號,送到 PLC 的類比輸入模組。
這一課要回答:
- 為什麼工廠的類比訊號常用 4~20 mA 的「電流」,而且是從 4 開始?
- PLC 讀到的數字(原始值)怎麼換算成 °C 或 %?
- 只會比大小的階梯圖,怎麼把水箱的液位控制在一個範圍內?
- 想把液位穩穩停在 60%,PID 控制器在做什麼?
兩種常見的類比訊號
| 訊號 | 怎麼傳 | 適合 |
|---|---|---|
| 0~10 V(電壓) | 量兩條線之間的電壓 | 距離短、控制盤內部 |
| 4~20 mA(電流) | 量迴路裡流過的電流 | 距離長、雜訊多的現場 |
電流訊號的好處:
- 抗雜訊、可以拉長線:迴路串在一起,同一圈電線上每一點的電流都相同,電線的電阻與感應到的雜訊電壓不太會改變電流。
- 活零點(live zero):量程的最低點是 4 mA,不是 0 mA。電流掉到 4 mA 以下,PLC 就知道是斷線或變送器故障, 不會把「線斷了」誤認成「溫度是 0 °C」。NAMUR NE 43 建議把 4~20 mA 以外的電流留給故障訊號(例如 3.6 mA 以下、21 mA 以上,實際門檻依設備手冊)。
- 兩線式變送器可以直接用迴路裡的電流供電,4 mA 就是留給它工作的最低電流。
安全:現場的類比訊號多半由 24 V 直流電源供電;接線、拆線前先確認電源已關閉並依工廠規定上鎖掛牌(lockout/tagout),控制盤裡的市電部分由合格人員處理。
原始值與換算
類比輸入模組用 ADC 把電流轉成整數,這個整數叫原始值。本課程的模擬 PLC 是 12 位元:4 mA 讀到 0、20 mA 讀到 4095,
放在字組 IW0~IW7。真實的類比模組範圍各廠牌不同,要查手冊。
換算就是一條直線(比例換算):
工程值 = 下限 + 原始值 ÷ 原始值最大值 ×(上限 − 下限)
例如量程 0~100 °C 的溫度變送器,原始值 2047 = 0 + 2047 ÷ 4095 × 100 ≈ 50 °C。
反過來也常用:階梯圖的 CMP 只能比較兩個整數,想寫「超過 80 °C 就警報」,就先把 80 °C 反算成原始值:
80 ÷ 100 × 4095 ≈ 3276,再寫 CMP IW0 > 3276。多數 PLC 也有換算用的指令或功能塊,可以直接得到工程值。
下面的小工具把三種數字連在一起:拖電流滑桿,或直接在任一欄輸入數字。
逐步看:用 Python 換算與反算
同一條直線,往兩個方向算:raw_to_temp 把讀到的原始值變成溫度,temp_to_raw 把想要的溫度變成門檻。注意 round() 讓門檻變成整數,因為 PLC 的 CMP 只比整數。
開關控制與遲滯
最簡單的液位控制:液位低就開泵浦,夠了就關。用一個門檻寫成階梯圖:
‖ CMP IW0 < 1638(40%) Q0.0 泵浦
‖────[ < ]──────────────────────────────( )────‖
問題是液位一到 40% 附近,泵浦就會一下開、一下關,一秒切換好幾次。真實的泵浦與接觸器這樣頻繁啟停,很快就會損壞。
解法是遲滯(hysteresis):用兩個門檻。低於 40% 才開、高於 80% 才關,中間維持原狀。
階梯圖用 SET(設定)與 RST(重置)寫:條件成立時把輸出設成 1 或 0,條件不成立時不改變輸出。
| rung | 條件 | 輸出 |
|---|---|---|
| 1 | CMP IW0 < 1638(低於 40%) |
SET Q0.0 |
| 2 | CMP IW0 > 3276(高於 80%) |
RST Q0.0 |
家裡的冷氣、電熱水器的溫控,也是同樣的道理。
小測驗:類比訊號與換算
一支 0~100 °C 的溫度變送器輸出 12 mA,溫度大約是多少?
下面的程式會印出什麼?
raw = 1024
temp = 0 + raw * (100 - 0) / 4095
print(round(temp, 1))
PLC 讀到的電流是 0 mA,最可能的情況是?
閉迴路控制與 PID
遲滯控制讓液位在 40%~80% 之間來回。如果製程要求液位穩穩停在 60%,就需要能調整「開多少」的控制方式: 泵浦接變頻器,PLC 輸出 0~100% 的開度(類比輸出,例如 4~20 mA)。
閉迴路(closed loop)控制不斷重複:量測 → 和設定值比較 → 算出輸出 → 再量測。設定值與量測值的差叫誤差(error)。 最常用的算法是 PID:
| 項 | 算法 | 作用 | 調太大 |
|---|---|---|---|
| P 比例 | Kp × 誤差 | 誤差越大、出力越大 | 超越設定值、來回振盪 |
| I 積分 | Ki × 誤差的累積 | 消除長期存在的小誤差(穩態誤差) | 衝過頭、慢慢振盪 |
| D 微分 | Kd × 誤差的變化率 | 預先踩煞車,減少超越 | 對雜訊很敏感 |
只用 P 會有穩態誤差:水一直被用掉,泵浦必須保持開著;而 P 的輸出=Kp × 誤差,誤差是 0 時輸出也是 0, 所以液位只能停在「誤差剛好讓泵浦補得上用水」的位置。I 把誤差一直累加,就算誤差很小,累積久了也能把輸出推到需要的大小。
PLC 通常有內建的 PID 功能塊,設好取樣時間、Kp、Ki(或積分時間)、Kd 就能用;參數的單位與寫法各廠牌不同,以手冊為準。
逐步看:PI 控制器一輪一輪地算
每一輪:算誤差、累加誤差、算輸出、水箱變化。注意 out 怎麼隨著誤差變小而下降,但因為有 integral,不會降到 0。看完可以把第 4 行的 ki 改成 0 再執行:液位會停在 54% 左右,比設定值少一截。
小測驗:遲滯與 PID
階梯圖裡的 SET 和 OUT 有什麼不同?
只用 P 控制,液位總是比設定值低一點。下面哪個做法能消除這個誤差?
下面的 Python 模擬只有 P 控制的水箱,會印出什麼?
level = 40
for step in range(3):
out = 5 * (60 - level)
level += out * 0.1 - 4
print(level)
重點整理
- 4~20 mA 電流訊號抗雜訊、能拉長線;4 mA 是活零點,低於 4 mA 表示斷線或故障。
- 類比模組把電流轉成原始值(本課程 0~4095),用比例換算變成工程單位;寫 CMP 門檻時反算成原始值。
- 開關控制要有遲滯:兩個門檻配 SET/RST,避免設備頻繁啟停。
- 閉迴路控制不斷「量測 → 比較 → 輸出」;PID 的 P 依誤差出力、I 消除穩態誤差、D 減少超越。
- P 或 I 太大會超越與振盪;調參數時一次改一個,觀察響應曲線。
下一課從單一台 PLC 往外看:工廠裡的設備、PLC、監控系統怎麼互相通訊。