DemoBox_Boiler 是一個以 Windows Forms 建立的鍋爐監控與控制示範程式,整合了 PLC 通訊、現場設備狀態顯示與相機火焰偵測。
主要功能如下:
- 透過
TwinCAT.Ads連接 PLC,讀寫GVL.*變數(類比值、DO、DI、火焰偵測結果)。 - 以 HMI 形式顯示鍋爐元件狀態(blower、valve、pump、DI 指示)。
- 以 OpenCvSharp 讀取相機影像,執行火焰辨識(顏色 + 動態 + 幾何條件 + 去抖動)。
- 偵測到火焰後在畫面標示並同步回寫
GVL.bFireDetected。
Program.Main():程式進入點。NativeBootstrap.EnsureOpenCvNativeReady():先將 OpenCvSharp 需要的原生 DLL 釋出到%LOCALAPPDATA%\DemoBox_Boiler\native\x64,並設定SetDllDirectory與PATH。
FormMain:主視窗與核心流程控制。- 主要使用多個
Timer:_fanTimer:blower 動畫更新。_adsPoll:週期輪詢 PLC 資料。_camTimer:相機擷取與火焰偵測。
AdsClientEx:對AdsClient的包裝,提供:- 連線 (
Connect) - Handle 管理 (
CreateHandle/DeleteHandle) - 讀寫 (
ReadAny/WriteAny/WriteBool)
- 連線 (
FormMain.AdsConnect():建立 PLC 變數 handle,啟動輪詢。FormMain.AdsDisconnect():釋放 handle、停止輪詢與 UI 狀態復原。
StartCamera()/StopCamera():控制VideoCapture生命週期。CamTimer_Tick():逐幀讀取影像 -> 呼叫DetectFire()->UpdateFireStable()-> 更新 UI。DetectFire():- HSV 顏色範圍過濾(紅/橘/黃)
- 亮度/飽和度條件
- 與前一幀差分的動態判斷
- 形態學處理與輪廓幾何過濾
UpdateFireStable():以連續幀投票 + cooldown 減少誤報與閃爍。
- 啟動程式時先執行
EnsureOpenCvNativeReady(),確保原生 DLL 可載入。 - 建立
FormMain並初始化 UI 與計時器事件。 - 使用者點擊連線區域(
lblAdsState)觸發AdsConnect():- 嘗試 ADS port
851,失敗再試852。 - 建立
GVL.*的 variable handle。
- 嘗試 ADS port
_adsPoll週期讀取 PLC 值,更新:- gauge / thermometer 類比畫面
- DO/DI 圖示與資訊卡
- 使用者點擊相機區域(
pbCameraView)啟動相機後:_camTimer逐幀偵測火焰- UI 顯示偵測框與告警狀態
- 狀態變更時寫入
GVL.bFireDetected
- 關閉程式時停止所有計時器、關閉相機、解除 ADS 連線並釋放資源。
Program.cs:啟動與 OpenCv 原生 DLL bootstrap。Form1.cs:UI 邏輯、ADS 通訊、相機與火焰偵測核心。Form1.Designer.cs:Windows Forms 控制項配置。Properties/Resources.resx:UI 圖像與內嵌 DLL 資源。DemoBox_Boiler.csproj:目標框架、NuGet 依賴與輸出設定。
.NET Framework 4.8Windows FormsOpenCvSharp4Beckhoff.TwinCAT.AdsCostura.Fody(組件打包)
- 本專案預設以 x64 執行,且需對應的 OpenCV native DLL。
- ADS 連線前請確認 TwinCAT Runtime 已啟動、路由正確、PLC 符號已可讀。
GVL變數名稱需與 PLC 專案一致,否則會出現DeviceSymbolNotFound (0x710)。
