Skip to content

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_BLOCK

3.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编号默认周期可配置范围
OB305000ms1ms - 60000ms
OB312000ms1ms - 60000ms
OB321000ms1ms - 60000ms
OB33500ms1ms - 60000ms
OB34200ms1ms - 60000ms
OB35100ms1ms - 60000ms
OB3650ms1ms - 60000ms
OB3720ms1ms - 60000ms
OB3810ms1ms - 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_BLOCK

4.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_BLOCK

5.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
      
      IRET

6. 中断优先级

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_BLOCK

7.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_BLOCK

7.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
      RET

8. 中断编程注意事项

8.1 中断程序设计原则

中断程序设计黄金法则:
┌─────────────────────────────────────────────────────────┐
│                                                         │
│  1. 【短小精悍】                                        │
│     中断程序应尽可能短,快速返回                        │
│     复杂处理放到主程序中执行                            │
│                                                         │
│  2. 【避免阻塞】                                        │
│     不要在中断中使用延时、等待                          │
│     不要在中断中调用可能阻塞的函数                      │
│                                                         │
│  3. 【数据保护】                                        │
│     与主程序共享的数据要注意互斥                        │
│     使用标志位进行同步                                  │
│                                                         │
│  4. 【资源独立】                                        │
│     中断中使用的资源避免与主程序冲突                    │
│     定时器、计数器等资源要规划好                        │
│                                                         │
│  5. 【可靠返回】                                        │
│     确保所有路径都能正确返回                            │
│     避免中断中出现死循环                                │
│                                                         │
└─────────────────────────────────────────────────────────┘

8.2 常见错误与解决方案

错误现象可能原因解决方案
中断不触发中断未使能检查EI指令或中断配置
中断触发频繁抖动或噪声添加硬件滤波或防抖
系统响应变慢中断程序过长优化中断代码,移出非紧急处理
数据错乱中断与主程序冲突添加互斥保护
丢失中断中断处理时间过长缩短中断程序,提高优先级

8.3 中断调试技巧

中断调试方法:
┌─────────────────────────────────────────────────────────┐
│                                                         │
│  1. 计数法                                              │
│     在中断中增加计数器,观察中断执行次数                │
│                                                         │
│  2. 时间戳法                                            │
│     记录中断发生时间,分析中断间隔                      │
│                                                         │
│  3. 标志位法                                            │
│     设置调试标志位,在主程序中监控                      │
│                                                         │
│  4. LED指示法                                           │
│     用输出点/LED指示中断状态                            │
│                                                         │
│  5. 日志记录                                            │
│     将关键信息写入数据区,事后分析                      │
│                                                         │
└─────────────────────────────────────────────────────────┘

本节小结

中断程序设计知识要点:
┌─────────────────────────────────────────────────────────┐
│                                                         │
│  中断概念      中断类型        硬件中断                 │
│  ├─暂停当前    ├─硬件中断      ├─外部信号触发           │
│  ├─处理紧急    ├─定时中断      ├─紧急停止应用           │
│  └─返回继续    ├─通信中断      └─高速脉冲捕获           │
│                └─故障中断                               │
│                                                         │
│  定时中断      通信中断        中断优先级               │
│  ├─固定周期    ├─接收完成      ├─故障>硬件>定时         │
│  ├─PID控制     ├─协议解析      ├─中断嵌套               │
│  └─精确采样    └─数据处理      └─禁用/启用控制          │
│                                                         │
│  编程原则                                               │
│  ├─程序短小、快速返回                                   │
│  ├─避免阻塞操作                                         │
│  ├─数据互斥保护                                         │
│  └─合理规划优先级                                       │
│                                                         │
└─────────────────────────────────────────────────────────┘

练习题

基础题

  1. 什么是中断?中断与普通循环程序有什么区别?
  2. 列举PLC中常见的中断类型及其应用场景
  3. 西门子S7-1200中,OB35的默认执行周期是多少?
  4. 三菱FX中,如何允许和禁止中断?

编程题

  1. 编写一个紧急停止中断程序,当X0检测到下降沿时立即停止所有输出
  2. 使用定时中断实现LED闪烁(500ms周期),不使用定时器指令
  3. 设计一个高速计数系统,当计数值达到设定值时触发中断并输出信号
  4. 编写多任务定时系统,实现以下功能:
    • 10ms任务:读取高速输入
    • 100ms任务:PID计算
    • 1000ms任务:数据记录

思考题

  1. 为什么中断程序应该尽可能短?如果中断程序执行时间过长会有什么后果?
  2. 当多个中断同时发生时,如何确保关键中断得到及时处理?
  3. 中断程序与主程序共享数据时,可能出现什么问题?如何解决?

拓展阅读

  • 西门子TIA Portal帮助文档:组织块(OB)详解
  • 三菱编程手册:高速处理功能
  • IEC 61131-3标准:任务配置规范
  • 实时系统原理:中断响应时间分析

本节完

本教程由 AI (Claude Opus 4.5) 生成,仅供学习参考