溫度PID控制時, 有多個溫度測量點, 但最終只有一個溫度作為反饋值參與PID控制, 我們有時會采用平均值法, 計算所有溫度的平均值來作為PID的反饋值. 但在某一路溫度探頭斷線的情況下, 溫度值為零, 這時平均值就會小很多.
像這種情況下中值法比較有效. 原理如下: 對於一組溫度, 模擬量轉換為數字量后, 對溫度值進行排序, 取中間的那個值作為PID反饋值. 如果是偶數, 取中間兩個值除以2后作為反饋值.
排序采用西門子LGF的庫中的希爾排序, 但它是FB的, 使用上還的帶個DB塊, 現修改為FC, 功能上做了簡化. 程序如下:
“LGF_ShellSortReal”函數是個排序函數, 對采集的溫度”data”.sourceArray 數組進行排序, 排序后的輸出為 “data”.destArray. 然后對”data”.destArray 采集最中間的一個值, 這樣可以刪除調最小和最大的值, 最后的結果輸出到value_1 中.
排序的數組長度最大不能操作1000, 如果有其它需求, 可以修改temp變量MAX_ARRAY_ELEMENTS.
這個函數就是取中值函數.
sourceArray 是亂序的溫度, 排序后的溫度間 destArray.
其實在現實中, 大范圍的加熱必然導致溫度不均勻, 可以采用分段加熱. 這時中值法就不是很有效了. 因為采用分段加熱后, 每段就1-2組溫度采集點, 像這種情況, 需要判斷探頭是否斷線, 如果斷線就切換另外一組, 可以中上篇博客中的error信號來判斷.