產線有感應器會每分鐘紀錄環境狀況, 為了更快發現環境是否有變化, 就可以透過程式分析紀錄的數值.
上週已經用移動平均的概念, 撈取最近一筆資料, 再比對往前一小時的平均值, 如果超過幾個標準差, 就通知工程師留意.
而實作上, 基本的功能就是用陣列, 再撈取指定的欄位, 以及最近的筆數來計算. 大概的步驟是:
- 設定撈取筆數, 分為平均用的筆數(例如: 60 )與比對用的筆數(例如: 3 , 因為分析程式每 3 分鐘執行一次, 所以比對最近 3 筆)
- 依目前時間, 將環境資料檔(.csv)讀入陣列, 因為每日會切割檔案, 所以凌晨 0:00~1:13 , 會讀兩個檔(當日與前一日), 用 60 + 3 再考慮電腦傳檔的誤差 10 分鐘. 這邊基本上還沒過濾, 因為檔案讀入陣列是一個 function 的設計, 不介入資料類型.
- 讀入陣列後, 用迴圈比對資料陣列, 挑出特定欄位, 直到滿足需要的筆數為止; 而這邊的設計就是可以考慮用指標, 或再產生一組新陣列存放真正需要的資料. 而選擇用指標, 是因為不同環境數值產生的陣列樣式不太一樣, 為了不同環境數值要寫幾次類似但不同的程式, 用指標只要紀錄對應原始陣列的哪幾列跟哪幾欄就好.
- 找到指標後, 就可以把預定算平均的欄位挑出來, 再把指定筆數(跳過 3 筆, 再往前抓 60 筆)計算出平均跟標準差.
- 然後再針對目前要處理的這一項, 比對最近的 3 筆, 與移動平均差了幾個標準差, 如果差太多, 就先紀錄在預定通知的陣列.
- 而全部的項目都執行過之後, 再來整理預定通知的陣列, 把需要通知的項目都轉成文字說明, 合併為同一串要傳送的文字.
- 最後檢查有需要通知的項目, 再把文字跟傳送對象, 轉給 LINE Notify function , 視情況也可以改成呼叫 mail 或其他通知方式.
除了用指標的方式, 也可以先定義好要撈取的欄位, 開檔案後直接邊撈邊比對, 但是考慮環境資料驗證的功能, 與讀檔案是否會造成 lock 的情況, 還是先複製一份, 之後直接把符合的筆數建立指標陣列處理.
https://www.linkedin.com/pulse/%25E7%2594%25A8%25E6%258C%2587%25E6%25A8%2599%25E6%25A6%2582%25E5%25BF%25B5%25E7%25B0%25A1%25E5%258C%2596%25E7%25A8%258B%25E5%25BC%258F%25E6%259E%25B6%25E6%25A7%258B-%25E8%2590%258A%25E5%25A7%2586-%25E5%258F%25B2