4.5 中断程序设计
本节将介绍PLC的中断处理机制,掌握中断是实现高速响应和精确控制的关键技术
学习目标
- 理解中断的概念和工作原理
- 掌握各类中断的特点和应用场景
- 学会编写中断服务程序
- 能够合理设置中断优先级
- 掌握中断程序的调试方法
1. 中断的基本概念
1.1 什么是中断?
中断(Interrupt) 是指CPU暂停当前正在执行的程序,转去处理紧急事件,处理完成后再返回继续执行原程序的机制。
中断处理过程示意图:
┌─────────────────────────────────────────────────────────────┐
│ │
│ 主程序执行 中断发生 返回主程序 │
│ ─────────→ ↓ ─────────→ │
│ │ │
│ ┌─────┐ │ ┌─────┐ │
│ │ │ ↓ │ │ │
│ │ OB1 │ ┌─────────────┐ │ OB1 │ │
│ │ │ │ 保存现场 │ │ │ │
│ │ 指令│ │ ↓ │ │ 继续│ │
│ │ A │ │ 执行中断 │ │ 执行│ │
│ │ │ │ 服务程序 │ │ │ │
│ │ 指令│ │ ↓ │ │ 指令│ │
│ │ B │←───│ 恢复现场 │────────→ C │ │
│ │ │ └─────────────┘ │ │ │
│ └─────┘ └─────┘ │
│ │
└─────────────────────────────────────────────────────────────┘1.2 中断与普通程序的区别
| 特性 | 普通程序(循环扫描) | 中断程序 |
|---|---|---|
| 执行方式 | 按顺序周期性执行 | 事件触发执行 |
| 响应时间 | 取决于扫描周期 | 微秒级响应 |
| 执行时机 | 固定顺序 | 随时可能发生 |
| 优先级 | 较低 | 较高 |
| 应用场景 | 一般控制逻辑 | 高速、紧急事件 |
1.3 为什么需要中断?
扫描周期的局限性:
假设扫描周期 = 10ms
扫描周期
├──────────┤
时间轴 ─────────────────────────────────────→
↑ ↑ ↑
扫描开始 扫描结束 下次扫描
如果在扫描中间发生紧急事件:
↓
时间轴 ─────●──────◆────────────────────────→
│ │
扫描开始 紧急事件
│
最坏情况下
需等待近10ms
才能响应!中断解决方案:
- 高速计数:脉冲频率高于扫描频率时
- 紧急停机:安全事件需要立即响应
- 精确定时:需要比扫描周期更精确的时间控制
- 通信处理:及时响应通信请求
2. 中断的类型
2.1 PLC中断分类
PLC中断类型总览:
┌─────────────────────────────────────────────────────────┐
│ PLC中断 │
├─────────────┬─────────────┬─────────────┬──────────────┤
│ 硬件中断 │ 定时中断 │ 通信中断 │ 故障中断 │
├─────────────┼─────────────┼─────────────┼──────────────┤
│ • 外部输入 │ • 循环中断 │ • 串口中断 │ • 电源故障 │
│ • 高速计数 │ • 延时中断 │ • 网络中断 │ • 硬件故障 │
│ • 脉冲捕获 │ • 日期时间 │ • 协议中断 │ • 程序错误 │
└─────────────┴─────────────┴─────────────┴──────────────┘2.2 中断类型说明
常见中断类型及应用:
| 中断类型 | 触发条件 | 应用场景 |
|---|---|---|
| 主程序 | 循环执行 | 常规控制逻辑 |
| 日期时间中断 | 特定时间点触发 | 定时任务 |
| 延时中断 | 延时后触发一次 | 单次延时操作 |
| 循环中断 | 固定周期触发 | PID控制、采样 |
| 硬件中断 | 外部事件触发 | 紧急停止、外部信号 |
| 时间错误 | 扫描周期超时 | 异常处理 |
| 诊断中断 | 模块故障 | 故障处理 |
| 启动中断 | PLC启动时执行 | 初始化 |
| 编程错误 | 程序运行错误 | 错误处理 |
| I/O访问错误 | 外设访问错误 | 错误处理 |
2.3 中断输入点分配
中断输入点对应关系:
┌─────────┬───────────┬────────────┐
│ 输入点 │ 上升沿中断 │ 下降沿中断 │
├─────────┼───────────┼────────────┤
│ 中断输入0 │ 中断0 │ 中断1 │
│ 中断输入1 │ 中断2 │ 中断3 │
│ 中断输入2 │ 中断4 │ 中断5 │
│ 中断输入3 │ 中断6 │ 中断7 │
└─────────┴───────────┴────────────┘3. 硬件中断
3.1 硬件中断概述
硬件中断由外部物理信号触发,用于响应外部设备的紧急事件。
典型应用:
- 紧急停止按钮
- 限位开关触发
- 高速脉冲捕获
- 外部设备信号
3.2 西门子硬件中断配置
步骤1:配置数字量输入通道
在设备配置中启用硬件中断:
TIA Portal配置步骤:
1. 打开设备配置
2. 选择数字量输入模块
3. 点击对应通道
4. 勾选"启用硬件中断"
5. 设置触发边沿(上升/下降/双边沿)步骤2:创建硬件中断OB
pascal
// OB40 - 硬件中断组织块
ORGANIZATION_BLOCK "Hardware_Interrupt"
TITLE = "硬件中断处理"
VERSION : 0.1
VAR_TEMP
// 临时变量
Interrupt_ID : DINT; // 中断标识
Channel_Num : INT; // 通道号
END_VAR
BEGIN
// 读取中断信息
#Interrupt_ID := #LADDR; // 触发中断的模块地址
// 根据中断源执行相应处理
IF #Interrupt_ID = 16#100 THEN
// 处理紧急停止
"Emergency_Stop" := TRUE;
"Motor_Run" := FALSE;
"Alarm_Active" := TRUE;
END_IF;
END_ORGANIZATION_BLOCK3.3 三菱输入中断
中断指针分配:
输入中断指针对应关系:
┌─────────┬───────────┬────────────┐
│ 输入点 │ 上升沿中断 │ 下降沿中断 │
├─────────┼───────────┼────────────┤
│ X0 │ I000 │ I001 │
│ X1 │ I100 │ I101 │
│ X2 │ I200 │ I201 │
│ X3 │ I300 │ I301 │
│ X4 │ I400 │ I401 │
│ X5 │ I500 │ I501 │
└─────────┴───────────┴────────────┘中断程序示例:
// 主程序中允许中断
// 允许中断输入0上升沿中断
开中断 // 开中断总允许
中断返回 // 中断返回
// ============================================
// 中断服务程序(中断输入0上升沿触发)
// ============================================
主程序结束 // 主程序结束
// 中断服务程序
中断0:
// 紧急停止处理
RST 电机1 // 立即停止电机1
RST 电机2 // 立即停止电机2
SET 报警标志 // 设置报警标志
中断返回 // 中断返回3.4 硬件中断应用实例——紧急停止
紧急停止系统设计:
┌─────────────────────────────────────────────────────┐
│ 紧急停止系统 │
├─────────────────────────────────────────────────────┤
│ │
│ [急停按钮]──→ X0 ──→ 硬件中断 ──→ 立即停机 │
│ ↓ │
│ 保存当前状态 │
│ ↓ │
│ 切断所有输出 │
│ ↓ │
│ 触发报警 │
│ │
│ 响应时间: < 1ms(相比扫描周期10ms大幅提升) │
│ │
└─────────────────────────────────────────────────────┘紧急停止中断实现代码:
// 紧急停止中断程序
变量定义
临时信息 : 整数;
结束
开始
// 立即执行紧急停止
// 1. 停止所有执行机构
输出字 := 0; // 所有输出清零
// 2. 记录停机时刻
停机时间 := 系统时间;
// 3. 保存当前状态用于恢复
保存步骤 := 当前步骤;
// 4. 设置系统状态
系统状态 := 0; // 停机状态
紧急停止标志 := 真;
// 5. 触发报警
报警蜂鸣 := 真;
报警灯 := 真;
结束中断程序4. 定时中断
4.1 定时中断概述
定时中断按固定时间间隔周期性触发,用于需要精确定时的控制任务。
特点:
- 执行周期与扫描周期无关
- 时间精度高(通常1ms)
- 适合闭环控制、采样等应用
4.2 西门子循环中断(Cyclic Interrupt)
循环中断OB配置:
| OB编号 | 默认周期 | 可配置范围 |
|---|---|---|
| OB30 | 5000ms | 1ms - 60000ms |
| OB31 | 2000ms | 1ms - 60000ms |
| OB32 | 1000ms | 1ms - 60000ms |
| OB33 | 500ms | 1ms - 60000ms |
| OB34 | 200ms | 1ms - 60000ms |
| OB35 | 100ms | 1ms - 60000ms |
| OB36 | 50ms | 1ms - 60000ms |
| OB37 | 20ms | 1ms - 60000ms |
| OB38 | 10ms | 1ms - 60000ms |
配置循环中断周期:
TIA Portal中配置:
1. 在项目树中展开PLC
2. 双击"设备配置"
3. 选择"常规" → "循环中断"
4. 设置所需OB的执行周期
5. 下载到PLC循环中断程序示例——PID控制:
pascal
// OB35 - 100ms循环中断(PID控制)
ORGANIZATION_BLOCK "PID_Control_Cyclic"
TITLE = "PID温度控制"
VERSION : 0.1
VAR_TEMP
// 临时变量
temp_Error : REAL;
temp_P_Term : REAL;
temp_I_Term : REAL;
temp_D_Term : REAL;
temp_Output : REAL;
END_VAR
BEGIN
// ========================================
// PID温度控制算法
// 采样周期: 100ms
// ========================================
// 1. 计算误差
#temp_Error := "Temperature_SP" - "Temperature_PV";
// 2. 比例项
#temp_P_Term := "PID_Kp" * #temp_Error;
// 3. 积分项(累加)
"PID_Integral" := "PID_Integral" + #temp_Error * 0.1; // 0.1s周期
// 积分限幅
IF "PID_Integral" > 100.0 THEN
"PID_Integral" := 100.0;
ELSIF "PID_Integral" < -100.0 THEN
"PID_Integral" := -100.0;
END_IF;
#temp_I_Term := "PID_Ki" * "PID_Integral";
// 4. 微分项
#temp_D_Term := "PID_Kd" * (#temp_Error - "PID_Last_Error") / 0.1;
"PID_Last_Error" := #temp_Error;
// 5. 计算输出
#temp_Output := #temp_P_Term + #temp_I_Term + #temp_D_Term;
// 6. 输出限幅
IF #temp_Output > 100.0 THEN
#temp_Output := 100.0;
ELSIF #temp_Output < 0.0 THEN
#temp_Output := 0.0;
END_IF;
"Heater_Output" := #temp_Output;
END_ORGANIZATION_BLOCK4.3 三菱定时中断
定时中断配置:
三菱FX定时中断设置:
┌─────────────────────────────────────────┐
│ 中断指针 │ 定时周期 │ 说明 │
├───────────┼───────────┼───────────────┤
│ I6□□ │ 1-99ms │ □□为周期值 │
│ I7□□ │ 10-990ms │ □□×10为周期 │
│ I8□□ │100-9900ms │ □□×100为周期 │
└─────────────────────────────────────────┘
示例:
I610 → 10ms定时中断
I750 → 500ms定时中断
I810 → 1000ms定时中断定时中断程序:
// 主程序
// 设置10ms定时中断(I610)
EI // 开中断
// ... 主程序逻辑 ...
FEND // 主程序结束
// ============================================
// 定时中断子程序 I610(10ms周期)
// ============================================
I610:
// 高速采样处理
MOV K4X0 D100 // 读取输入状态
// 位置计算
ADD D200 D100 D200 // 累加位置
// 计数器递增
INC D300 // 中断计数+1
IRET // 中断返回4.4 定时中断应用——高精度采样
高精度数据采样系统:
┌─────────────────────────────────────────────────────────┐
│ │
│ 模拟量输入 ──→ 定时中断采样 ──→ 数据缓冲区 │
│ (1ms) │
│ ↓ │
│ 主程序处理 │
│ ↓ │
│ 数据输出/显示 │
│ │
│ 时序图: │
│ ├─1ms─┤─1ms─┤─1ms─┤─1ms─┤ │
│ ↑ ↑ ↑ ↑ │
│ 采样 采样 采样 采样 │
│ │
└─────────────────────────────────────────────────────────┘5. 通信中断
5.1 通信中断概述
通信中断用于响应通信事件,如数据接收完成、发送完成、通信错误等。
应用场景:
- 串口数据接收
- 网络消息处理
- 协议帧解析
5.2 西门子通信中断
接收中断配置(RCVD):
pascal
// 在OB1中配置接收中断
"RCVD_DB"(
EN_R := TRUE, // 启用接收
PORT := 1, // 端口号
LADDR := "CM1241_Addr", // 模块地址
DONE => "Recv_Done", // 接收完成
ERROR => "Recv_Error", // 接收错误
STATUS => "Recv_Status", // 状态
RCVD => "Data_Received" // 接收到数据标志
);
// 在OB82(通信中断OB)中处理
ORGANIZATION_BLOCK "Comm_Interrupt"
BEGIN
// 检查是否是接收中断
IF "Data_Received" THEN
// 处理接收的数据
"Process_Recv_Data"();
"Data_Received" := FALSE;
END_IF;
END_ORGANIZATION_BLOCK5.3 三菱通信中断
三菱串口中断设置:
┌────────────────────────────────────────┐
│ 中断指针 │ 触发条件 │
├───────────┼───────────────────────────┤
│ I100 │ RS指令接收完成中断 │
│ I101 │ RS2指令接收完成中断 │
│ I150 │ 通信错误中断 │
└────────────────────────────────────────┘通信中断程序示例:
// 主程序初始化串口
// RS指令设置
RS D0 K8 D100 K8 // 发送D0开始8字节,接收到D100
// 允许通信中断
EI
FEND
// ============================================
// 通信中断子程序 I100(接收完成)
// ============================================
I100:
// 处理接收数据
MOV D100 D200 // 保存数据1
MOV D101 D201 // 保存数据2
// 设置接收完成标志
SET M200
// 清除接收缓冲区
FMOV K0 D100 K8
IRET6. 中断优先级
6.1 优先级概念
当多个中断同时发生时,CPU按优先级顺序处理。
西门子S7-1200/1500中断优先级:
┌─────────────────────────────────────────────────────────┐
│ 优先级 │ OB类型 │ 说明 │
├─────────┼──────────────┼─────────────────────────────┤
│ 最高 │ 故障中断 │ OB80/82/83/121/122等 │
│ ↑ │ 硬件中断 │ OB40-47 │
│ │ │ 延时中断 │ OB20-23 │
│ │ │ 循环中断 │ OB30-38(编号越小优先级越高)│
│ │ │ 日期时间中断 │ OB10-17 │
│ 最低 │ 主程序 │ OB1 │
└─────────────────────────────────────────────────────────┘6.2 中断嵌套
高优先级中断可以打断低优先级中断的执行:
中断嵌套示意图:
┌─────────────────────────────────────────────────────────┐
│ │
│ OB1执行 ──→ OB35中断 ──→ OB40中断 ──→ 返回OB35 ──→ 返回OB1 │
│ │ │ │ │ │ │
│ └───────────┴───────────┴───────────┴───────────┘ │
│ │
│ 时间轴 ─────────────────────────────────────────────→ │
│ ↑ ↑ │
│ 循环中断 硬件中断 │
│ 触发 触发 │
│ (优先级更高 │
│ 打断OB35) │
│ │
└─────────────────────────────────────────────────────────┘6.3 优先级配置
西门子TIA Portal中配置:
配置步骤:
1. 双击需要配置的OB
2. 在属性中找到"执行优先级"
3. 设置优先级数值(1-26)
- 数值越大优先级越高
- 同一优先级按触发顺序执行
注意事项:
- 避免高优先级中断执行时间过长
- 合理规划优先级避免关键中断被阻塞6.4 中断禁用与启用
西门子中断控制:
pascal
// 禁用中断
DIS_IRT(); // 禁用所有中断
// 执行关键代码
// ... 不可被中断的操作 ...
// 重新启用中断
EN_IRT(); // 启用所有中断三菱中断控制:
// 禁止中断
DI // 禁止所有中断
// 关键操作
MOV D0 D100
MOV D1 D101
// 允许中断
EI // 允许所有中断
// 禁止特定中断
IMASK H3F // 禁止指定中断(位屏蔽)
// 单独禁止/允许
DISI I000 // 禁止I000中断
ENI I000 // 允许I000中断7. 中断程序编写实例
7.1 实例1:高速脉冲计数
需求: 编码器脉冲计数,频率可达100kHz
高速计数系统架构:
┌─────────────────────────────────────────────────────────┐
│ │
│ 编码器 ──A相──→ HSC0 ──→ 硬件中断 ──→ 位置计算 │
│ ──B相──→ │
│ ──Z相──→ ┌──────────┐ │
│ │ 计数值 │ │
│ │ D8000 │ │
│ └──────────┘ │
│ │
│ 最高计数频率: 100kHz │
│ 分辨率: 4倍频后 = 4000脉冲/转 │
│ │
└─────────────────────────────────────────────────────────┘三菱FX高速计数中断:
// ============================================
// 高速计数器中断程序
// 功能:编码器位置跟踪
// ============================================
// 主程序设置
// 设置高速计数器C235(X0/X1双相输入)
LD M8000 // 常ON
DCNT C235 K0 // 启动计数器,目标值0(用于比较)
// 设置比较值中断
// 当计数值=10000时触发中断I010
LD M8000
DHSCS K10000 C235 I010 // 设置中断触发点
// 允许中断
EI
FEND
// ============================================
// 中断子程序 I010(到达目标位置)
// ============================================
I010:
// 到达目标位置
SET M100 // 设置到位标志
RST Y0 // 停止伺服使能
// 记录实际位置
DMOV K4X0 D200 // 读取当前计数值
IRET西门子高速计数:
pascal
// OB40 - 高速计数中断
ORGANIZATION_BLOCK "HSC_Interrupt"
VAR_TEMP
temp_Count : DINT;
END_VAR
BEGIN
// 读取当前计数值
#temp_Count := "HSC1".CV; // 当前计数值
// 位置到达检测
IF #temp_Count >= "Target_Position" THEN
// 停止运动
"Servo_Enable" := FALSE;
"Position_Reached" := TRUE;
// 记录实际位置
"Actual_Position" := #temp_Count;
END_IF;
END_ORGANIZATION_BLOCK7.2 实例2:多任务定时系统
需求: 同时处理多个不同周期的任务
多任务定时系统:
┌─────────────────────────────────────────────────────────┐
│ │
│ 任务调度架构: │
│ ┌────────────────────────────────────────────────┐ │
│ │ OB35 (100ms) - PID控制 │ │
│ ├────────────────────────────────────────────────┤ │
│ │ OB36 (50ms) - 位置采样 │ │
│ ├────────────────────────────────────────────────┤ │
│ │ OB37 (20ms) - 高速信号处理 │ │
│ ├────────────────────────────────────────────────┤ │
│ │ OB1 - 界面刷新、通信处理 │ │
│ └────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────┘西门子多周期中断配置:
pascal
// ============================================
// OB37 - 20ms高速任务
// ============================================
ORGANIZATION_BLOCK "Fast_Task"
BEGIN
// 读取高速输入
"Fast_Input" := %I0.0;
// 快速滤波
"Filter_Sum" := "Filter_Sum" - "Filter_Buffer"[0];
"Filter_Buffer"[0] := "Filter_Buffer"[1];
"Filter_Buffer"[1] := "Filter_Buffer"[2];
"Filter_Buffer"[2] := "Filter_Buffer"[3];
"Filter_Buffer"[3] := BOOL_TO_INT("Fast_Input");
"Filter_Sum" := "Filter_Sum" + "Filter_Buffer"[3];
"Filtered_Value" := "Filter_Sum" > 2;
END_ORGANIZATION_BLOCK
// ============================================
// OB36 - 50ms位置任务
// ============================================
ORGANIZATION_BLOCK "Position_Task"
BEGIN
// 读取编码器
"Encoder_Value" := "HSC1".CV;
// 计算速度(差分)
"Speed" := ("Encoder_Value" - "Last_Encoder") * 20; // 脉冲/秒
"Last_Encoder" := "Encoder_Value";
// 位置换算(假设1000脉冲/mm)
"Position_mm" := DINT_TO_REAL("Encoder_Value") / 1000.0;
END_ORGANIZATION_BLOCK
// ============================================
// OB35 - 100ms PID任务
// ============================================
ORGANIZATION_BLOCK "PID_Task"
BEGIN
// 调用PID功能块
"PID_Instance"(
Enable := "PID_Enable",
Setpoint := "Position_SP",
Feedback := "Position_mm",
Output => "Motor_Speed"
);
END_ORGANIZATION_BLOCK7.3 实例3:通信协议解析
需求: 解析自定义串口协议
协议帧格式:
┌──────┬──────┬──────┬──────────┬──────┐
│ 帧头 │ 长度 │ 命令 │ 数据 │ 校验 │
│ 0xAA │ N │ CMD │ N-2字节 │ CRC │
└──────┴──────┴──────┴──────────┴──────┘三菱通信中断解析:
// ============================================
// 通信接收中断
// 功能:解析自定义协议
// ============================================
// 主程序
// 初始化串口
MOV H8681 D8120 // 串口参数:9600,N,8,1
// 接收设置
RS D200 K0 D300 K50 // 接收到D300,最大50字节
EI
FEND
// ============================================
// 中断子程序 I100(接收完成)
// ============================================
I100:
// 检查帧头
LD D300 = HAA
ANI M500 // 非处理中
// 帧头正确,开始解析
SET M500 // 设置处理中标志
// 读取长度
MOV D301 D400 // 长度存入D400
// 读取命令
MOV D302 D401 // 命令存入D401
// 计算校验
MOV K0 D410 // 校验和清零
// 累加校验
FOR K0 D400 // 循环长度次
ADD D410 D300+K0 D410
NEXT
// 校验比较
LD D410 = D300+D400+1
SET M501 // 校验通过
// 根据命令执行
CJ M501 P100 // 跳转到命令处理
RST M500 // 清除处理标志
IRET
// 命令处理子程序
P100:
// 命令1:读取参数
LD D401 = K1
CALL P200
// 命令2:写入参数
LD D401 = K2
CALL P201
// 命令3:启动运行
LD D401 = K3
SET M10 // 启动标志
RST M500
RET8. 中断编程注意事项
8.1 中断程序设计原则
中断程序设计黄金法则:
┌─────────────────────────────────────────────────────────┐
│ │
│ 1. 【短小精悍】 │
│ 中断程序应尽可能短,快速返回 │
│ 复杂处理放到主程序中执行 │
│ │
│ 2. 【避免阻塞】 │
│ 不要在中断中使用延时、等待 │
│ 不要在中断中调用可能阻塞的函数 │
│ │
│ 3. 【数据保护】 │
│ 与主程序共享的数据要注意互斥 │
│ 使用标志位进行同步 │
│ │
│ 4. 【资源独立】 │
│ 中断中使用的资源避免与主程序冲突 │
│ 定时器、计数器等资源要规划好 │
│ │
│ 5. 【可靠返回】 │
│ 确保所有路径都能正确返回 │
│ 避免中断中出现死循环 │
│ │
└─────────────────────────────────────────────────────────┘8.2 常见错误与解决方案
| 错误现象 | 可能原因 | 解决方案 |
|---|---|---|
| 中断不触发 | 中断未使能 | 检查EI指令或中断配置 |
| 中断触发频繁 | 抖动或噪声 | 添加硬件滤波或防抖 |
| 系统响应变慢 | 中断程序过长 | 优化中断代码,移出非紧急处理 |
| 数据错乱 | 中断与主程序冲突 | 添加互斥保护 |
| 丢失中断 | 中断处理时间过长 | 缩短中断程序,提高优先级 |
8.3 中断调试技巧
中断调试方法:
┌─────────────────────────────────────────────────────────┐
│ │
│ 1. 计数法 │
│ 在中断中增加计数器,观察中断执行次数 │
│ │
│ 2. 时间戳法 │
│ 记录中断发生时间,分析中断间隔 │
│ │
│ 3. 标志位法 │
│ 设置调试标志位,在主程序中监控 │
│ │
│ 4. LED指示法 │
│ 用输出点/LED指示中断状态 │
│ │
│ 5. 日志记录 │
│ 将关键信息写入数据区,事后分析 │
│ │
└─────────────────────────────────────────────────────────┘本节小结
中断程序设计知识要点:
┌─────────────────────────────────────────────────────────┐
│ │
│ 中断概念 中断类型 硬件中断 │
│ ├─暂停当前 ├─硬件中断 ├─外部信号触发 │
│ ├─处理紧急 ├─定时中断 ├─紧急停止应用 │
│ └─返回继续 ├─通信中断 └─高速脉冲捕获 │
│ └─故障中断 │
│ │
│ 定时中断 通信中断 中断优先级 │
│ ├─固定周期 ├─接收完成 ├─故障>硬件>定时 │
│ ├─PID控制 ├─协议解析 ├─中断嵌套 │
│ └─精确采样 └─数据处理 └─禁用/启用控制 │
│ │
│ 编程原则 │
│ ├─程序短小、快速返回 │
│ ├─避免阻塞操作 │
│ ├─数据互斥保护 │
│ └─合理规划优先级 │
│ │
└─────────────────────────────────────────────────────────┘练习题
基础题
- 什么是中断?中断与普通循环程序有什么区别?
- 列举PLC中常见的中断类型及其应用场景
- 西门子S7-1200中,OB35的默认执行周期是多少?
- 三菱FX中,如何允许和禁止中断?
编程题
- 编写一个紧急停止中断程序,当X0检测到下降沿时立即停止所有输出
- 使用定时中断实现LED闪烁(500ms周期),不使用定时器指令
- 设计一个高速计数系统,当计数值达到设定值时触发中断并输出信号
- 编写多任务定时系统,实现以下功能:
- 10ms任务:读取高速输入
- 100ms任务:PID计算
- 1000ms任务:数据记录
思考题
- 为什么中断程序应该尽可能短?如果中断程序执行时间过长会有什么后果?
- 当多个中断同时发生时,如何确保关键中断得到及时处理?
- 中断程序与主程序共享数据时,可能出现什么问题?如何解决?
拓展阅读
- 西门子TIA Portal帮助文档:组织块(OB)详解
- 三菱编程手册:高速处理功能
- IEC 61131-3标准:任务配置规范
- 实时系统原理:中断响应时间分析
本节完