
简介面向S7-200SMART PLC编程与现场调试人员的实用技术文档针对模拟量信号波动大、硬件滤波难以满足平稳输入的场景给出基于表格指令实现滑动平均值滤波的完整方法。资源包共1个docx文件压缩包约255KB内容精炼便于快速查阅与落地。文档以符号表变量建立为起点依次说明上电初始化时通过FILL_IN指令构造表格并清零累加和、数据更新时用FIFO指令弹出最早元素并同步扣减累加和、使用AD_T_TBL指令把新模拟量值填入表格并更新总和待元素达到设定数量后计算平均值并输出同时给出了相关指令的手册查阅指引和源程序下载提示方便对照实操。已有1382人学习下载适合需要提升模拟量采样稳定性、掌握S7-200SMART表指令应用的工程师参考。 做自动化项目最常遇到的一个问题模拟量信号明明接好了屏蔽线也换了可AIW读出来的数值就是不稳定。温度在屏幕上跳来跳去液位跟着变频器一抽一抽地波动上位机曲线画出来跟心电图似的。有人加电容有人换屏蔽层有人在程序里写了七八种平均算法——这些我都折腾过但最顺手、改起来最灵活的还是在PLC里直接做软件滤波。这篇就聊S7-200SMART用表格指令实现模拟量信号滑动平均值滤波的方法。材料不复杂一条ATT填表指令、一条FIFO出表指令再加一个定时中断就够了。如果你是搞现场调试的电气工程师或者正在自学S7-200SMART的西门子初学者这篇可以直接照着抄作业。1. 核心思路为什么用表格指令来滤模拟量1.1 模拟量信号为什么非滤不可现场模拟量信号的噪声来源比很多人想象的多。变频器输出侧的高频谐波会通过辐射耦合进信号线继电器接触器动作时会产生尖峰脉冲传感器本身也有热噪声和测量误差24V开关电源的纹波同样会叠加到4-20mA回路上。线缆再短、屏蔽再好也只能把外部干扰压到一定水平不可能完全消除。这种噪声如果不处理后果往轻了说是显示数字来回跳往重了说就是PID输出跟着乱摆调节阀或者变频器被反复驱动执行机构磨损加剧系统报警误报不断。所以在信号进入控制逻辑之前必须做一层软件上的处理把随机噪声过滤掉让参与运算和显示的是一个平滑、真实的数值。硬件RC滤波也算一种思路无非是在模拟量端子前串个电阻电容但响应速度是固定的现场想调参数还得动螺丝刀拆端子排而且大电容带来的滞后往往比软件滤波更严重。相比之下软件滤波零成本、参数可在线调整还不占柜内空间属于性价比最高的方案。1.2 滑动平均、一阶惯性、中值滤波怎么选滑动平均值滤波的原理很简单就是把最近N次采样值存起来每次都取这N个数的平均值作为当前输出。它的数学表达式是 y(n)[x(n)x(n-1)...x(n-N1)]/N这个算法本身不难难在S7-200SMART里怎么高效地维护“最近N次采样值”这个队列。常见的替代方案有一阶惯性滤波公式是y(n)a·y(n-1)(1-a)·x(n)参数少、计算快但滤完的曲线不够平直而且相位滞后不容易直观预估。中值滤波对脉冲尖峰效果最好不过需要在PLC里对N个数做排序S7-200SMART的指令集做排序又慢又啰嗦不适合高频采样。三种方案对比下来滑动平均的噪声抑制能力均衡数学意义直观尤其适合温度、液位、压力这类慢变模拟量。而S7-200SMART恰好提供了表格指令天生就能管理先进先出的数据队列让滑动平均的实现变得非常简洁这才是我推荐这个方案的核心原因。1.3 表格指令的内部机制先弄懂S7-200SMART的表格指令里最常用的两条是ATTAdd To Table填表和FIFOFirst In First Out先入先出出表。它们操作的内存区域叫“表格”表格的内存布局是固定的偏移含义示例TBL起始于VB1000最大填表数量字节0~255VB100 101当前填表数量字节PLC自动维护VB101 0~102数据区第1个字VW1023数据区第2个字VW104...依次往后...ATT指令执行时会把一个16位整数追加到表格数据区的末尾同时当前计数自动加1。如果表格已满ATT不再填入并置位SM1.4标志。FIFO指令执行时会把数据区最前面的数据取出送给指定地址后面所有数据逐个前移当前计数自动减1。表格为空时FIFO不执行置位SM1.5。换句话说ATT加FIFO组合起来就是一个标准的FIFO队列。数据依次从尾部进、从头部出队列里永远保持着最近N次采样值。滑动平均最核心的“滚动窗口”数据管理用这两条指令就解决了不需要手动移位或者循环搬数据代码量直接砍掉一大半。2. 实操步骤在S7-200SMART里搭滑动平均滤波器2.1 地址规划先把变量表列清楚写程序之前先把地址规划好。我最怕的是边写边想最后数据区重叠、初始化漏了一行在线查半天。以窗口长度N10为例需要在V区开辟连续的表格区和相关变量区实际占用22×N22字节的连续V区。我习惯用的地址分配表如下地址用途备注VB100表格最大填表数初始化写10后续程序不改VB101表格当前填表数由ATT/FIFO自动维护程序只读VW102~VW120表格数据区10个字存放最近10次采样值VW200最新采样值暂存从AIW0读取后先放这里VW210FIFO取出的旧值供累加器做减法VD300窗口内数据累加和32位见后面溢出分析VD304类型转换暂存器16位转32位时用VD400累加和副本用于除法避免破坏VD300VD404除数常量N10初始化写入VW500滤波结果输出主程序、触摸屏直接引用这里有个容易踩的坑表格区起始地址是VB100但ATT指令的TBL参数必须指向表格起始字节VB100而不是VW100。表格指令认的是字节地址操作数里写VB100、VB200、VB300均可但一定得保证后面跟着的22N字节都是空闲的V区不能和其他逻辑共用。2.2 初始化程序把表格和中断都准备好初始化用SM0.1也就是CPU首次扫描时执行一次。需要做的事有四件设置表格最大填表数、清零当前填表数、清零累加和、配置定时中断。// 主程序 - 初始化网络 LD SM0.1 MOVB 10, VB100 // 最大填表数 滤波窗口N MOVB 0, VB101 // 当前填表数清零 MOVD 0, VD300 // 窗口累加和清零 MOVD 10, VD404 // 除数常量 10 MOVB 100, SMB34 // 定时中断0间隔 100ms ATCH INT_0, 10 // 中断事件10关联到INT_0 ENI // 全局开放中断有些资料里会省去MOVB 0, VB101这一步理由是表格计数会随着ATT/FIFO自动变化。但PLC上电后V区是随机值或者掉电保持的旧值不清零后患无穷。我的建议是这一行必须写宁可重复初始化也不要赌内存默认是0。SMB34是定时中断0的时间寄存器单位毫秒允许范围1~255。100ms是我给一般慢变量的推荐值具体怎么选后面专门讲。ATCH指令的作用是把中断事件10定时中断0关联到中断程序INT_0ENI是全局中断允许三者结合才能让中断真正跑起来。2.3 中断程序填表出表加累加中断程序是整个滤波器的核心每次定时中断到来时顺序执行三个动作判断表格是否已满、满了就先出表、读取最新模拟量并填表、更新累加和并计算平均值。// 中断程序 INT_0 // 网络1表格已满则先执行FIFO取出最旧数据 LD SM0.0 LDB VB101, 10 FIFO VB100, VW210 ITD VW210, VD304 -D VD304, VD300 // 网络2读取模拟量并填表更新累加和 LD SM0.0 MOVW AIW0, VW200 ATT VW200, VB100 ITD VW200, VD304 D VD304, VD300 // 网络3计算当前窗口平均值 LD SM0.0 MOVD VD300, VD400 /D VD404, VD400 MOVW VW402, VW500这里有个先后顺序的问题FIFO必须在ATT之前执行否则表格永远处于满的状态ATT就会触发SM1.4而不填入。我初始时把VB101清零前9次中断只执行ATT和累加第10次开始VB101达到10之后每次都先FIFO再ATT窗口长度恒定为10VD300的累加和也始终对应当前窗口中10个数据之和整个逻辑闭环相当严密。关于最后一行MOVW VW402, VW500我需要解释一下VD400是个32位地址高16位是VW400低16位是VW402。双整数除法/D执行完后商保存在VD400中它的低16位VW402就是我们要的整数平均值。把VW402传送到VW500VW500就是滤波结果的输出地址。如果你需要浮点结果做更精细的运算可以在除法之前用DTR指令把双整数转成实数再除实数10.0但一般显示和PID控制用整数就足够。2.4 梯形图和STL如何对应移植很多朋友习惯用梯形图实在看不惯STL指令表。其实这个程序在Micro/WIN SMART里无论是LAD还是STL都能编写上面给的STL只是方便发布和核对。梯形图的做法是网络1拖一个常开触点SM0.0、一个字节等于比较器VB10110、一个FIFO指令TBL填VB100DATA填VW210、一个I_DI整数转双整数指令、一个双整数减法指令。 网络2拖一个常开触点SM0.0、一个MOVW指令AIW0→VW200、一个ATT指令DATA填VW200TBL填VB100、一个I_DI转换、一个双整数加法。 网络3拖一个常开触点SM0.0、一个MOVD指令VD300→VD400、一个双整数除法指令、一个MOVW指令VW402→VW500。关键点在于梯形图里的ATT指令左侧有两个输入EN和DATA下面一行是TBL。别把DATA和TBL填反了否则运行的时候数据会写进你根本想不到的内存地址。3. 关键参数怎么定才不踩坑3.1 窗口长度N和采样周期T怎么配合窗口总时间等于N乘以T滤波后的响应滞后大约为N×T/2。比如N10、T100ms那么窗口总共覆盖1秒滞后约0.5秒。如果你控制的是室温这种大惯性对象0.5秒的滞后毫无压力但如果你采样的是液压系统压力0.5秒滞后可能让PID直接震荡。根据我做过项目的经验不同信号类型的推荐参数大致如下信号类型采样周期T窗口N窗口总时长适用场景室温、水温500ms~1s10~205~20s暖通、水箱液位200~500ms10~202~10s水池、罐体管道压力100~200ms5~100.5~2s供水、气路流量100~300ms5~80.5~2s总管、支管计量电机电流20~50ms5~100.1~0.5s电流监控这个表格不是死的。判断标准很简单窗口总时长最好不超过对象本身响应时间的五分之一。如果工艺上要求快速报警比如压力超高连锁停机滤波就不能做太重宁可让信号带一点噪声也要保证报警及时性。N的取值还要考虑S7-200SMART表格指令的一个限制表格计数是字节型最大只有255。模拟量滤波一般10~50就够用了很少有人会填到255因为窗口太长数据几乎“凝固”失去实时性。3.2 用定时中断还是用SM0.5时钟脉冲有朋友会问为什么不用SM0.5这位0.5秒的时钟脉冲去触发采样原因是SM0.5的精度太差它跟扫描周期不同步而且在主程序里用SM0.5触发采样时如果当次扫描正好被某段程序拖长采样间隔会抖动滤波质量跟着下降。定时中断的优势在于严格的等间隔采样。SMB34的定时基准不依赖扫描周期哪怕主程序里跑了一段长延时中断照样准点触发。对滑动平均来说等间隔采样是算法成立的前提所以我的做法是优先用TIMER0中断也就是SMB34ATCH事件10。关于中断程序有几个操作纪律要守住中断程序里不要调用有不确定执行时间的子程序不要在里面做轮询通信不要轻易用循环指令。中断程序应该保持短小只做和采样、滤波直接相关的事。如果需要把滤波结果传给通信或显示逻辑就只写公共变量VW500由主程序自己去读。3.3 溢出问题其实不用太担心但要注意除法截断S7-200SMART的AIW模拟量输入范围一般是0~27648或0~32000取决于模块和量程设置即使按最大值32000来算N50时累加和是32000×501,600,000远小于32位双整数的上限2,147,483,647所以用32位累加器VD300完全不会溢出。哪怕N取到255最大值32000×2558,160,000也安全。真正需要留意的是整数除法会截断余数。VD400除以VD404的结果只保留整数部分例如平均值算出来是123.7VW402得到的是123。对于滤波输出这个精度大多数场合能接受。如果连0.7的误差都会影响控制精度那就在除之前用DTR把被除数转实数用实数除法算到小数点后一位再根据需要ROUND回去。但这样一来运算量增加对执行速度影响很小只是代码会多几行我一般建议先用整数除法不行再升级。4. 实战问题与经验速查4.1 表格不更新、计数一直不变、滤波值恒定这种问题十有八九是ATT指令根本没执行原因集中在三个方面一是初始化里忘记写ENI中断虽然有ATCH但根本没开放程序压根没进过INT_0二是表格起始地址与数据区重叠比如TBL写成了VW102数据区被表格头占用ATT一执行就把表格头覆盖掉三是你在主程序里把SM0.1那段初始化逻辑复制到了循环段每次扫描都把VB101清零表格当前计数永远停留在0。排查方法很简单在状态表里在线监视VB101。如果VB101一直为0看初始化是否被反复执行如果VB101一直是255或者随机数看表格头是否被破坏如果VB101正常递增但VW500不变检查VW500的设备地址是不是被触摸屏或者上位机重复写了。4.2 滤完还有毛刺或者滞后大到工艺投诉滤波效果不理想先不要急着调参数分清是“滤不掉”还是“滞后大”。如果滤完的曲线仍然毛刺明显说明窗口总时长太短后台变频器干扰频率很高单次窗口内噪声没有被充分平均这时候要增大N或T。如果曲线很平滑但阀门动作跟不上设定变化说明窗口太长操作员调节后很久数值才到位这时候要减小N或T。现场最常见的操作是只调N不调T或者反过来。我的建议是保持N在5~20之间优先调T。因为N是数据点数太小和太大的曲线差异很直观T则直接对应采样频率和硬件回路的抗干扰特性更相关。一次只动一个变量调完用状态表里的趋势图看曲线这是最稳妥的调试方式。4.3 调试技巧状态表、趋势图和地址分区管理Micro/WIN SMART的在线状态表可以同时监控AIW0、VB101、VW200、VW500这些变量。更直观的是它的趋势图功能可以把AIW0和VW500两条曲线叠加显示原始信号噪声有多大、滤波后有多平一眼就能看出来。我每接一个项目都会在状态表里预先配好这组变量省得每次现场都要重新添加。另外一个经验是把滤波相关变量集中在一个V区连续段。表格区、采样暂存、累加器、输出寄存器全部放在一个规划好的地址块里。这样做的好处是调试状态表时地址连续好记下载程序后排查覆盖问题时也容易用“V区内存监视”整体查看。我见过不少同事程序风格潇洒变量东一个西一个最后在线监视时满屏地址乱飞效率极低。最后分享一个小技巧如果你手头有S7-200SMART的练习手册建议把上面的地址分配改成手册里的示例地址在仿真或者实体PLC上完整跑一遍。先看现象再对照程序逻辑理解会比光看文章深很多。这套表格指令的玩法其实不止滤波设备历史故障记录、产品数据FIFO缓存都可以套用原理完全一样学会一次就能迁移到好几个场景。本文还有配套的精品资源点击获取