西门子博途编程-模拟量断线超量程处理(中值法)
温度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信号来判断.