多語言版本 / Multi-language Version
English Version (CHANGELOG_EN.md) | 中文版本 (CHANGELOG.md)
- 遷移至 loguru:完全移除自訂的
logger.py模組,改用loguru作為統一日誌系統- 所有模組直接使用
loguru的logger物件 - 提供更強大的日誌功能和更好的性能
- 支援 TRACE、DEBUG、INFO、WARNING、ERROR 五個日誌級別
- 所有模組直接使用
- 統一日誌標籤:所有日誌訊息統一使用
[模組名稱]格式標籤[main]- 主程式相關日誌[prowavedaq]- DAQ 設備通訊日誌[csv_writer]- CSV 寫入器日誌[sql_uploader]- SQL 上傳器日誌- 便於過濾和追蹤特定模組的日誌
- 日誌配置優化:
- 控制台輸出:INFO、DEBUG、WARNING、TRACE 到 stdout,ERROR 到 stderr
- 檔案輸出:所有級別(TRACE 及以上)記錄到
logs/loguru.log - 自動日誌輪轉:10 MB 大小限制,保留 7 天
- 統一時間格式:
[YYYY-MM-DD HH:MM:SS] [LEVEL] [模組名稱] 訊息內容
- 新增 TRACE 級別日誌:用於追蹤函數入口/出口和詳細的數據處理流程
- 新增 DEBUG 級別日誌:用於記錄配置讀取、連接狀態、性能指標等調試資訊
- 日誌級別調整:將重要性較低的 INFO 訊息調整為 DEBUG 或 TRACE
- 配置讀取成功 → DEBUG
- 目錄創建 → DEBUG
- 線程啟動 → DEBUG
- 文件下載 → DEBUG
- 臨時文件操作 → DEBUG
- 保留重要 INFO 訊息:
- 系統啟動/關閉
- 開始/停止資料收集
- DAQ 設備狀態變化
- 重要錯誤
- 完善註解:為所有函數添加清晰的 docstring 和必要的註解
- 日誌覆蓋:所有關鍵函數和數據處理流程都添加了適當級別的日誌
- 錯誤處理:改進錯誤訊息的日誌記錄,包含更多上下文資訊
- 新增
loguru>=0.7.3依賴套件 - 移除自訂的
logger.py模組
- 日誌格式保持一致的風格,便於閱讀和過濾
- 所有功能保持不變,僅改進日誌系統
- 實作智慧讀取邏輯:利用 Data Header 更新剩餘數量,不再每次詢問 Size
- 新增
cached_buffer_size本地快取機制,減少 50% 的 Modbus 通訊流量 - 讀取回來的 Header 會自動更新本地計數,只有當計數為 0 時才詢問硬體
- 大幅提升通訊效率,減少延遲
- 新增
- 新增開機自動清空功能(Hardware Buffer Flush)
- 啟動時自動排空感測器積壓的舊資料(最多清空 500 個封包,約 6 萬筆資料)
- 避免因感測器內積壓大量資料而造成的延遲問題
- 確保系統啟動後立即進入即時模式
- 移除所有不必要的 sleep,榨乾 RS485 頻寬
- 僅在緩衝區為空時使用 0.001 秒的短暫休息,避免 CPU 100%
- 極速模式:全力讀取,不浪費時間
- 佇列容量擴增:從 5000 增加到 50000,減少資料遺失風險
- 錯誤處理改進:讀取失敗時重置本地計數,確保資料一致性
- 解決 IO 瓶頸:移除每筆資料都 flush 的機制,改為定期刷新
- 新增時間基礎刷新機制(Time-based Flush):每 1 秒才強制刷新一次硬碟
- 大幅減少硬碟寫入次數,提升寫入效能
- 啟用檔案緩衝:設定 128KB 緩衝區(
buffering=131072)- 減少系統呼叫次數,提升整體 IO 效能
- 批次寫入優化:使用
writerows()取代迴圈中的writerow()- 一次寫入多行資料,比逐行寫入快得多
- 時間精度改進:保留微秒級時間戳記
- 時間戳記格式改為
'%Y-%m-%d %H:%M:%S.%f',包含微秒精度
- 時間戳記格式改為
- 資料完整性保證:在
update_filename()和close()中使用os.fsync()- 確保資料確實寫入物理硬碟,避免資料遺失
- Modbus 通訊效率提升約 50%(智慧讀取邏輯)
- CSV 寫入效能大幅提升(減少 flush 次數和系統呼叫)
- 系統啟動後立即進入即時模式(自動清空舊資料)
- 減少資料遺失風險(佇列容量擴增)
- 修正: SQL資料庫時間戳未顯示到毫秒
- 修改 sql_uploader.py 程式碼建立資料表部分。
- 優化:資料夾建立邏輯改進
- 只有在啟用 CSV 或 SQL 時才建立輸出資料夾
- 避免在不需要儲存檔案時建立空資料夾
- 如果 SQL 啟用但 CSV 未啟用,也會建立資料夾以存放 SQL 暫存檔
- 重大更新:遵循原廠手冊規範
- 基於原廠手冊 RS485_ModbusRTU通訊說明_PwDAQ.pdf 第 5 頁規範
- 使用 FC04 (Read Input Registers)
- 起始位址為 0x02 (Raw data FIFO buffer size)
- 讀取架構:[Size(1 word)] + [Data(N words)]
- 從 0x02 開始一次讀取完整封包(包含 Header + Data)
- 封包解析:
raw_packet[0]是 Header(剩餘大小),raw_packet[1:]是實際資料
- 優化:讀取效能提升
- 超時時間優化:1 秒 → 0.5 秒
- 添加
skip_encode_mobile = True以優化讀取效能 - 遵循手冊 Page 5 流程,減少讀取次數
- 重大更新:移除循環緩衝區,改用降頻佇列架構
- 移除固定大小循環緩衝區(
realtime_data_buffer、realtime_time_buffer) - 改用
web_data_queue存儲降頻後的資料供前端使用 - 降頻比例:50(每 50 點取 1 點,約 156 Hz 更新率)-> 目前為 25:1
- 前端資料傳輸量減少約 98%(50:1 降頻)-> 目前為 25:1
- CSV 和 SQL 仍使用原始資料(不降頻,保持完整資料)
- 移除固定大小循環緩衝區(
- 改進:前端顯示優化
- 增量更新方式:使用
push()將新資料加到圖表右側 - 使用
splice()移除左側舊資料,維持固定視窗大小(500 點)-> 目前為 1000 - 更新頻率:200ms → 100ms
- 關閉動畫:
animation: false(減少閃爍並提升即時性) - 關閉互動提示:
interaction.mode: 'none'(減少 CPU 消耗) - 不顯示資料點:
pointRadius: 0(提升繪圖效能)
- 增量更新方式:使用
- 改進:停止邏輯優化
- 立即更新 UI(解決延遲問題)
- 先停止前端更新,再發送停止請求給後端
- 即使網路錯誤,UI 也會立即停止
- 改進:狀態同步
- 檢查後端
is_collecting狀態 - 如果後端停止且無新資料,自動同步前端 UI
- 頁面載入時檢查後端狀態,自動恢復 UI
- 檢查後端
- 重大更新:固定大小循環緩衝區架構
- 使用 numpy array 建立固定大小的循環緩衝區(234,360 個資料點)
- 資料從第10秒位置開始寫入,前9秒保持為0
- 當資料超過10秒時,自動將舊資料往前推進(第10秒→第1秒→第2秒...→第9秒→第10秒)
- 時間陣列同步更新,前9個元素為0,只有最後一個元素有時間值
- 確保資料持續往前推進,不會停留在同一位置
- 改進:停止邏輯優化
- 立即停止 DAQ 讀取,然後停止資料收集執行緒
- 剩餘檔案上傳和存檔在背景執行,不阻塞前端回應
- 加入超時機制,避免無限等待
- 清理:移除未使用的變數和過時註解
- 移除
realtime_time_write_index、sql_data_buffer、sql_buffer_max_size等未使用變數 - 清理過時和不必要的註解
- 更新所有程式檔案的版本號為 6.0.2
- 移除
- 修正:修復前端資料點數量不穩定的問題
- 修正後端緩衝區截斷邏輯:確保截斷時保留完整的樣本(必須是3的倍數)
- 修正前端資料處理邏輯:確保只處理完整的樣本,避免不完整樣本導致資料點數量不一致
- 修正前端資料點限制計算:改為限制樣本數而非資料點數(78,120 個樣本 = 234,360 個資料點)
- 簡化前端分組邏輯,確保三個通道的資料點數始終一致
- 重大更新:執行緒架構重構
- 將 CSV 和 SQL 寫入分離到獨立執行緒
- 建立 5 個獨立執行緒:Flask Thread、DAQ Reading Thread、Collection Thread、CSV Writer Thread、SQL Writer Thread
- 使用
queue.Queue進行執行緒間通訊,確保執行緒安全 - 每個組件都在獨立的執行緒中運行,不會互相阻塞
- 資料流程:DAQ → Collection Thread → CSV/SQL 佇列 → 各自的寫入執行緒
- 改進:前端顯示優化
- 顯示最近 10 秒的資料(78,120 個資料點/通道)
- 不使用抽樣,繪製所有資料點以保持波形完整性
- 更新頻率:每 200ms 更新一次
- 資料點數顯示即時更新
- 改進:後端緩衝區優化
- 緩衝區大小:10 秒的資料量(234,360 個資料點)
- 保留最近 10 秒的資料供前端顯示
- 新增:執行緒同步機制
- 使用
queue.Queue進行執行緒間通訊(執行緒安全) - 停止時等待所有佇列處理完成,確保資料不遺失
- 使用
- 重大更新:移除 Master.ini,改用 csv.ini 和 sql.ini
- 將 Master.ini 的功能拆分為兩個獨立的設定檔
- csv.ini:包含 CSV 分檔間隔設定([DumpUnit] 區段的
second參數) - sql.ini:包含 SQL 上傳間隔設定([DumpUnit] 區段的
second參數) - 統一命名規則:兩個設定檔都使用
second作為參數名稱 - 前端設定頁面更新:移除 Master.ini 區段,新增 csv.ini 區段
- 所有功能保持不變,僅改變設定檔結構
- 改進:統一表單欄位命名規則
- CSV 分檔間隔欄位:
csv_second - SQL 上傳間隔欄位:
sql_second - 保持命名規則一致性
- CSV 分檔間隔欄位:
- 新增:網站 favicon 支援
- 所有頁面(index.html、config.html、files.html)都使用 imCloud.jpg 作為 favicon
- 使用 Flask 的
url_for('static', filename='imCloud.jpg')正確載入
- 改進:前端顯示時間尺度設定為 10 秒
- 前端圖表顯示最近 10 秒的資料(每個通道約 78,120 個資料點)
- 後端緩衝區限制為 10 秒的資料量(234,360 個資料點,包含 3 個通道)
- 計算:7812 Hz × 10 秒 = 78,120 個點/通道
- 優化記憶體使用,避免緩衝區無限增長
- 重大更新:SQL 上傳邏輯重構
- 改為暫存檔案機制:資料先寫入暫存 CSV 檔案,定時上傳
- 建立暫存檔案目錄(
.sql_temp),檔案命名格式:{timestamp}_sql_temp.csv - 新增定時上傳執行緒(
sql_upload_timer_loop),每sql_upload_interval秒檢查並上傳 - 上傳成功後自動刪除暫存檔案,並立即建立新暫存檔案(避免資料溢出)
- 停止時檢查並上傳所有剩餘暫存檔案
- 降低記憶體使用:資料直接寫入檔案,不佔用記憶體緩衝區
- 資料持久化:即使程式異常終止,暫存檔案仍保留
- 新增:
sql_uploader.py新增upload_from_csv_file()方法- 從 CSV 檔案讀取資料並批次上傳至 SQL 伺服器
- 支援自動建立資料表(如果不存在)
- 包含錯誤處理與重試機制
- 改進:程式碼註解完善
- 為所有核心模組添加完整的中文註解
- 所有函數和類別都有詳細的 docstring
- 說明函數用途、參數、返回值、注意事項
- 移除所有冗餘註解和步驟標記
- 提升程式碼可讀性和可維護性
- 改進:技術文件更新
- 更新 README.md 和 程式運作說明.md 以符合目前程式碼
- 確保文件與實際程式碼功能一致
- 重大更新:重構資料讀取邏輯
- 實現 Normal Mode 和 Bulk Mode 自動切換機制
- 根據緩衝區狀態(buffer_count)動態選擇讀取模式
- Normal Mode:當 buffer_count ≤ 123 時,從 Address 0x02 讀取
- Bulk Mode:當 buffer_count > 123 時,從 Address 0x15 讀取(最多 9 個樣本)
- FIFO buffer size(0x02) 連同資料一起讀出,確保資料一致性
- 改進:讀取效率優化
- 一次讀取 Header 和資料,減少 Modbus 通訊次數
- 使用
_read_registers_with_header()方法統一處理讀取邏輯 - 參考 LabView 轉換版本(G.py)的實現方式
- 改進:程式碼清理
- 移除所有冗餘註解和步驟標記
- 簡化程式碼結構,提升可讀性
- 移除不再使用的舊方法(
_read_fifo_length、_read_raw_block等)
- 改進:即時資料顯示
- 移除資料點數限制(原本限制 100000 個資料點)
- 現在會保留並顯示所有資料
- 改進:文件更新
- 更新 README.md 和 程式運作說明.md
- 詳細說明 Normal Mode 和 Bulk Mode 的運作方式
- 更新資料流程圖和架構說明
- 新增:支援啟動時指定 port
- 可透過命令行參數
--port或-p指定 Flask 伺服器埠號 - 啟動腳本
run.sh和run_with_logs.sh支援傳遞 port 參數 - 預設 port 仍為 8080,向後相容
- 自動驗證 port 範圍(1-65535)
- 可透過命令行參數
- 重構:
prowavedaq.py架構優化- 重新組織程式碼結構,明確區分公開 API 和內部方法
- 簡化讀取邏輯,移除
remaining_data機制(每次讀取都是完整批次) - 改進 Modbus 連線管理(
_connect、_disconnect、_ensure_connected) - 新增 Modbus 寄存器常數定義(
REG_SAMPLE_RATE、REG_FIFO_LEN等) - 模組化讀取流程(
_read_fifo_length、_read_raw_block、_convert_raw_to_float_samples) - 改進錯誤處理和重連邏輯
- 確保每次讀取只處理完整的 XYZ 三軸組,避免通道錯位
- 改進:程式碼註解
- 為所有核心模組添加詳細的中文註解
- 說明函數用途、參數、返回值、注意事項
- 解釋關鍵設計決策和資料流程
- 提升程式碼可讀性和可維護性
- 改進:日誌系統
- 統一 Debug 訊息標籤為
[DEBUG](與其他級別一致) - 改進日誌輸出格式的一致性
- 統一 Debug 訊息標籤為
- 新增:統一日誌系統 (
logger.py)- 提供統一的日誌格式:
[YYYY-MM-DD HH:MM:SS] [LEVEL] 訊息 - 支援 INFO、Debug、Error、Warning 四種級別
- 自動時間戳記
- 可控制 Debug 訊息開關
- 提供統一的日誌格式:
- 修正:通道錯位問題
- 處理資料長度不是3的倍數的情況
- 使用
remaining_data機制追蹤剩餘資料點 - 確保每次只處理完整的樣本(X, Y, Z 組合)
- 多執行緒安全保護(使用鎖定機制)
- 修正:時間戳記計算
- 根據取樣率自動計算每個樣本的時間戳記
- 確保分檔時時間戳記連續
- 每個樣本的時間間隔 = 1 / sample_rate 秒
- 改進:資料讀取邏輯
- 添加資料完整性檢查
- 重新連線時自動清空剩餘資料
- 停止讀取時處理剩餘資料
- 改進:分檔邏輯
- 確保切斷位置在樣本邊界(3的倍數)
- SQL 上傳時也確保樣本邊界
- 改進:日誌輸出
- 隱藏 Flask HTTP 請求日誌
- 只顯示應用程式的日誌訊息
- 新增:通道標示
- CSV 標題明確標示通道對應:Channel_1(X), Channel_2(Y), Channel_3(Z)
- 新增:分析文檔
通道錯誤可能性分析.md- 詳細分析可能導致通道錯誤的情況
- 新增:SQL 資料庫上傳功能
- 支援 MySQL/MariaDB
- 可選的 SQL 上傳功能
- 獨立的
sql.ini設定檔 - 前端可選擇使用 INI 設定或手動輸入
- 新增:資料保護機制
- SQL 上傳失敗時保留資料在緩衝區
- 最多重試 3 次,遞增延遲
- 只有上傳成功後才從緩衝區移除
- 新增:記憶體保護機制
- SQL 緩衝區上限設定(最多 10,000,000 個資料點)
- 超過上限時強制上傳
- 改進:設定檔管理介面
- 改為固定輸入框模式,防止誤刪參數
- 支援三個設定檔:
ProWaveDAQ.ini、Master.ini、sql.ini
- 改進:Master.ini 新增
sql_upload_interval參數- 控制 SQL 上傳間隔(秒數)
- 運作方式與 CSV 的
second參數相同
- 修復:讀取中進入 config 頁面再回到主畫面時,狀態會自動恢復
- 新增:檔案瀏覽功能,可瀏覽 output 目錄中的資料夾和檔案
- 新增:檔案下載功能
- 將 HTML 部分改為模板以簡化 Python 程式碼整潔性
- 初始版本發布
- 實現基本的即時資料採集與可視化功能
- Web 介面控制
- 自動 CSV 分檔儲存
多語言版本 / Multi-language Version
English Version (CHANGELOG_EN.md) | 中文版本 (CHANGELOG.md)