先保存raw 再決定工程值是否可用
類比輸入每次取樣至少要分開保存raw、取樣時間、通道電流或電壓、quality與診斷原因。raw是模組送出的原始碼,不等於所有PLC都使用相同範圍;有的模組可能以0–32767代表有效量程,有的使用有號值或保留碼。本文的數字只在明示配置下成立,不能把它們移植到未知模組。
假設某通道資料表明定0–10 V對應0–16000 counts,且一次讀到1000、10000、16000。若量程線性,工程值分別是0.625、6.25與10 V;但若同一模組切換為±10 V模式,公式與零點立即不同。因此程式啟動時應載入通道設定版本,設定不一致時標為ConfigurationError,不要沿用上次的換算。
保存策略可分為raw、filtered、engineering與lastGood。raw永遠記錄,filtered只在品質合格且濾波器有足夠樣本時更新,engineering由filtered換算,lastGood只在Good時更新。當輸入超量程或診斷失敗,engineering可以保留上一個有效值供畫面顯示,但必須同時把quality設為Bad,不能讓使用者誤以為數值仍新鮮。
先定義時間語意:sampleTime是模組取樣時間,receiveTime是控制器收到資料的時間,displayTime是畫面繪製時間。三者不可混成一個timestamp。有可信來源時間時用sampleTime輔助排序;沒有模組來源時間就保留未知,不能自行捏造,若資料跨網路或佇列延遲,另外計算receiveTime−sampleTime並標示兩端時鐘是否同步。
| 配置(示例) | raw | 換算結果 | quality |
|---|---|---|---|
| 0–10 V / 0–16000 | 1000 | 0.625 V | Good |
| 0–10 V / 0–16000 | 10000 | 6.25 V | Good |
| 0–10 V / 0–16000 | 16000 | 10 V | Good |
濾波要保留延遲與缺樣資訊
濾波不是把所有異常值改成看起來平滑。先決定取樣週期、窗口、啟動條件與缺樣策略,再計算。以每100 ms一筆的三點移動平均為例,樣本10、11、12得到11;下一筆13得到(11+12+13)/3=12。輸出時間應標記為最新樣本時間,並記錄窗口內樣本數。
啟動時若只有一筆樣本,不要把缺少的兩筆當成0,除非規格明確這樣定義。可選策略是等待滿窗口後才輸出Good,或用已有樣本平均但標記Warmup。兩者都可以,但要在驗收表寫清楚,否則同一通道重啟後會短暫出現不同結果。
缺樣與品質不應被濾波器吞掉。若窗口三筆中有一筆Bad,可依規格拒絕整窗、只用Good樣本,或保留上一個filtered;不能默默把Bad raw當0。若只剩兩筆Good,輸出數值旁要帶有效樣本數與Uncertain狀態,讓下游知道這不是完整窗口。
例如三筆raw為1000、1010、1005,均屬Good,平均為1005;下一次收到1005、Bad、1007,若策略是Bad即拒絕,filtered保持1005但quality為Uncertain。這與把Bad替換成0後得到約670.67不同,後者會製造不存在的物理變化。
| 窗口資料 | 有效樣本 | 三點平均策略 | 輸出 |
|---|---|---|---|
| 1000,1010,1005 | 3 | 平均 | 1005 / Good |
| 1005,Bad,1007 | 2 | 拒絕整窗 | 保持1005 / Uncertain |
| 缺兩筆 | 1 | 等待滿窗 | 無新值 / Warmup |
超量程 飽和與故障碼不可混稱
超量程可能表示輸入高於配置上限,也可能是模組以保留raw碼表示斷線或硬體錯誤。必須先讀資料表,確認哪些raw是有效量測、哪些是UnderRange、OverRange、OpenCircuit或模組Fault。若手冊只說明診斷位而未指定raw,程式應以診斷位為主,raw僅作追蹤,不要自行猜碼。
飽和是轉換結果停在上限或下限,真正输入可能仍繼續增加。如果raw一直16000,可能剛好10V,也可能ADC已夾住更大的輸入;沒有獨立超量程診斷或參考量測,不能由最大碼唯一判定實際電壓。保留飽和疑義與原始診斷,禁止把每個最大碼都當精確10V。
假設某模組文件明定16000是10 V滿量程、16384是OverRange碼,讀到16384時不能換算成10.24 V後當作正常工程值;應保存raw=16384、quality=Bad、reason=OverRange。本例0–10V中低值可能完全合法,不能以低於100就推斷開路;必須使用該通道實際具備的斷線診斷證據。
恢復策略也要明確。輸入由Fault回到正常時,先要求連續三筆Good,再更新filtered與lastGood;這三筆的時間和raw要留在事件記錄。若控制用途要求更快恢復,需由工程規格明訂,不可因畫面看起來正常就跳過恢復確認。
案例:前一筆有效raw為12000,之後連續讀到16384、16384、11800、11950、12010。前兩筆記錄超量程,第三筆仍不立即恢復,第四筆是第二筆Good,第五筆才達三筆Good,本例恢復時重建三点平均,(11800+11950+12010)/3=11920,換算7.45V;不能一邊宣稱已平均,一邊直接用最後一筆12010換算。這個流程避免單一雜訊碼造成反覆切換。
| raw | 診斷(假設文件定義) | 工程值 | 品質 |
|---|---|---|---|
| 12000 | Normal | 7.5 V | Good |
| 16384 | OverRange | 不更新 | Bad |
| 11800 | Normal | 不立即更新 | Uncertain |
| 12010 | Normal,第三筆Good | 7.45 V | Good |
五 驗收 排查與限制
驗收文件要把通道模式、原始碼範圍、單位、取樣週期、濾波窗口、啟動策略、缺樣規則、故障碼來源與lastGood策略分開列出。不要只寫「類比輸入正常」,因為換一張模組或改成另一個量程後,這句話無法驗證。每一筆測試都保留原始資料,讓審查者能重算工程值。
測試至少包含正常三點、窗口未滿、缺一筆、超量程、恢復三筆與重啟。若採用0–16000的示例配置,raw=8000應是5 V;但這只是該配置的算例。若實際模組的滿量程是32767,驗收表要重新計算,不能只把8000複製過去。
失敗先查資料鏈:先確認通道設定版本,再確認raw是否來自正確通道,接著查quality與診斷位,最後檢查濾波器狀態。畫面顯示的lastGood若很久未更新,必須同時顯示sampleTime與age;保留舊值不是恢復通訊,也不是安全許可。
這套資料處理適合監視、記錄與一般控制的輸入品質管理,不宣稱任何PLC或模組具有相同診斷碼、原子更新或濾波功能。若數值要用於保護或停機,應採用設備與安全規格指定的獨立訊號和驗證流程;本篇的Bad、Uncertain與lastGood只描述資料狀態。
可把資料處理寫成明確的狀態轉換,而不是在一個算式中混合所有條件。Initializing等待設定與首筆資料,Good接受並濾波,Uncertain保留lastGood並增加age,Bad保存raw與原因,ConfigurationError則拒絕工程換算。每次狀態轉換都記錄前後狀態與觸發樣本。
對長時間沒有新樣本的情況,另設stale時間而非沿用Bad門檻。例如規格要求500 ms內必須有新資料,age超過500 ms就標Stale;這個500 ms是專案通訊要求,不是所有類比模組的通用數字。Stale時仍可保留lastGood供診斷,但不可寫入一般自動控制。兩次重啟之間也要比較設定版本與通道識別。若通道從0–10 V改成4–20 mA,舊filtered與lastGood不能跨設定沿用;應清除工程值、保留raw歷史並等待新模式的第一筆Good。這能避免換線或換模組後畫面出現看似合理但其實來自舊量程的數字。
FAQ與官方來源
FAQ:為什麼raw不能直接換算? 因為raw範圍、符號、保留碼與量程模式由模組定義,必須先核對資料表和設定版本。
FAQ:Bad時能顯示上一個有效值嗎? 可以,但要同時標Bad或Uncertain、lastGood時間與age,並禁止把它當成新鮮有效輸入。
FAQ:濾波窗口缺樣可以補零嗎? 除非規格明確要求,否則不應補零;應等待、拒絕整窗或依明訂規則只用Good樣本。
FAQ:超量程恢復要等幾筆? 沒有通用筆數;依專案定義連續有效樣本與時間,並把恢復樣本保存供驗收。
參考:NI REM-11102資料表:輸入縮放、Open circuit與Overrange為產品特定定義