2026年9月6日 星期日

Node-Red 抓取 opendata 的資料集產生AQI 空氣品質指

Node-Red 抓取 opendata 的資料集產生AQI 空氣品質指標




實現透過 Node-RED 抓取環境部 OpenData(空氣品質 AQI)資料,最核心的流程為:注入觸發(Inject) → HTTP 請求(http request) → 解析 JSON 資料(Function) → 輸出顯示(Debug 或 Dashboard 儀表板)

結構說明

  1. 統計測站總數 (ui_text)

    • API 抓取資料後,會自動計算全部的測站數量(例如 84 個),並在 Dashboard 最上方顯示:「統計資訊:全台共有 84 個觀測站」。

  2. 站名選單 (ui_dropdown)

    • 會將全台所有測站名稱(包含縣市標示,如:士林 (臺北市)古亭 (臺北市)基隆 (基隆市) ... 等)自動加入下拉式選單。

  3. 即時切換 AQI 儀表板 (ui_gauge)

    • 當您在下拉選單中選擇任一站名(如:選擇「萬華」或「彰化」),儀表板標題與指標會立即更新為該站點的 AQI 數據空氣品質狀態(如:良好、普通)

[{"id":"b7d023d3cb4f2077","type":"inject","z":"7dcbc129c166026e","name":"每15分鐘自動更新","props":[],"repeat":"900","crontab":"","once":true,"onceDelay":0.1,"topic":"","x":170,"y":160,"wires":[["6ceb34e3772b6260"]]},{"id":"6ceb34e3772b6260","type":"http request","z":"7dcbc129c166026e","name":"抓取環境部 AQI API","method":"GET","ret":"obj","paytoqs":"ignore","url":"https://data.moenv.gov.tw/api/v2/aqx_p_432?api_key=846e44e1-8cc5-4893-ad87-c79d2d383706&limit=1000&sort=ImportDate%20desc&format=JSON","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":400,"y":160,"wires":[["e40334474b756f29"]]},{"id":"e40334474b756f29","type":"function","z":"7dcbc129c166026e","name":"解析站名列表與總數","func":"var records = msg.payload.records || msg.payload || [];\nflow.set('aqiData', records);\n\nvar siteOptions = [];\nfor (var i = 0; i < records.length; i++) {\n    if (records[i].sitename) {\n        // ui_dropdown 支援直接以 \"顯示名稱\": \"傳遞數值\" 作為 Key-Value 物件\n        var item = {};\n        var labelName = records[i].sitename + \" (\" + (records[i].county || \"\") + \")\";\n        item[labelName] = records[i].sitename;\n        siteOptions.push(item);\n    }\n}\n\n// 1. 輸出測站總數\nvar msgCount = { payload: \"全台共有 \" + records.length + \" 個觀測站\" };\n\n// 2. 更新下拉選單(透過 msg.options 傳遞 Key-Value 陣列)\nvar msgDropdown = { options: siteOptions };\n\n// 3. 預設顯示第一個站名 (例如:基隆) 的 AQI\nvar defaultSite = records.length > 0 ? records[0].sitename : \"士林\";\nvar defaultAqi = records.length > 0 ? (parseInt(records[0].aqi) || 0) : 0;\nvar defaultStatus = records.length > 0 ? (records[0].status || \"\") : \"\";\nvar msgGauge = { \n    payload: defaultAqi, \n    topic: defaultSite + \" (空氣品質: \" + defaultStatus + \")\" \n};\n\nreturn [msgCount, msgDropdown, msgGauge];","outputs":3,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":650,"y":160,"wires":[["e1aed051ea6e4521","ea69f409aa5bec92"],["d2c7d42892ab5129"],["327d3a3f6cdce004"]]},{"id":"d2c7d42892ab5129","type":"ui_dropdown","z":"7dcbc129c166026e","name":"選擇測站","label":"選擇觀測站:","tooltip":"","place":"請選擇測站","group":"ce3f28d47263c160","order":2,"width":"6","height":"1","passthru":false,"multiple":false,"options":[],"payload":"","topic":"topic","topicType":"msg","className":"","x":400,"y":260,"wires":[["5b90367519b9ab1a"]]},{"id":"5b90367519b9ab1a","type":"function","z":"7dcbc129c166026e","name":"依選擇站名查詢 AQI","func":"var selectedSite = msg.payload;\nvar records = flow.get('aqiData') || [];\nvar aqiValue = 0;\nvar statusStr = \"未知\";\n\nfor (var i = 0; i < records.length; i++) {\n    if (records[i].sitename === selectedSite) {\n        aqiValue = parseInt(records[i].aqi) || 0;\n        statusStr = records[i].status || \"\";\n        break;\n    }\n}\n\nmsg.payload = aqiValue;\nmsg.topic = selectedSite + \" (空氣品質: \" + statusStr + \")\";\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":650,"y":260,"wires":[["327d3a3f6cdce004"]]},{"id":"e1aed051ea6e4521","type":"ui_text","z":"7dcbc129c166026e","group":"ce3f28d47263c160","order":1,"width":"6","height":"1","name":"測站總數","label":"統計資訊:","format":"{{msg.payload}}","layout":"row-spread","className":"","style":false,"font":"","fontSize":"","color":"#000000","x":880,"y":120,"wires":[]},{"id":"327d3a3f6cdce004","type":"ui_gauge","z":"7dcbc129c166026e","name":"AQI 指示表","group":"ce3f28d47263c160","order":3,"width":"6","height":"6","gtype":"gage","title":"{{msg.topic}} AQI 指數","label":"AQI","format":"{{value}}","min":0,"max":"300","colors":["#00e400","#ffff00","#ff0000"],"seg1":"50","seg2":"100","diff":false,"className":"","x":880,"y":260,"wires":[]},{"id":"ea69f409aa5bec92","type":"debug","z":"7dcbc129c166026e","name":"debug 7","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":860,"y":60,"wires":[]},{"id":"ce3f28d47263c160","type":"ui_group","name":"Default","tab":"58d31a26312867b7","order":1,"disp":true,"width":6,"collapse":false,"className":""},{"id":"58d31a26312867b7","type":"ui_tab","name":"AQI Home","icon":"dashboard","disabled":false,"hidden":false},{"id":"a8740c13122a5163","type":"global-config","env":[],"modules":{"node-red-dashboard":"3.6.6"}}]

2026年9月4日 星期五

EasyBuilder Pro 元件 與 Schneider EcoStruxure Machine Expert - Basic PLC ( PLC 100範例 -28 )

EasyBuilder Pro 元件 與 Schneider EcoStruxure Machine Expert - Basic PLC  ( PLC 100範例 -28 ) 


1. 說明圖片(控制邏輯與原理)

圖片展示的是典型的 自動門控制系統 (Automatic Door System)

  • 控制需求與邏輯

    1. 開門動作:當紅外線感測器 X0 感應到有人進入時,開門馬達 Y0 啟動,門開始打開,直到碰到開門極限開關 X2 才停止。

    2. 延時關門:門完全打開(X2 導通)且紅外線感測區域無人(X0 斷開)時,啟動定時器 T0 計時 7 秒

    3. 關門動作:延時 7 秒達標後,關門馬達 Y1 啟動,門開始關閉,直到碰到關門極限開關 X1 才停止。

    4. 防夾/重新開門保護:在關門過程中(Y1 運轉時),若有人再次進入感應區(X0=ON),門應立即停止關閉,並立刻執行開門動作 (Y0)

2. EasyBuilder Pro 元件設計與 Schneider PLC 程式

點位與暫存器規劃(配合規則:%M0~%M99 為按鈕/感測器,%M100~%M199 為指示燈/馬達輸出)

功能名稱原圖位址Schneider PLC 位址EasyBuilder Pro 元件類型說明/動作模式
紅外線感測器X0%M0位元按鈕 (Toggle)ON: 有人 / OFF: 無人
關門極限開關X1%M1位元按鈕 (Toggle)ON: 門完全關閉
開門極限開關X2%M2位元按鈕 (Toggle)ON: 門完全開啟
開門馬達Y0%M100位元燈 (Bit Lamp)綠色馬達 (開門中)
關門馬達Y1%M101位元燈 (Bit Lamp)藍色馬達 (關門中)
開門停留延時監視-%MW0數值顯示 (Numeric Display)顯示 %TM0.V(0~7 秒)

Schneider PLC 階梯圖程式 (Ladder Logic View)

EcoStruxure Machine Expert - Basic 中編寫梯形圖:

Plaintext
(* Rung 0: 開門馬達 %M100 控制與自鎖迴路 (互鎖關門極限 %M2 與關門馬達 %M101) *)
|--[ %M0   ]--+--[ / %M101 ]----[ / %M2 ]----------------------------( %M100 )--|
|             |
|--[ %M100 ]--+

(* Rung 1: 開門到位停門延時定時器 %TM0 (開門極限 %M2 導通且無人 %M0 觸發 7 秒) *)
          +-----------------------+
|--[ %M2 ]----[ / %M0 ]-----------|IN     |
                                  |  Type: TON            |
                                  |  Time base: 1 s       |
                                  |  Preset: 7            |
                                  +-----------------------+

(* Rung 2: 關門馬達 %M101 控制與自鎖迴路 (互鎖感測器 %M0、開門馬達 %M100 與關門極限 %M1) *)
|--[ %TM0.Q ]--+--[ / %M0 ]-----[ / %M100 ]-----[ / %M1 ]------------( %M101 )--|
|              |
|--[ %M101  ]--+

(* Rung 3: 將延時當前時間傳送至 %MW0 供 HMI 監視 *)
|------------------------------------------------------------[ %MW0 := %TM0.V ]--|

指令表 (Instruction List / IL)

程式碼片段
BLK Rung0
  LD    %M0
  OR    %M100
  ANDN  %M101
  ANDN  %M2
  ST    %M100
END_BLK

BLK Rung1
  LD    %M2
  ANDN  %M0
  IN    %TM0
END_BLK

BLK Rung2
  LD    %TM0.Q
  OR    %M101
  ANDN  %M0
  ANDN  %M100
  ANDN  %M1
  ST    %M101
END_BLK

BLK Rung3
  LD    1
  [%MW0 := %TM0.V]
END_BLK

EasyBuilder Pro 元件設定

  1. 紅外線感測器 (位元按鈕 Bit Switch)

    • 位址%M0型態交替型 (Toggle)

    • 圖形:取消勾選「使用圖片」,State 0: 灰色 (無人) / State 1: 亮黃色 (感應有人)

  2. 關門極限開關 (位元按鈕 Bit Switch)

    • 位址%M1型態交替型 (Toggle)

    • 圖形:取消勾選「使用圖片」,State 0: OFF / State 1: ON (門完關)

  3. 開門極限開關 (位元按鈕 Bit Switch)

    • 位址%M2型態交替型 (Toggle)

    • 圖形:取消勾選「使用圖片」,State 0: OFF / State 1: ON (門完開)

  4. 開門馬達 (位元燈 Bit Lamp)%M100(綠色)

  5. 關門馬達 (位元燈 Bit Lamp)%M101(藍色)

  6. 延時計數 (數值顯示 Numeric Display)%MW0(16-bit Unsigned,監視 %TM0.V 0~7秒)

3. EasyBuilder Pro 畫面安排 SVG 檔案碼




4. 測試 PLC 程式的方法(按鈕操作順序)

在電腦模擬測試時,請按照以下順序操作按鈕,驗證開門、延時、關門與防夾邏輯:

測試流程 A:正常開門 ➔ 7秒延時 ➔ 關門

  1. 初始狀態:將 關門極限 (%M1) 切換為 ON(表示門目前為完全關閉狀態)。

  2. 有人進入:將 紅外線感測器 (%M0) 切換為 ON

    • 觀察開門馬達 (%M100) 亮燈,開門動作開始。將 關門極限 (%M1) 切換為 OFF

  3. 門完全打開:將 開門極限 (%M2) 切換為 ON

    • 觀察開門馬達 (%M100) 熄滅,開門停止。

  4. 人離開區域:將 紅外線感測器 (%M0) 切換為 OFF

    • 觀察:延時計數 %MW0 開始從 0 倒數到 7

  5. 延時結束關門:當 %MW0 計時達到 7 秒 達標時:

    • 觀察關門馬達 (%M101) 自動亮燈,關門動作開始。

  6. 門完全關閉:將 開門極限 (%M2) 切換為 OFF,並將 關門極限 (%M1) 切換為 ON

    • 觀察關門馬達 (%M101) 熄滅,系統恢復初始靜止狀態。

測試流程 B:關門中途防夾(重新感應開門)

  1. 銜接上述流程 A 的第 5 步(關門馬達 %M101 正在亮燈運轉關門中)。

  2. 在關門途中,突然將 紅外線感測器 (%M0) 切換為 ON(模擬有人走過)。

  3. 觀察

    • 關門馬達 (%M101) 瞬間熄滅(立刻停止關門)。

    • 開門馬達 (%M100) 立刻亮燈(重新執行開門動作),確保安全防夾!

正確的 %M1%M2 開關狀態變化對照

步驟動作紅外線 %M0關門極限 %M1開門極限 %M2開門馬達 %M100延時計數 %MW0關門馬達 %M101說明
1有人靠近ONOFFOFF亮燈 (開門)0熄滅啟動開門
2門開到位ONOFFON熄滅 (停止)0熄滅觸發開門極限 %M2
3人離開OFFOFFON熄滅0 ➔ 7 秒熄滅%M1 必須保持 OFF! 開始倒數 7 秒
4延時達標OFFOFFON熄滅7 秒達標自動亮燈 (關門)%M101 成功啟動關門!
5門關到位OFFONOFF熄滅0熄滅 (停止)門關好碰到 %M1,關門馬達停止

正確測試的修正步驟

  1. %M0 設為 ON ➔ 開門馬達 %M100 亮燈。

  2. %M2 切換為 ON(保持 ON)➔ 開門馬達 %M100 熄滅。

  3. %M0 切換為 OFF注意:%M1 保持 OFF)➔ %MW0 開始從 0 計數至 7

  4. 等待 7 秒達標關門馬達 %M101 自動亮燈啟動!

  5. 門完全關閉時最後再將 %M1 切換為 ON(同時將 %M2 切回 OFF),關門馬達 %M101 熄滅停止。





EasyBuilder Pro 元件 與 Schneider EcoStruxure Machine Expert - Basic PLC ( PLC 100範例 -27 )

EasyBuilder Pro 元件 與 Schneider EcoStruxure Machine Expert - Basic PLC  ( PLC 100範例 -27 ) 



1. 說明圖片(控制邏輯與原理)

圖片展示的是工業上非常經典的 電動機星-三角(Y-Δ)降壓啟動控制

  • 控制目的:大功率三相非同步電動機直接啟動時電流極大(約為額定電流的 4~7 倍)。為了避免對電網造成衝擊,啟動時先將繞組接成 Y(星形)接法降壓啟動,待轉速提升後,再切換為 Δ(三角形)接法全壓正常運轉

  • 元件說明與原理

    1. 主接觸器 KM0 (Y0):負責將電源送入馬達主端子。

    2. 星形接觸器 KM1 (Y1):將馬達尾端三相短接,形成星形降壓。

    3. 三角形接觸器 KM2 (Y2):將馬達首尾相連,形成三角形全壓。

    4. 定時器 T0 (10 秒):控制 Y 接法降壓啟動的時間。

    5. 定時器 T1 (1 秒):Y 與 Δ 切換之間的死區時間(Dead Time),防止 KM1KM2 同時導通造成相間短路。

  • 動作流程

    • 按下啟動按鈕 X0KM0KM1 同時吸合,馬達星形(Y)降壓啟動,定時器 T0 開始計時 10 秒。

    • T0 計時達 10 秒 ➔ KM1 斷開,同時啟動延時定時器 T1(計時 1 秒)。

    • T1 計時達 1 秒 ➔ KM2 吸合,馬達轉為三角形(Δ)全壓運轉,並保持自鎖。

    • 按下停止按鈕 X1 ➔ 所有接觸器立即釋放,馬達停止運轉。

2. EasyBuilder Pro 元件設計與 Schneider PLC 程式

點位與暫存器規劃(配合規則:%M0~%M99 為按鈕,%M100~%M199 為指示燈/輸出)

功能名稱原圖位址Schneider PLC 位址EasyBuilder Pro 元件類型說明
啟動按鈕X0%M0位元按鈕 (Momentary)綠色按鈕
停止按鈕X1%M1位元按鈕 (Momentary)紅色按鈕
主接觸器 KM0Y0%M100位元燈 (Bit Lamp)綠色指示燈
星形接觸器 KM1Y1%M101位元燈 (Bit Lamp)黃色指示燈 (Y 降壓)
三角形接觸器 KM2Y2%M102位元燈 (Bit Lamp)藍色指示燈 (Δ 運轉)
Y 降壓計時顯示-%MW0數值顯示 (Numeric Display)顯示 %TM0.V(0~10 秒)
切換間隔計時顯示-%MW2數值顯示 (Numeric Display)顯示 %TM1.V(0~1 秒)

Schneider PLC 階梯圖程式 (Ladder Logic View)

在 EcoStruxure Machine Expert - Basic 中編寫梯形圖:

Plaintext
(* Rung 0: 主接觸器 %M100 控制與自鎖迴路 *)
|--[ %M0   ]--  +--[ / %M1 ]-------------------------------------------( %M100 )--|
|                     |
|--[ %M100 ]--+

(* Rung 1: 星形降壓計時器 %TM0 (時基 1s,預設 10s) *)
                                              +-----------------------+
|--[ %M100 ]----------------------|IN                          |
                                              |  Type: TON          |
                                              |  Time base: 1 s    |
                                              |  Preset: 10           |
                                              +-----------------------+

(* Rung 2: 星形接觸器 %M101 控制 (需互鎖 /%TM0.Q 與 /%M102) *)
|--[ %M100 ]-----[ / %TM0.Q ]-----[ / %M102 ]------------------------( %M101 )--|

(* Rung 3: 切換死區時間計時器 %TM1 (當 %TM0.Q 達標且 %M101 釋放後計時 1s) *)
                                                   +-----------------------+
|--[ %TM0.Q ]----[ / %M101 ]------|IN                         |
                                                    |  Type: TON         |
                                                    |  Time base: 1 s   |
                                                    |  Preset: 1            |
                                                   +-----------------------+

(* Rung 4: 三角形接觸器 %M102 控制 (由 %TM1.Q 觸發,需互鎖 /%M101 與自鎖) *)
|--[ %TM1.Q ]--+--[ / %M101 ]-----[ / %M1 ]--------------------------( %M102 )--|
|                       |
|--[ %M102  ]--+

(* Rung 5: 當前計時值傳送至 %MW 暫存器供 HMI 監視 *)
|------------------------------------------------------------[ %MW0 := %TM0.V ]--|
|------------------------------------------------------------[ %MW2 := %TM1.V ]--|

指令表 (Instruction List / IL)

程式碼片段
BLK Rung0
  LD    %M0
  OR    %M100
  ANDN  %M1
  ST    %M100
END_BLK

BLK Rung1
  LD    %M100
  IN    %TM0
END_BLK

BLK Rung2
  LD    %M100
  ANDN  %TM0.Q
  ANDN  %M102
  ST    %M101
END_BLK

BLK Rung3
  LD    %TM0.Q
  ANDN  %M101
  IN    %TM1
END_BLK

BLK Rung4
  LD    %TM1.Q
  OR    %M102
  ANDN  %M101
  ANDN  %M1
  ST    %M102
END_BLK

BLK Rung5
  LD    1
  [%MW0 := %TM0.V]
  [%MW2 := %TM1.V]
END_BLK

EasyBuilder Pro 元件設定

  1. 啟動按鈕 (位元按鈕 Bit Switch)

    • 位址%M0型態復歸型 (Momentary)

    • 圖片設定:取消勾選「使用圖片」,State 0: 綠色 / State 1: 亮綠色,標籤:馬達啟動

  2. 停止按鈕 (位元按鈕 Bit Switch)

    • 位址%M1型態復歸型 (Momentary)

    • 圖片設定:取消勾選「使用圖片」,State 0: 紅色 / State 1: 亮紅色,標籤:馬達停止

  3. 主接觸器 KM0 (位元燈 Bit Lamp)%M100(綠色)

  4. 星形接觸器 KM1 (位元燈 Bit Lamp)%M101(黃色 / Y 降壓)

  5. 三角形接觸器 KM2 (位元燈 Bit Lamp)%M102(藍色 / Δ 運轉)

  6. 計時顯示 (數值顯示 Numeric Display)%MW0(16-bit Unsigned,監視 %TM0.V 0~10秒)

3. EasyBuilder Pro 畫面安排 SVG 檔案碼


4. 測試 PLC 程式的方法(按鈕操作順序)

在電腦進行模擬測試時,請按照以下步驟與順序點擊按鈕,並觀察指示燈變化:

  • 步驟 1:觸發啟動

    1. 點選 HMI 模擬畫面上的 馬達啟動 (%M0) 按鈕一下(點擊後放開,因為是 Momentary 觸發)。

    2. 觀察

      • KM0 主接觸器 (%M100)KM1 星形接觸器 (%M101) 同時點亮變色。

      • KM2 三角形接觸器 (%M102) 保持熄滅。

      • %MW0 開始從 0 秒計時到 10 秒。

  • 步驟 2:觀察 Y-Δ 自動切換過程

    1. %MW0 計時達到 10 秒 的瞬間:

      • KM1 星形接觸器 (%M101) 立即熄滅

      • %MW2 開始進行 1 秒死區時間計數。

    2. %MW2 達到 1 秒 後:

      • KM2 三角形接觸器 (%M102) 自動點亮

      • 此時 KM0 (%M100)KM2 (%M102) 保持常亮,馬達正式進入三角形全壓運轉狀態!

  • 步驟 3:測試互鎖機制與緊急停止

    1. 在馬達全壓運轉時,點擊 緊急停止 (%M1) 按鈕一下。

    2. 觀察:所有指示燈(KM0, KM1, KM2)立即全部熄滅,計數歸零,馬達安全停止運轉。





Node-Red 抓取 opendata 的資料集產生AQI 空氣品質指

Node-Red 抓取 opendata 的資料集產生AQI 空氣品質指標 實現透過 Node-RED 抓取環境部 OpenData(空氣品質 AQI)資料,最核心的流程為: 注入觸發(Inject) → HTTP 請求(http request) → 解析 JSON 資料(Fu...