在西门子PLC编程中,OB(Organization Block,组织块)是操作系统与用户程序之间的接口。理解并正确设置OB的优先级,决定了当多个事件同时发生时,CPU先处理哪一个。这直接关系到系统的实时性和响应速度。例如,一个急停信号必须比普通的温度读取拥有更高的执行权限。本指南将详细介绍如何查看、理解及配置西门子PLC(基于TIA Portal博图环境)的OB组织块优先级。
一、 理解优先级与中断机制
PLC采用循环扫描的方式工作,但中断机制打破了这种循环。当高优先级的事件发生时,CPU会暂停当前正在运行的低优先级程序,转而去执行高优先级的OB,执行完毕后再返回断点继续执行。优先级数值越大,级别越高。
为了直观展示这一抢占过程,请参考以下逻辑流程:
通过上图可以看出,只要OB40被触发,无论OB1执行到哪里,都会立即让出CPU资源。
二、 常用OB块的默认优先级参考
在修改优先级前,必须熟知系统默认的分配。不同型号的CPU(如S7-1200与S7-1500)在部分OB的默认值上可能略有差异,但总体遵循以下规律。
| OB 类型 | 默认优先级 | 功能描述 |
|---|---|---|
| OB1 | 1 | 主程序循环,唯一无间隔循环执行的OB |
| OB10 ~ OB17 | 2 ~ 9 | 时间中断(日时钟),用于定时执行特定任务 |
| OB20 ~ OB23 | 4 | 延时中断,经过指定延时后执行一次 |
| OB30 ~ OB38 | 8 | 循环中断,按固定时间间隔周期性执行 |
| OB40 ~ OB47 | 16 | 硬件中断,响应上升沿/下降沿或高速计数器事件 |
| OB55 ~ OB56 | 12 | 状态中断,DPV1从站触发(主要用于S7-300/400) |
| OB60 | 25 | 技术功能同步(如S7-1500的运动控制) |
| OB80 ~ OB87 | 26 / 28 | 异步错误中断(如模块故障、时间错误) |
| OB100 ~ OB102 | 27 | 启动组织块(暖启动、热启动、冷启动) |
注:S7-1500系列中,OB80的优先级为28,高于诊断中断OB82(26),而S7-1200中OB82通常为26。
三、 在 TIA Portal 中查看当前优先级
在动手修改之前,查看现有配置是第一步。
- 打开 TIA Portal(博途)软件并加载你的项目。
- 展开项目树中的“PLC_1”设备(或你的CPU名称)。
- 双击 “程序块” 文件夹,查看所有已添加的OB块。
- 选中 你想要检查的OB块(例如
Hardware interrupt[OB40])。 - 查看 下方的“属性” 窗口。如果没有显示,请右键点击该OB块并选择“属性”。
- 点击 左侧属性栏中的“常规” 选项。
- 找到 “类型” 或“中断优先级”一栏,即可看到当前的数值(例如
16)。
四、 修改 OB 优先级的实操步骤
并非所有OB的优先级都可以修改。例如,主循环 OB1 的优先级固定为1,启动OB(如OB100)的优先级也是固定的。通常,用户可以调整的是循环中断(OB30-OB38)和延时中断(OB20-OB23)的优先级。以下以修改 Cyclic Interrupt [OB30] 为例:
- 选中 项目树中的
Cyclic Interrupt[OB30]。 - 按下 快捷键
Alt + Enter打开属性窗口,或双击下方属性区域。 - 导航 至属性列表的“常规” > “循环中断” 部分。
- 找到 “优先级” 输入框。
- 输入 新的优先级数值(例如将其从
8改为12)。- 注意:输入值必须符合CPU的有效范围(通常是2-26或更高,视CPU而定),且不能与其他OB冲突。
- 点击 工具栏上的“编译” 按钮(或按下
Ctrl + B)。 - 检查 编译反馈窗口中的“诊断” 信息。
- 如果显示“0 错误,0 警告”,说明设置成功。
- 如果提示“优先级冲突”,说明该优先级已被占用,返回 步骤5修改为其他数值。
五、 使用指令动态调整中断处理
除了静态设置优先级,在程序逻辑中,还可以通过指令控制中断的挂起与恢复。这在某些关键任务(如高精度定位期间需要暂时屏蔽非关键报警)时非常有用。
在 OB1 或其他高优先级OB中,使用 SCL 或 LAD 语言调用以下指令:
1. 禁用中断
当执行某段绝对不能被打断的代码时使用。
- 拖拽 “DIS_IRT” (Disable Interrupt) 指令到程序段中。
- 填写 参数:
OB_NR: 输入想要屏蔽的OB编号(例如40),或者输入0表示屏蔽所有可屏蔽中断。
- 保存 编译。
// 临时屏蔽硬件中断 OB40
"Disable_Inst"(OB_NR := 40);
// 在此处执行关键代码...
2. 重新启用中断
关键代码执行完毕后,必须恢复中断,否则PLC将无法响应后续事件。
- 拖拽 “EN_IRT” (Enable Interrupt) 指令到后续程序段中。
- 填写 参数:
OB_NR: 输入之前屏蔽的OB编号(例如40),或者输入0表示重新全局启用。
- 连接 指令的ENO端到后续逻辑,确保执行流正确。
// 恢复硬件中断 OB40
"Enable_Inst"(OB_NR := 40);
六、 常见故障排查与建议
在设置优先级时,往往会遇到一些棘手的问题。以下是针对常见现象的解决对策。
1. 循环时间超出监控
如果你将某个低优先级任务的代码量写得非常大,或者高优先级中断发生得过于频繁,会导致主循环 OB1 的执行时间被无限拉长,最终触发“循环时间超出监控”报警(进入STOP模式)。
- 检查 CPU属性中的“循环时间”设置。
- 优化 程序逻辑,将复杂的数学运算或数据处理移至优先级较低的循环中断OB中,或者分时处理。
- 避免 在高优先级OB(如OB40)中编写耗时长的逻辑,高优先级OB应保持“短小精悍”,只做信号捕捉和标志位置位。
2. 优先级冲突
在TIA Portal编译时,如果出现优先级冲突提示,通常是因为两个OB试图使用相同的优先级。
- 双击 报警信息,软件会自动跳转到冲突的OB块。
- 对比 两个OB的功能。
- 如果一个是循环中断,一个是硬件中断,通常建议提高硬件中断的优先级,以保证信号响应。
- 修改 其中一个OB的优先级属性,确保系统中所有运行中的OB优先级数值唯一(OB1除外,某些新版本CPU允许多个OB同优先级排队,但通常不建议)。
3. 延时中断不执行
设置了 OB20 延时中断,但时间到了并未运行。
- 确认 是否在程序中正确调用了
START_IRT指令。仅添加OB20块是不够的,必须由指令触发。 - 检查
START_IRT的SIGN参数是否正确,它用于标识具体的延时事件。 - 查看 诊断缓冲区,是否有“拒绝启动中断”的错误信息。
通过以上步骤,你可以精确控制西门子PLC中各个任务的执行顺序。合理规划优先级,既能保证急停和故障信号的毫秒级响应,又能确保主控逻辑的稳定运行。

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