一、中断基础:什么是中断、中断的作用、中断与轮询的区别、PLC中断类型
1.1 到底什么是中断?
各位好,我是老张。做PLC编程十几年了,今天咱们聊聊中断。
先问个问题:你正在厨房炒菜,突然门铃响了。你是继续炒菜,还是先去开门?
正常人肯定先关火,去开门,回来再继续炒。对吧?
这个场景,就是中断。
中断,说白了就是CPU正在干一件事,突然来了个更紧急的任务,它把手头的活暂停一下,先去处理紧急任务,处理完再回来接着干。
在PLC里也一样。主程序正循环扫描呢,突然来了个高速脉冲信号,或者某个输入点电平跳变了。CPU就得停下来,先去响应这个信号,完事再回来继续扫描。
核心定义:中断是一种硬件或软件触发的机制,它让CPU暂停当前程序的执行,转而去执行一个优先级更高的中断服务程序(ISR),执行完毕后再返回原程序继续执行。
1.2 中断到底有什么用?
我刚开始做项目那会儿,也觉得主程序循环扫描就够了。直到有一次,客户要求检测一个高速旋转的编码器,每秒几千转。用轮询?根本来不及。
中断的作用,我总结了几点:
- 实时响应:对突发事件的响应速度极快,微秒级甚至纳秒级。你想想看,主程序扫描周期可能几十毫秒,但中断一来,CPU立刻掉头。
- 提高效率:不用一直盯着某个信号看。信号来了才处理,不来就干别的。省CPU资源。
- 处理高速事件:比如高速计数器、编码器脉冲、位置捕捉。这些信号频率太高,轮询根本抓不住。
- 多任务并行:主程序干它的活,中断处理紧急事件。互不干扰。
个人经验:我在做包装机项目时,切刀位置必须精确到0.1毫米。用轮询根本做不到,一上中断,问题立马解决。嗯,中断就是干这个的。
1.3 中断 vs 轮询:到底差在哪?
很多新手会问:我不用中断,就写个IF语句一直检测行不行?
行,但效率天差地别。
咱们直接看对比:
| 对比项 | 中断方式 | 轮询方式 |
|---|---|---|
| 响应速度 | 微秒级,事件触发立即响应 | 取决于扫描周期,通常毫秒级 |
| CPU占用 | 事件发生时才占用CPU | 每个扫描周期都要检查,持续占用 |
| 实时性 | 高,适合高速信号 | 低,可能错过短暂脉冲 |
| 编程复杂度 | 稍高,需注意中断嵌套和共享资源 | 简单,直接写条件判断 |
| 适用场景 | 高速计数、位置捕捉、故障急停 | 普通I/O检测、低速信号 |
说白了,轮询就像你站在门口一直盯着,看有没有人敲门。中断呢,是你坐在沙发上看电视,门铃响了再去开。哪个省力?一目了然。
避坑指南:我曾经在一个项目中,用轮询检测一个只有2毫秒宽的脉冲信号。结果10次有8次抓不到。后来换成中断,一次都没丢。记住:高速信号必须用中断,别省那点编程功夫。
1.4 PLC中断有哪些类型?
不同品牌的PLC,中断分类大同小异。我以最常用的西门子S7-1200/1500和三菱FX系列为例,给大家梳理一下。
按触发来源分:
- 硬件中断:由外部信号触发,比如输入点I0.0的上升沿或下降沿。常用于急停、位置开关、编码器Z相信号。
- 时间中断:由定时器触发,比如每隔10ms执行一次中断程序。适合周期性采样或PID调节。
- 延时中断:从某个事件发生后,延迟指定时间再触发。比如启动后延迟5ms执行。
- 计数中断:高速计数器达到预设值时触发。比如编码器转了1000个脉冲,触发一次。
- 通信中断:收到特定通信数据时触发。比如Modbus报文到达。
- 错误中断:CPU检测到硬件故障或程序错误时触发。用于故障处理。
按优先级分:
中断是有等级的。高优先级可以打断低优先级。我一般这样排:
- 硬件中断(最高)—— 比如急停信号
- 时间中断
- 计数中断
- 通信中断
- 错误中断(最低)
重要提醒:中断服务程序一定要短小精悍。我见过有人在中断里写几百行代码,结果CPU根本来不及响应下一个中断。记住:中断里只做最核心的事,比如读个值、置个位,复杂的逻辑放到主程序去处理。
1.5 中断的执行流程
为了让大家更直观地理解,我画了一张流程图:
这张图很清楚了。主程序跑着跑着,突然来了中断请求。CPU先保存当前的工作状态(这叫压栈),然后跳去执行中断程序。执行完再恢复状态(出栈),回到刚才断掉的地方继续跑。
整个过程,对主程序来说几乎是透明的。它根本不知道自己被打断过。
我的习惯:写中断程序时,我一般只做三件事:读数据、置标志位、清中断标志。其他逻辑全放主程序里。这样中断执行时间控制在几十微秒以内,系统稳得很。
1.6 中断的注意事项
最后,说几个容易踩的坑:
- 中断程序别太长:超过1ms的中断程序,基本就是在给自己挖坑。高频率中断会堆积,导致系统崩溃。
- 注意共享资源:主程序和中断程序如果操作同一个变量,一定要加互斥。我见过有人中断里写DB块,主程序也在读,结果数据乱套了。
- 中断优先级别乱设:高优先级中断会打断低优先级。如果两个中断互相依赖,可能死锁。
- 调试时先屏蔽中断:我习惯先把中断关掉,调通主程序,再逐个打开中断调试。不然出了问题,根本不知道是主程序还是中断的锅。
血的教训:我曾经在一个项目中,把高速计数中断的优先级设得比硬件中断还高。结果编码器脉冲一来,连急停信号都响应不了。设备差点撞坏。从那以后,硬件中断永远排第一。
好了,中断的基础就聊到这儿。说白了,中断就是PLC的「紧急通道」,让CPU能第一时间处理最重要的事。掌握了这个思维,后面学高速计数器就轻松多了。
公众号:蓝海资料掘金营,微信deep3321