当前位置: 首页 > news >正文

西门子 S7-200 SMART PLC 实操案例:中断程序的灵活应用定时中断实现模拟量滤波(下)

 四、初始化子程序:中断 “生效的关键开关”,缺一不可

中断程序不会 “自动运行”,必须通过 “配置定时时间→关联事件→全局使能” 三步激活,这部分逻辑放在 “初始化子程序 SBR_Init”,而非直接写在 OB1,核心是 “结构化编程”—— 把 “一次性配置逻辑” 封装,避免主程序冗余。

步骤 4.1:初始化子程序 SBR_Init 逻辑拆解

1. MOVB 100, SMB34:S7-200 SMART 的 “中断时间寄存器” 特性

S7-200 SMART 有两个定时中断(中断 0 和中断 1),对应专用的时间寄存器:

  • 定时中断 0→SMB34(时间范围 1~255ms,单位 ms);
  • 定时中断 1→SMB35(时间范围 1~255ms,单位 ms);

若需更长时间(如 500ms),需在中断程序里加 “二次计数”(比如中断 0 每 100ms 触发,计数 5 次 = 500ms)。案例用 100ms,刚好在 SMB34 的量程内,直接设置即可。

2. ATCH Filter_Int, 10:“事件号” 是中断的 “身份证”

S7-200 SMART 给每个中断类型分配了固定的 “事件号”,必须一一对应,否则中断无法触发:

  • 定时中断 0→事件号 10;
  • 定时中断 1→事件号 11;
  • I0.0 上升沿中断→事件号 0;

案例中 “ATCH Filter_Int, 10” 的意思是 “当事件号 10(定时中断 0)发生时,执行 Filter_Int 中断程序”—— 若写错事件号(如写 11),则定时中断 1 触发时才执行,而 SMB34 配置的是中断 0,导致中断 “配置与执行不匹配”,完全失效。

3. ENI:全局中断的 “总开关”,绝不能漏

S7-200 SMART 默认 “所有中断关闭”,即使配置了 ATCH,不执行 ENI,中断也不会触发。ENI 是 “全局使能”,执行一次后,所有已关联的中断都会生效(若需关闭某个中断,用 DTCH 指令解除关联)。

步骤 4.2:主程序调用初始化子程序(仅执行一次)

为什么用 “LDP SM0.1”(上升沿触发)?

SM0.1 是 “PLC 上电后首次扫描为 ON,之后一直为 OFF”:

  • 用 LDP(上升沿):确保初始化子程序只执行一次,避免每次扫描都调用 SBR_Init,重复配置 SMB34、ATCH(虽然重复配置不会报错,但浪费扫描时间,且不符合 “一次性初始化” 的逻辑);
  • 若用 LD SM0.1(电平触发):首次扫描期间 SM0.1 为 ON,主程序扫描几次就会调用几次 SBR_Init,完全多余。

五、案例优势的 “工业落地价值”:不只是 “技术优势”,更是 “系统稳定的保障”

案例提到的 3 个优势,不是 “文字游戏”,而是直接对应工业现场的 “系统可靠性需求”:

1. “定时精准”→ 保障 “滤波效果的一致性”

工业控制中,“采样间隔均匀” 是滤波有效的前提 —— 比如 10 次采样若间隔忽快忽慢(50ms、150ms、80ms...),相当于 “采样点分布不均”,平均值可能偏向 “采样密集时段” 的数值,无法真实反映过程值。而中断的 100ms 精准间隔,确保每次采样的 “时间权重相同”,平均值更接近真实值,为后续控制(如 PID)提供可靠的过程值。

2. “数据稳定”→ 避免 “控制逻辑误动作”

若不用滤波,AIW12 波动大(如温度 80℃,采集值 75~85℃跳变),传给 PID 后会导致:

  • PID 输出频繁波动(一会儿加热,一会儿停止);
  • 执行器(如加热棒、调节阀)频繁动作,缩短使用寿命;
  • 被控参数(温度)无法稳定,出现 “超调”(比如冲到 85℃再掉回 75℃)。

10 次平均值滤波后,采集值稳定在 79~81℃,PID 输出平滑,执行器动作平缓,被控参数稳定在设定值附近,符合工业 “精准控制、设备长寿命” 的需求。

3. “不阻塞主程序”→ 确保 “多任务并行稳定”

工业系统中,主程序往往同时运行 “电机控制、阀门控制、HMI 通信” 等多个任务,若中断程序执行时间太长(比如超过 50ms),会导致主程序 “卡顿”:

  • 电机控制响应变慢(按下启动按钮,几秒后才启动);
  • HMI 显示延迟(实际温度变了,HMI 几秒后才更新);

案例中中断程序仅 4 条指令,执行时间约 1~2ms,远小于主程序扫描周期(几十 ms),完全不会影响主程序的正常运行,实现 “模拟量滤波” 与 “其他控制任务” 的并行稳定。

六、潜在扩展:从 “基础滤波” 到 “工业级抗干扰方案”

案例是 “基础版滤波”,实际工业中可根据干扰强度、精度需求扩展,核心是 “不改变中断定时的核心逻辑,只优化数据处理与异常判断”:

1. 优化 1:增加 “超限采样值剔除”(抗大干扰)

若现场有 “脉冲大干扰”(如接触器启停导致 AIW12 突然跳到 10000),10 次平均值会被严重拉偏 —— 可在 Network1 后加 “超限判断”:

通过 “剔除异常值”,进一步提升滤波后数据的稳定性。

2. 优化 2:多通道滤波(同时采集多个模拟量)

若需同时采集 AIW12(温度)、AIW2(压力),可扩展变量与逻辑:

  • 新增变量:Sum_Value2(VD104,压力累加和)、Sample_Count2(VB106,压力计数)、Avg_Value2(VW108,压力平均值)、Temp_Sample2(VD114,压力临时值);
  • 中断程序 Network1 增加:MOV_DW AIW2, VD114→+D VD114, VD104→INC B VB106;
  • Network2 增加:LDB= VB106,10→/D 10, VD104→MOV_DW VD104, VW108→MOV_DW 0, VD104→MOVB 0, VB106;

实现 “一个中断程序处理多个模拟量通道”,节省中断资源。

3. 优化 3:与 PID 结合(稳定控制的闭环)

滤波后的 Avg_Value(VW104)可直接作为 PID 的过程值(PV),避免干扰导致 PID 震荡:

  • 在主程序中调用 PID 子程序,将 Avg_Value 传给 PID 的 PV 参数;
  • PID 输出(如 AQW0)控制执行器,形成 “采集→滤波→控制” 的闭环,提升系统稳定性。

总结:中断程序的核心价值 ——“实时精准响应,不拖系统后腿”

该案例的本质是 “用中断的实时性解决定时问题,用平均值滤波解决抗干扰问题”,与之前的 “子程序模块化” 形成互补:

  • 子程序:解决 “重复功能的复用”(如多电机控制);
  • 中断程序:解决 “实时精准的响应”(如定时采样、急停);

实操时必须记住两个 “红线”:

  1. 中断程序必须 “短小精悍”,执行时间 < 10ms,避免阻塞主程序;
  2. 中断程序用全局变量(V 区)存储数据,绝不能用局部变量(TEMP);

掌握这个案例后,可迁移到其他中断场景(如高速计数中断、急停中断),核心思路都是 “识别实时性需求→用中断满足→优化数据处理→确保系统稳定”—— 这也是工业 PLC 程序员从 “会编程” 到 “编好程” 的关键一步。

http://www.dtcms.com/a/395780.html

相关文章:

  • STM32FreeRtos入门(二)——创建第一个多任务程序
  • Qt QML and Qt Quick 简述及例程
  • Linux 系统移植
  • 小杰机器学习(six)——概率论——1.均匀分布2.正态分布3.数学期望4.方差5.标准差6.多维随机变量及其分布
  • 【Linux】Ext系列文件系统(上)
  • 【ROS2】Beginner: Client libraries - 发布者、订阅者例子 C++ Python
  • AI设计功能性病毒:从DNA语言模型到精准杀菌实战
  • Qt 共享指针QSharedPointer与std::shared_ptr
  • Java课程 第02周 预习、实验与作业:Java基础语法2:面向对象入门
  • 词性标注技术漫谈:为词语赋予语法灵魂的旅程
  • K230基础-MicroPython
  • 网站访问问题:无法访问此网站、404
  • Redis 与Memcached 的对比
  • PyTorch 神经网络工具箱:核心原理与实践指南
  • 广义矩估计错误指定时的一个推导【续5】
  • 【STM32】ADC数模转换器
  • Tensorboard学习记录
  • Redis中常见数据结构底层实现结构是什么
  • 高频交易技术演进:从毫秒到纳秒的极限延迟优化之路
  • 从零开始搭建并部署一个基于Django和YOLO的智能模型项目
  • MySQL零基础学习Day2——数据库基础操作
  • 数学笔试选择题:题组1
  • Linux常用命令51——tail查看文件尾部内容
  • Django多数据库配置:mysql、mongo、redis、达梦
  • 图像拼接(反向拼接巨难,求指教!)
  • [免费]基于Python的深度学习音乐推荐系统(后端Django)【论文+源码+SQL脚本】
  • 南华 NHL-1 型加载减速工况法轻型柴油车烟度检测系统:技术解析与实战指南
  • 学习Java遇到的一些问题
  • 基于SpringBoot招聘信息管理系统
  • 多线程—线程通信之notifyAll()/wait()方法Demo