比较中断是PLC高速计数器中最实用的功能之一,能让设备在特定计数值自动触发动作,无需主程序轮询。本文从原理到实操,手把手教你配置与调试。
一、核心原理:比较中断是什么
普通计数只记录脉冲数量,程序需要不断读取当前值再判断。比较中断则让计数器自己监控自己——当当前值等于预设的比较值时,硬件自动触发中断程序,不占用扫描周期。
关键概念:
| 术语 | 含义 | 典型场景 |
|---|---|---|
| 当前值(CV) | 计数器实时累计的脉冲数 | 编码器反馈的实际位置 |
| 比较值(PV) | 触发中断的目标数值 | 目标位置、长度设定点 |
| 中断程序 | 比较匹配时执行的子程序 | 立即输出、清零、改变速度 |
核心价值:响应速度达到微秒级,比程序扫描快100倍以上,适合精密定位、定长切割、高速测控。
二、硬件接线:计数脉冲从哪来
2.1 信号源类型
- 编码器:增量式(A/B/Z相)、绝对式(SSI/BISS)
- 接近开关:PNP/NPN型,单路脉冲
- 光栅尺:直线位移转换脉冲
2.2 接线要点(以西门子S7-200 SMART为例)
24V增量编码器接线:
| 编码器线色 | 接入端子 | PLC端口 |
|---|---|---|
| 电源正(棕) | L+ | — |
| 电源负(蓝) | M | — |
| A相(白) | I0.0 | HSC0的时钟 |
| B相(黑) | I0.1 | HSC0的方向 |
| Z相(橙) | I0.4 | 外部复位(可选) |
关键设置:
- 拨码开关:将I0.0-I0.3对应的滤波时间设为最小(0.2μs),否则滤掉高频脉冲
- 屏蔽层:单端接地,避免干扰
三、西门子S7-200 SMART配置详解
3.1 启用高速计数器向导
- 打开 STEP 7-Micro/WIN SMART软件
- 点击 菜单"工具" → "高速计数器向导"
- 选择 计数器编号(HSC0-HSC3),点击 "下一步"
3.2 模式选择与参数设置
模式选择页:
| 参数 | 推荐设置 | 说明 |
|---|---|---|
| 计数模式 | "具有内部方向控制的单相计数器" 或 "正交计数器" | 单路脉冲选前者,编码器选后者 |
| 计数方向 | 外部方向控制或内部方向控制 | 编码器B相决定方向时选外部 |
| 初始计数方向 | 向上计数 | 通常默认即可 |
预设值与当前值页:
- 勾选 "预设值等于当前值时产生中断"
- 输入 比较值(例如
10000表示10000个脉冲触发)
3.3 生成中断程序
向导最后一步:
- 勾选 "生成中断程序"
- 命名 中断程序(默认
HSC0_STEP) - 点击 "完成",向导自动生成初始化程序
自动生成的主程序片段:
// 在主程序中调用一次
CALL HSC_INIT
// HSC_INIT内部包含:
// 1. 定义HSC0的控制字节
// 2. 设置当前值为0
// 3. 设置预设值为10000
// 4. 连接中断事件12(HSC0 CV=PV)到INT_0
// 5. 全局启用中断
// 6. 启动HSC0
3.4 编写中断程序内容
打开 自动生成的中断程序(如 INT_0),在 // 用户代码 区域添加:
// 示例:到达目标位置后立即输出并准备下一次
NETWORK 1
// 立即置位输出Q0.0,控制电磁阀动作
S Q0.0, 1
NETWORK 2
// 装载新的比较值(当前值+5000,实现等距分段)
LDW>= SM0.0, 1
// 使用MOV_DW指令设置新的预设值
MOVD VD100, SMD42 // 将VD100中的新值送入HSC0预设值寄存器
NETWORK 3
// 可选:改变计数方向或清零
// 如需连续循环计数,保持当前值累加
// 如需绝对定位,执行:MOVD 0, SMD38(清零当前值)
四、三菱FX5U配置详解
4.1 参数设置
打开 GX Works3,双击 导航栏"参数" → "FX5UCPU" → "模块参数" → "高速I/O":
| 设置项 | 路径 | 推荐值 |
|---|---|---|
| 高速计数器功能选择 | 输入输出功能设置 → 高速计数器 | "使用" |
| 计数器类型 | CH1详细设置 | "1相1输入(S/W递增/递减)" 或 "2相2输入(A/B相)" |
| 环长设置 | CH1详细设置 | 线性模式或环形模式(循环计数) |
4.2 比较匹配中断设置
点击 "中断设置" 标签页:
- 勾选 "比较匹配中断"
- 设置 比较匹配值(如
K10000) - 指定 中断指针(如
I010)
4.3 程序编写
主程序:
// 启用高速计数器CH1
HIOEN K1 // K1表示CH1
// 设置比较匹配值
DHCMOV K10000 K1 K0 // 将10000写入CH1的比较值寄存器
// K0表示当前值=比较值时触发
// 启用比较匹配中断
EI // 全局允许中断
中断程序(I010):
I010
SET Y0 // 立即输出Y0
INC D100 // 中断计数加1
DHCMOV D200 K1 K0 // 装载下一个比较值(实现多段比较)
IRET
五、多段比较的高级应用
单一比较值只能做一次动作,实际工程中常需连续多段控制。
5.1 硬件比较表(以西门子S7-1200为例)
S7-1200支持最多32个比较值的硬件比较表:
// 使用"CTRL_HSC_EXT"指令配置比较表
// 比较表存储在数据块中
TYPE "HSC_CompareEntry"
STRUCT
Period : DInt; // 比较值(周期点)
CountMode : Byte; // 到达后的动作:0=无,1=输出置位,2=输出复位,3=反向
END_STRUCT;
// 在数据块中创建数组
"CompareTable".Entry[0].Period := 1000;
"CompareTable".Entry[0].CountMode := 1; // 到达1000时置位输出
"CompareTable".Entry[1].Period := 2500;
"CompareTable".Entry[1].CountMode := 2; // 到达2500时复位输出
"CompareTable".Entry[2].Period := 4000;
"CompareTable".Entry[2].CountMode := 1; // 到达4000时再次置位
// ... 最多32个条目
5.2 飞剪/追剪应用实例
工艺要求:物料连续输送,在特定长度切断,剪切机构需与物料同步。
graph LR
A["编码器测量
物料长度"] --> B{"当前值 ≥
设定长度?"} B -- "是 (中断触发)" --> C["启动伺服
追剪动作"] C --> D["剪切完成
计数器复位"] D --> A B -- "否" --> A
物料长度"] --> B{"当前值 ≥
设定长度?"} B -- "是 (中断触发)" --> C["启动伺服
追剪动作"] C --> D["剪切完成
计数器复位"] D --> A B -- "否" --> A
关键参数计算:
- 编码器分辨率:2500脉冲/转
- 辊周长:200mm
- 每毫米脉冲数:$2500 \div 200 = 12.5$ 脉冲/mm
- 目标长度500mm对应的比较值:$500 \times 12.5 = 6250$ 脉冲
六、常见问题与排查
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
| 中断不触发 | 比较值设置错误 | 确认PV寄存器地址,S7-200 SMART HSC0的PV是SMD42 |
| 中断频繁误触发 | 输入信号干扰 | 检查屏蔽接地,降低计数频率或增加硬件滤波 |
| 比较值更新不及时 | 在比较点附近修改PV | 先禁用HSC,修改PV,再启用;或使用"改变当前值"指令避开临界点 |
| 多段比较顺序错乱 | 比较值未按大小排列 | 硬件比较表要求Period递增排列,软件比较需自行排序 |
| 输出响应有延迟 | 中断程序过长 | 中断中只做必要的立即输出,复杂逻辑移到主程序 |
七、性能优化技巧
- 比较值预装载:在中断里提前写好下一次的PV,避免主程序计算耗时
- 环形计数模式:连续旋转设备(如转盘)使用环形模式,自动归零避免数值溢出
- 中断优先级:多路高速计数时,为关键轴分配更高优先级的中断事件号
- 诊断监控:用状态表实时查看
SM36.0(S7-200 SMART的HSC0当前值等于预设值标志)辅助调试

暂无评论,快来抢沙发吧!