本專案為基於 C# .NET WinForms 開發的運動控制模擬軟體。開發目標在於實作使用者介面與邏輯狀態機,並透過非同步編程優化系統效能。
為確保使用者介面(UI)在執行耗時任務時不產生鎖死(Lock-up),本專案全面採用非同步架構:
- JSON 序列化存取:使用
await File.ReadAllTextAsync與Task.Run處理配方檔案讀寫。 - 任務分流:確保大量數據序列化邏輯運行於背景執行緒,維持 UI 執行緒的流暢度。
系統行為由明確的狀態機驅動,提升程式碼的可維護性與邏輯嚴密性:
- 狀態管理:定義
Idle、Moving、Homing與Error狀態。 - 行為封裝:將物理計算邏輯與狀態切換解耦,確保系統在不同狀態間跳轉時的行為一致。
實作工業等級的軟體互鎖機制,防止誤操作導致的系統異常:
- 動態權限控管:根據馬達即時狀態(Moving/Homing)動態鎖定或啟用 UI 控制項(如按鈕、參數輸入框)。
- 狀態同步:透過事件觸發機制,確保介面呈現與底層邏輯狀態高度同步。
在固定時間週期(100ms)下實作數值模擬:
- 離散步進計算:在計時器週期內處理連續數據的變化,並實作目標點位之補償與校正。
- 參數校驗:在進入運動邏輯前執行參數合法性檢查,防止除以零或溢位等運算異常。
透過生產者-消費者架構,解耦檔案寫入的衝突問題:
- 生產者:在log輸出的fuction與timer中加入呼叫寫入.db的功能。
- 消費者:用迴圈與暫存由舊到新依序寫入log資訊。
| 功能模組 | 技術實現 | 說明 |
|---|---|---|
| 參數管理 (Recipe) | System.Text.Json |
實作物件與檔案間的序列化轉換,支援本地檔案讀寫。 |
| 即時監控 (Monitor) | System.Windows.Forms.Timer |
實作 10Hz 採樣頻率的實時座標反饋。 |
| 日誌系統 (Logging) | ListBox 封裝 |
實作自動捲動與帶有時間戳記的系統行為紀錄。 |
| 物件導向 (OOP) | Motor Class |
將運動邏輯、座標狀態與參數配置進行物件化封裝。 |
| SQL日誌持久化輸出 (OOP) | SQLite Class |
將程式運作日誌輸出持久化成單獨資料 |
- Form1.cs:負責 UI 事件處理、非同步呼叫觸發與介面互鎖邏輯。
- Motor.cs:核心邏輯類別,包含狀態機驅動、位移數值演進與參數配置結構。
- SQLite.cs:核心邏輯類別,包含Dapper控制sql的輸入存檔。