西门子smart200 平均值,最新有图片证明中值,最大值,最小值,排序,数据连续移位。 2个版本,一个整数版本,一个浮点数版本,自己定义数据区间范围,采用指针算法,自己可以组合,作为一些数据处理。
最近在鼓捣西门子Smart200的数据处理,发现指针玩法能整出不少实用功能。今天咱们直接上硬货,整两套数据处理模板——整数版和浮点版,搞定均值、中值、极值这些常规操作,顺便带数据移位功能。老规矩,先看效果再拆解代码。
先整个整数版的练手。假设我们要处理20个随机温度值(范围1-100℃),先定义数据存储区:
VAR iBuffer: ARRAY[0..19] OF INT; // 原始数据缓存 pData: POINTER := ADR(iBuffer); // 指针初始化 iTempArray: ARRAY[0..19] OF INT; // 临时处理数组 END_VAR数据移位用指针跳地址实现最省事,每次新数据进来就把旧数据顶出去:
// 数据左移一位(FIFO) FOR #i := 1 TO 19 DO pData^ := (pData + 1)^; pData := pData + 1; END_FOR // 最后一位存入新数据 pData^ := NewTemperature;排序这块用冒泡虽然土但稳定,注意指针要复位:
// 降序排序(指针版冒泡) #pStart := ADR(iTempArray); FOR #j := 0 TO 18 DO #pCurrent := #pStart; FOR #k := 0 TO 18 - #j DO IF #pCurrent^ < (#pCurrent + 1)^ THEN #temp := #pCurrent^; #pCurrent^ := (#pCurrent + 1)^; (#pCurrent + 1)^ := #temp; END_IF #pCurrent := #pCurrent + 1; END_FOR END_FOR中位数取第9、10位的平均值更准确,避免偶数组误差:
// 中值计算 #pMid := ADR(iTempArray) + 9; IF #pMid^ != 0 THEN iMedian := (#pMid^ + (#pMid + 1)^) / 2; END_IF浮点版的处理更要注意精度问题。比如处理压力值(0.0-50.0MPa),数据缓存得用REAL类型:
VAR fBuffer: ARRAY[0..14] OF REAL; // 15个压力样本 pFloat: POINTER := ADR(fBuffer); END_VAR浮点数的极值判断不能直接用等于,这里用差值绝对值判断:
// 浮点最大值检测 IF (NewValue - fMax) > 0.001 THEN fMax := NewValue; END_IF排序时比较环节要加精度容差,防止误判:
IF (#pCurrent^ - (#pCurrent + 1)^) < -0.001 THEN // 执行交换操作 END_IF均值计算建议用累加指针,避免多次访问数组:
#pSum := ADR(fBuffer); FOR #n := 0 TO 14 DO fTotal := fTotal + #pSum^; #pSum := #pSum + 1; END_FOR fAverage := fTotal / 15.0;实际调试时通过变量表抓到的数据流,可以看到移位效果:当新值50.6插入时,最旧的32.1被挤出队列,这种处理方式特别适合滚动显示最近N次数据。中位值计算经过排序后取中间值的操作,在波动数据中能有效过滤突发干扰。
指针玩法的优势在资源紧张时尤其明显——同样的排序算法,用指针直接操作内存比用数组索引节省约15%的扫描周期时间。但要注意指针越界问题,建议在移动指针时加上范围校验:
IF #pCurrent < ADR(fBuffer) + SIZEOF(fBuffer) THEN // 安全操作 END_IF这两套模板可以直接移植到需要数据处理的场景,比如质量监控、趋势分析等。下次遇到需要实时显示数据特征又得控制内存的情况,不妨试试这套指针组合拳。