news 2026/10/12 1:02:52

PLC中断功能详解:类型选择、程序编写与实战调试避坑指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PLC中断功能详解:类型选择、程序编写与实战调试避坑指南

干工控这些年,PLC中断功能算是我接触得比较晚、但一旦用上就再也回不去的一块。很多同行写PLC程序,习惯性觉得只要扫描周期够快,什么信号都能处理,真要遇到高速脉冲计数、设备急停、突发报警这些场景,才发现扫描逻辑根本来不及。中断就是专门解决这类问题的机制:让CPU在正常扫描循环中临时停下手头的事,优先处理一个紧急事件,处理完再回到原来的位置继续执行。

这篇文章我打算把PLC中断的使用从头到尾捋一遍,包括中断类型怎么选、中断程序怎么写、和主程序怎么配合,以及我实际调试中踩过哪些坑。不管是刚接触中断的新手,还是已经在项目里用过中断但偶尔翻车的朋友,应该都能找到对自己有用的东西。需要说明的是,不同品牌PLC的中断实现细节有差异,文中涉及的配置流程我会以常见日系PLC为例,其他品牌可以对照手册迁移思路。

1. 中断到底打破了什么规则

1.1 扫描机制的天生短板

PLC最核心的工作方式就是周期扫描:读输入、跑程序、刷新输出,然后不断循环。这个模式本身没什么问题,正常顺序控制、逻辑联锁都靠它跑得很稳。但当外部信号来得比扫描周期还快时,问题就出现了。举个例子,编码器输出一个很窄的脉冲,宽度只有几十微秒,而你的PLC扫描周期是5毫秒,那这个脉冲很可能在两次扫描之间就消失了,程序根本看不到它。

我之前接过一个项目,现场有一台设备需要用接近开关检测转轴的缺口位置,转轴转速一上来,接近开关的输出脉宽被压缩到不到1毫秒。最初用普通输入点配合逻辑判断,结果就是偶尔丢位置,设备运行几次后机械角度就偏了。后来把该输入点改到带硬件中断功能的端口上,用中断程序去锁存位置数据,问题直接从根上消失。这就是中断的第一个核心价值:它不依赖扫描周期,而是靠硬件的边沿信号瞬间触发CPU执行指定程序。

1.2 中断相当于插队处理紧急任务

你可以把PLC正常的扫描程序理解为一条流水线,每个周期把所有工位固定走一遍。中断做的事情,就是在流水线上开了一个“紧急出口”:某件急事一到,CPU立刻暂停当前工位的活,先去处理急事,处理完再回到刚才暂停的地方继续流水作业。

这个“暂停-处理-恢复”的过程,从触发到进入中断程序,通常只需要微秒级时间,远比扫描周期短得多。要注意,中断响应时间并不等于中断程序执行时间。响应时间描述的是“从信号到达输入点,到CPU开始执行中断程序第一条指令”的耗时;执行时间则是中断程序本身跑完需要多久。项目里真正要关心的,是这两者之和能否满足工艺要求。

1.3 哪些场景必须用中断

不是所有场合都要上中断,常规逻辑用普通扫描就够了。但下面几类场景,属于中断的典型应用区,建议优先考虑:

  • 高速计数和位置跟踪。编码器脉冲、接近开关脉冲频率较高时,用中断锁存计数值或位置值。
  • 紧急停车和故障保护。过流、过温、急停信号需要通过硬件中断路径快速触发输出,而不是等下一个扫描周期。
  • 与高速外设做数据交换。比如仪表、变频器通过通讯口发来的实时数据,需要第一时间响应。
  • 精确的时间基准任务。通过定时中断产生稳定的固定时间间隔,比如每10ms做一次PID运算。
  • 断电瞬间的数据保持。利用断电中断保存关键数据,避免下次上电丢状态。

说到底,中断解决的是“来不及”的问题。只要你对某个信号的响应时间要求比扫描周期苛刻,就得考虑中断路线。

2. 中断类型怎么选:硬中断、定时中断还是事件中断

2.1 硬件中断:让输入信号直接“叫醒”CPU

硬件中断是最常用的一类,通常是PLC面板上的特定输入点被分配了中断功能,可以检测上升沿或下降沿信号。和普通输入点不同,这些端口的信号不经过完整的输入刷新流程,而是直接触发中断请求。

想把硬件中断用对,第一件事是查清楚你手里的PLC哪些输入点支持中断功能,以及能配置几种触发方式。以常用的日系PLC为例,一般X0、X1这类编号靠前的输入点会预留中断功能,有些型号还允许配置为上升沿触发、下降沿触发或双边沿触发。配置好后,外面接一个接近开关、光电开关或者继电器触点,就能在信号变化的瞬间进入对应的中断子程序。

触发方式的选择是有讲究的。计数或测速类应用推荐上升沿触发,因为上升沿时间点准确;如果是检测某个设备是否被卡住,可能下降沿更符合动作逻辑。还有一类“频率较低但很关键”的信号,比如安全门开关,建议同时利用中高端PLC支持的“输入中断+状态锁存”功能,确保动作发生瞬间就能记录。

2.2 定时中断:把时间切成可控的等份

硬件中断是“事件来了才处理”,定时中断则是“每隔固定时间就处理一次”。它非常适合做什么?循环执行的任务。比如PID调节、温度采样、频率测量计算,这些任务对时间间隔的一致性要求很高,如果放在主程序里跑,每次执行间隔会被扫描周期波动影响,数据就不够稳定。

定时中断的时间基准因PLC而异,常见的有1ms、10ms、100ms可选,有些型号还允许通过特殊寄存器指定任意间隔。我的习惯是:能用慢速的就不用快速的。举个例子,做温度的PID控制,50ms跑一次完全够,就没必要设成5ms,给自己留足裕量,程序也更好调试。

初次使用时容易忽略一个细节:定时中断使能之后,是立即按设定间隔开始,还是从特定触发点开始。多数PLC在你打开全局中断时会马上启动计时,但也有型号需要额外指定首次触发时间。这些差异在手册里都在细节位置,建议配置完先做一次实际测量,用示波器看输出波形或监控中断程序内的计数器,确认实际间隔和设定值一致。

2.3 事件中断:高速计数器、通讯事件的联动

除了输入信号和定时器,PLC内部还有很多事件可以产生中断。典型的有高速计数器到达设定值、通讯接收缓冲区接收到一帧数据、脉冲输出完成、PLC停电瞬间等。

高速计数器中断非常实用,比如做定长剪切:伺服带动材料走,编码器脉冲进高速计数器,当计数值到达设定长度时触发中断,中断程序立刻给出剪切的输出信号。这种方案比在主程序里读当前计数值再比较要精准得多,因为比较动作是硬件在脉冲级完成的,不受扫描周期影响。

通讯中断则适合用在需要快速响应下位机数据的场合。比如仪表每隔100ms发一组数据,如果靠主程序轮询接收缓冲区的状态,难免漏掉或延迟。把接收完成事件映射为中断请求,通讯数据一来,CPU立刻执行解析和存储程序,响应速度能提升一个量级。

2.4 中断优先级:同时触发时谁先执行

不同中断源同时到来时,PLC需要有个裁决顺序,这就是中断优先级。大多数品牌PLC的中断优先级是分组的,并不支持完全自由的软优先级配置。我的经验是:断电保持类中断优先级最高,其次是硬件中断,再次是定时中断,通讯中断通常排在最后。但这只是抽出来的典型规律,工程上用之前必须翻手册确认。

这里有一个常见误解:高优先级会打断低优先级正在执行的中断程序。很多中低端PLC执行中断子程序期间,CPU会把其他中断请求挂起或排队,等当前中断程序跑完才处理下一个,而不是“抢占式”地打断。如果你的应用确实需要处理嵌套场景,就要确认PLC是否支持中断嵌套,不支持的话,务必把每个中断子程序控制在极短执行时间内,避免排队导致响应出错。

为了方便路线选择,我把常见中断源、优先级和典型用途整理成一张表,供选型时快速对应。

中断类型常见触发源优先级(典型)典型应用
电源断电中断外部供电跌落最高保存掉电前关键数据
硬件输入中断输入点边沿信号高急停、高速计数、角度锁存
高速计数器中断计数器到达设定值高定长控制、位置精确触发
定时中断内部定时器中PID周期运算、周期性采样
通讯中断接收/发送完成中低仪表数据实时解析
软件事件中断程序内特定指令触发中低复杂状态机跳转

3. 中断程序的编写与配置实操

3.1 中断子程序的入口与返回规则

中断程序不是随便一段梯形图就行的,它有严格的程序结构。以日系PLC为例,完整程序框架通常是:主程序区最后用FEND指令结束;中断子程序独立放在FEND之后,每个中断子程序需要以特殊的中断子程序编号标识开头,以IRET指令结束。

主程序部分示意:

LD M8000 EI // 允许全局中断 ... MOV D0 D100 FEND // 主程序结束 // 中断子程序编号10,对应X0上升沿中断 子程序 10 MOV C235 D200 // 把当前计数值快速锁存到D200 RETI // 中断返回

这里有几个硬性规则:

  • 中断子程序内不能使用FEND,不能调用普通子程序(多数中低端PLC不允许),更不能出现END指令。
  • 中断子程序越短越好,理想情况下控制在几十条指令以内,因为它执行期间会阻塞主程序和其他挂起的中断处理。
  • 中断子程序内尽量避免复杂的算术运算和串行数据处理,能提前算好的就提前算好,中断里只做“搬数据、置标志、触发输出”这类的轻量操作。

我见过有人把通讯报文解析整套逻辑都塞进中断子程序里,最后主程序长时间被卡住,整个设备动作都变卡。正确的做法是中断子程序里只做“接收数据搬移和置位标志”,解析和处理放到主程序的安全区段,分步完成。

3.2 一个完整的硬件中断配置示例

下面以一个常见的日系PLC为例,实际配置一个X0上升沿触发的中断子程序。整体步骤是:分配中断端口、设置触发方式、编写中断子程序、使能全局中断。

第一步,确认PLC型号支持哪些输入点可作中断。查硬件手册的接线图,找到带中断标识的输入端子。第二步,在PLC参数中把对应输入点设为“中断输入”,并选择上升沿触发。不同PLC设置位置不同,有的在软元件注释表里,有的在特殊功能设置里,照着手册找。第三步,编写如下中断子程序:

子程序 10 MOV C235 D10 // 将高速计数器当前值存入D10 SET M50 // 置位中断触发标志 OUT Y0 // 直接输出剪切的执行信号 RETI

主程序里同样需要一条全局中断使能指令,我习惯放在初始化段中,跟随M8002首次扫描导通。注意,中断配置的动态修改不太方便,很多PLC要求停止运行后重新下载参数,这在现场调试时需要提前规划。

第四步,也是我建议很多人养成习惯的一步:把“中断子程序被调用次数”监控起来。在中断子程序第一行做一次INC到某个寄存器,然后上位机或触摸屏实时监控这个值。只要信号在来,这个值就应该持续增长。如果值不动,说明中断配置或触发条件有问题,这一步能省下大量的排查时间。

3.3 定时中断的间隔选择

定时中断间隔的设定,是很多人拿不准的地方。我从实际经验出发,给出两条可操作的原则:

第一,间隔必须显著大于中断子程序本身的执行时间。假设你的中断程序要执行200μs,那么间隔至少要留到1ms以上,留出5倍以上余量。一旦间隔比执行时间还短,CPU会出现“中断风暴”,系统资源被耗尽,主程序几乎停滞。我处理过一个故障,客户把PID中断设成0.5ms,中断程序里却跑了好几十条浮点运算指令,结果PLC频繁重启,改了间隔之后恢复稳定。

第二,间隔要符合控制对象的时间常数。温度、液位这类大惯性对象,50ms到100ms足够;伺服位置闭环和张力控制这种高速对象,才需要到1ms到10ms级别。一个管设备的工程师,最忌讳“能用最快的就设最快的”,一定要看需求,不需要追求极限。

定时中断程序还有一个容易被忽视的设计点:它需要判断自身是否“上次还没跑完又来了”。我一般会设一个正在执行的标志位,进中断时先判断该标志,若为ON则直接返回,避免重复进入。实际操作中,多数PLC对同一中断源的嵌套调用有限制,但靠标志位做保护,能让逻辑更可控,也便于在监控画面里判断程序是否溢出。

3.4 全局中断的允许与屏蔽

中断程序写好后,还得有“总开关”。绝大多数PLC在程序开头必须执行EI或等价指令,全局中断才生效;如果不执行,即使中断条件满足也不会触发。反过来,DI或等价指令可以临时屏蔽全部中断,这在某些需要短暂保证主程序完整性的场合很有用。

有一种情况很典型:设备启动瞬间,主程序正在做大量初始化操作,不希望中断插进来打乱顺序,可以先在初始化阶段用DI屏蔽中断,等初始化完成再执行EI打开。这个“先屏蔽、后打开”的流程,能够有效避免中断程序在系统状态不完整时被意外触发。

另外提醒一点,很多PLC在RUN模式切换或程序在线修改后,中断允许状态会复位。恢复运行程序时,EI指令一般会重新执行,但如果代码结构里有条件跳转导致EI没被执行到,就会出现“程序看着没问题,中断就是不动作”的情况。调试时如遇中断不响应,第一件事就是检查EI或对应功能是否处于生效状态。

4. 中断与主程序的数据协调

4.1 中断子程序的内存使用策略

中断子程序是独立于主程序周期之外运行的,这意味着它访问数据和主程序访问数据的时机完全不同。不能简单认为“主程序往某个地址写数据,中断程序就能安全读”。不少项目出故障,都是因为主程序和中断程序同时操作同一个软元件,产生了数据竞争。

我推荐的策略是:凡是在中断程序中需要和主程序交换的数据,统一使用专用的软元件区域,不共用临时变量。中断程序向主程序传状态时,用标志位加“锁存型数据寄存器”;主程序向中断程序传参数时,最好在主程序里先修改,再通过一条专门的指令触发刷新。这样做虽然多写几行代码,但能避免很多莫名其妙的数据错乱。

还有个细节,有些PLC的中断子程序无法使用某些指令。比方说,多数中低端PLC的中断子程序不允许使用积分运算、字符串处理、部分通讯指令,甚至在中断子程序里访问某些特殊继电器会得到不可预期的值。写程序前先看支持的指令集,比写完再改要省事得多。

4.2 与主扫描程序的数据交换方式

实际项目中,主程序和中断程序之间的数据交换,常用三种模式:

  • 标志位模式。中断程序只负责置位或复位标志位,主程序在扫描循环里检测标志并按需处理。
  • 数据锁存模式。中断程序把关键数据(计数值、位置值、时间戳)快速复制到指定寄存器里,主程序按固定逻辑读取。
  • 队列模式。中断程序把每次产生的数据按顺序写入一个队列缓冲区,主程序按顺序取出处理,适合高频数据源的累积处理。

以编码器位置锁存为例,主流做法是:外部一转定位信号在硬件中断输入点上触发,中断子程序中立即执行当前高速计数器值传送到专用寄存器,同时置位“位置已更新”标志。主程序每到安全节点检测标志,读取寄存器内容完成后续软逻辑。这套方案我实测稳定,位置误差只受编码器分辨率和脉冲丢失影响,与扫描周期无任何关系。

4.3 嵌套中断:能不用就不用

有些中高端PLC支持中断嵌套,也就是一个中断子程序执行过程中,可以被更高优先级的中断再次打断。这个功能听起来很强大,但在工程中我建议谨慎使用。

为什么?首先,嵌套会让时序分析变得非常困难。你很难判断一个复杂的多层嵌套程序在运行时,某个输出到底何时被置位,调试起来极其痛苦。其次,嵌套次数多了之后,栈空间消耗大,中低端PLC的栈深度有限,一旦溢出,轻则程序跑飞,重则CPU报错停机。

如果确实需要处理两个独立的高速事件,我的建议是合并到一个中断子程序中,通过读取事件来源标志来区分路径,而不是用嵌套。这样程序逻辑更直白,现场维护人员也更容易理解。记住,代码写出来是给人维护的,追求嵌套的灵活性往往得不偿失。

5. 中断踩坑实录与排查清单

5.1 中断始终不触发,先查这五个地方

中断不触发,是群里被问得最多的问题。按下面顺序排查,基本能覆盖90%的案例:

  • 全局中断有没有使能。EI或等价指令有没有被执行到,程序有没有在线修改后复位中断状态。
  • 中断端口分配正确吗。确认用的输入点编号确实具备中断功能,且参数设置已下载并生效。
  • 触发方式是不是反了。上升沿触发却送了一个下降沿信号,或者信号电平维持时间太短被滤波吃掉。
  • 输入滤波有没有设成默认最大值。某些PLC默认输入滤波在10ms左右,高速脉冲信号过去就被滤没了,中断自然不动作。
  • 中断子程序编号和触发源是否对应。不同PLC对应关系不同,编号错一位,触发源就对不上。

有一次我在现场排查,设备调试人员坚持说“信号进来了,中断没反应”,我用万用表量输入点也有信号,后来打开参数一看,该输入点被配置成普通输入还叠加了20ms滤波,中断功能根本没启用。这种低级错误,往往是赶工时最容易犯的。

5.2 中断响应慢于预期的原因

中断响应时间偏慢,大多数时候不在CPU本身,而在信号链路的入口和出口。入口侧的滤波时间、出口侧的输出刷新,才是拉长整体响应时间的元凶。

输入滤波这块,如果PLC允许,把中断输入点对应的滤波时间设置为最小值或关闭。开个玩笑说,很多PLC的默认滤波参数是为普通开关设计的,几毫秒到十几毫秒都有,对高速信号非常不友好。输出侧同样如此,如果中断程序里直接驱动输出点,该输出点本身也可能有输出滤波器或输出延迟,配置时也要一并调整。

我处理过一个模切机的案例,中断触发的裁切信号和实际动作差了大约30ms,导致产品尺寸偏差。排查后发现输入滤波15ms、输出滤波10ms,加起来占了总共30ms的绝大部分。把两端滤波都调到最快之后,整体响应压到3ms以内,完全满足工艺。

5.3 高速信号反复触发或漏触发

高速信号下,中断有时会出现“多触发一次”或“少触发一次”的情况。多触发,多半是信号在触发电平附近抖动,产生了多次边沿。这时候可以用硬件手段消除:在输入端并联小容量电容或者使用带施密特触发器的信号调理板。不过要注意,加电容会引入额外的滤波时间,需要在稳定性和响应速度之间找平衡,不是越大越好。

少触发则通常源于信号脉宽过窄,再加上输入滤波或光电隔离延迟,边沿没有被识别。解决方向是提高信号源驱动能力、缩短接线距离、减少中间继电器转换环节。很多现场用了中间继电器转接,中间继电器的机械动作时间本身就不可控,这是漏触发的最常见来源。能用驱动能力强的传感器或PLC输出直接接,就不要绕这一道。

5.4 在线修改出问题的处理经验

实际操作中经常遇到:程序在线修改后,中断功能突然失效,或者程序一下载设备就停机。多数原因还是前面说的中断允许状态被复位,以及中断参数的下载需要PLC切换到STOP状态。注意,有些PLC的程序在线修改功能,对于中断子程序的修改是有限制的,必须在停止状态下写入。

我的建议是建立一套“中断程序修改管理流程”:修改前先记录当前中断使能状态和关键寄存器值,修改后统一做一次状态确认;下载新程序后,手动执行一次EI或重新初始化,确保中断功能恢复;如果有条件,修改后先在离线模拟环境中跑一遍中断逻辑,再上现场设备做联调。

还有一个小技巧值得推荐:给每个中断子程序都加一个“累计触发计数器”,并且和中断状态字一起在触摸屏或上位机上做成一个监控页面。平时多留意这些数值,设备运行异常时,你能一眼就看出是中断没进来、进得太频繁、还是压根没使能,排查范围瞬间就能缩小。

最后补一句我的体会

从第一次被中断程序搞到半夜,到后来形成一套自己的固定写法,中断功能在我眼里已经不是单纯的一个配置项,而是整个控制系统的“优先级设计艺术”。我用得最多的场景无非三块:高速位置锁存、周期性的闭环运算、设备保护联锁。每次接手新项目,我都会先问自己三个问题:哪些信号必须中断处理?中断程序里需要交换哪些数据?主程序怎样配合才能不为难中断?三个问题想清楚了,程序架构基本不会乱。

如果你正在学习中断,我的建议是从一个最简单的硬件中断做起点,按本文的示例把流程走一遍,然后在定时中断里做一个周期累加,用触摸屏或调试软件观察数据。不要一上来就追求复杂,先把“来得及、不会再丢”这件事搞明白,中断能力自然就长在你身上了。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/12 1:02:52

小脑启发无模型控制:解决手术机器人RCM约束与模型不确定性

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/12 1:02:45

UFS 3.1 HPB机制深度解析:从协议条款到实战调优

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/12 1:01:49

EPLAN电气设计实战:从新建项目到多线原理图与2D布局全流程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/12 1:01:49

STM32外接DS1302实时时钟芯片驱动从原理到代码详解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/12 1:01:47

5G PRACH随机接入原理与排障:从前导格式到RAR定位

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/12 1:01:10

Ubuntu 20.04 编译 Linux 5.15.2 内核实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华