S7-1200 OB 组织块的使用
一、OB 组织块
● 什么是组织块?
组织块是操作系统和用户程序之间的接口。OB 用于执行具体的程序:
1、在 CPU 启动时;
2、在一个循环或延时时间到达时;
3、当发生硬件中断时;
4、当发生故障时;
5、组织块根据其优先级执行。
OB 事件
● 组织块 OB 的类型
图1. OB 事件概览
● 通过上图,可以看到 OB 组织块分为三个优先组,高优先组中的组织块可中断低优先组中的组织块;如果同一个优先组中的组织块同时触发将按其优先级由高到低进行排队依次执行;如果同一个优先级的组织块同时触发时,将按块的编号由小到大依次执行。
● CPU 为三个 OB 优先级组中的每一个组都提供了临时(本地)存储器:
1、16 KB 用于启动和程序循环(包括相关的 FB 和 FC)
2、4 KB 用于标准中断事件(包括 FB 和 FC)
3、4 KB 用于错误中断事件(包括 FB 和 FC)
● 嵌套深度:是指可从 OB 调用功能 (FC) 或功能块 (FB) 等程序代码块的深度,如图2所示。
1、从程序循环 OB 或启动 OB 开始调用 FC 和 FB 等程序代码块,嵌套深度为16层;
2、从延时中断、循环中断、硬件中断、时间错误中断或诊断错误中断 OB 开始调用 FC 和 FB 等程序代码块,嵌套深度为4层。
图2 嵌套深度
二、程序循环 OB
● 程序循环 OB 的功能
程序循环 OB 在 CPU 处于 RUN 模式时,周期性地循环执行。可在程序循环 OB 中放置控制程序的指令或调用其它功能块(FC 或 FB)。主程序(Main)为程序循环 OB ,要启动程序执行,项目中至少有一个程序循环 OB 。操作系统每个周期调用该程序循环 OB 一次,从而启动用户程序的执行。
S7-1200 允许使用多个程序循环 OB ,按 OB 的编号顺序执行。OB1 是默认设置,其它程序循环 OB 的编号必须大于或等于123。程序循环 OB 的优先级为1,可被高优先级的组织块中断;程序循环执行一次需要的时间即为程序的循环扫描周期时间。最长循环时间缺省设置为150ms。如果您的程序超过了最长循环时间,操作系统将调用 OB80(时间故障OB );如果 OB80 不存在,则 CPU 停机。
● 操作系统的执行过程,请参见下图1:
1、操作系统启动扫描循环监视时间;
2、操作系统将输出过程映像区的值写到输出模块;
3、操作系统读取输入模块的输入状态,并更新输入过程映像区;
4、操作系统处理用户程序并执行程序中包含的运算;
5、当循环结束时,操作系统执行所有未决的任务,例如加载和删除块,或调用其他循环 OB ;
6、最后,CPU 返回循环起点,并重新启动扫描循环监视时间。
图1. 程序循环图例
● 程序循环 OB 的使用示例:
例如:在循环组织块 OB123 中调用 FC1 。具体实现过程如下:
1、按如下步骤创建循环组织块 OB123 。如图2。
图2. 创建循环组织块
2、通过上述类似方法创建功能 FC1 。如图3。
图3. 创建 FC1
3、在循环组织块 OB123 中调用 FC1 。如图4。
图4. 调用 FC1
三、时间中断 OB10
● 时间中断 OB10 的功能
时间中断OB用于在时间可控的应用中定期运行一部分用户程序,可实现在某个预设时间到达时只运行一次;或者在设定的触发日期到达后,按每分/小时/天/周/月等周期运行。
只有在设置并激活了时间中断,且程序中存在相应组织块的情况下,才能运行时间中断。
● 与时间中断 OB10 相关的指令
指令名称 |
功能说明 |
SET_TINTL(设置时间中断) |
设置日期和时间中断。程序中断 OB 可以设置为执行一次,或者在分配的时间段内多次执行。 |
CAN_TINT(取消时间中断) |
为指定的中断 OB 取消起始日期和时钟中断事件。 |
ACT_TINT(激活时间中断) |
为指定的中断 OB 激活起始日期和时间中断事件。 |
QRY_TINT(查询时间中断状态) |
为指定的中断 OB 查询日期和时间中断状态。 |
以上指令的相关详细信息,请查看链接中S7-1200系统手册,第9.5.3章:时钟中断。
● 时间中断 OB 的设置和激活方法
1、方法1、通过组态设置激活时间中断,如图1。
图1、通过组态设置激活时间中断
2、方法2、通过调用SET_TINTL设置时间中断,调用ACT_TINT激活时间中断,如图2、3。
图2、设置时间中断
图3、激活时间中断
● 时钟中断 OB 的使用示例:
例如:从设定时间开始每分钟执行时钟中断 OB10 ,每次进入时钟中断将MD200加1。具体实现过程如下:
1、按如下步骤创建延时中断 OB10 。如图4。
图4. 创建时间中断 OB10
2、OB10 中编程,当触发时间中断时执行 MD200 加1。如图5。
图5. OB10中编程
3、OB1 中编程,设置时间中断、激活时间中断、取消时间中断、查询时间中断。如图6。
图6. OB1中编程
常见问题:
使用时间中断组织块需要注意什么?
1、每次 CPU 启动之后,必须重新激活先前设置的时间中断;
2、当参数 PERIOD 重复周期设置为每月,则必须将SDT参数的起始日期设置为 1 号到 28 号中的一天;
3、如果组态时间中断时设置相应 OB 只执行一次,则启动时间一定不能为过去的时间(与 CPU的实时时钟相关);
4、如果组态时间中断时设置周期性执行相应 OB,但启动时间已过,则将在下次的这个时间执行该时间中断;
5、调用 ACT_TINT 激活的时间中断不会在激活结束前执行。
四、延时中断 OB
● 延时中断 OB 的功能
延时中断 OB 在经过一段指定的时间延时后,才执行相应的 OB 中的程序。
S7-1200 最多支持 4 个延时中断 OB ,通过调用“SRT_DINT”指令启动延时中断 OB 。在使用“SRT_DINT”指令编程时,需要提供 OB 号、延时时间,当到达设定的延时时间,操作系统将启动相应的延时中断 OB ;尚未启动的延时中断 OB 也可以通过“CAN_DINT”指令取消执行,同时还可以使用“QRY_DINT”指令查询延时中断的状态。延时中断 OB 的编号必须为20~23,或大于、等于123。
● 与延时中断 OB 相关的指令功能
指令名称 |
功能说明 |
SRT_DINT |
当指令的使能输入 EN 上生成下降沿时,开始延时时间,超出参数 DTIME 中指定的延时时间之后,执行相应的延时中断 OB 。 |
CAN_DINT |
使用该指令取消已启动的延时中断(由 OB_NR 参数指定的 OB 编号)。 |
QRY_DINT |
使用该指令查询延时中断的状态。 |
以上指令的相关详细信息,请查看下面链接中S7-1200系统手册,第9.5.4章:延时中断。
● 延时中断 OB 的执行过程,请参见下图1:
1、调用“SRT_DINT”指令启动延时中断;
2、当到达设定的延时时间,操作系统将启动相应的延时中断 OB ;
3、图例中,延时中断 OB20 中断程序循环 OB1 优先执行;
4、当启动延时中断后,在延时时间到达之前,调用“CAN_DINT”指令可取消已启动的延时中断。
图1. 延时中断 OB 执行图例
● 延时中断 OB 的使用示例:
例如:当 I0.0 由1变0时,延时5s后启动延时中断 OB20 ,并将输出 Q0.0 置位。具体实现过程如下:
1、按如下步骤创建延时中断 OB20 。如图2。
图2. 创建延时中断 OB20
2、打开 OB20 ,在 OB20 中编程,当延时中断执行时,置位 Q0.0 。如图3。
图3. OB20 中编程
3、在 OB1 中编程调用'SRT_DINT'指令启动延时中断;调用'CAN_DINT'指令取消延时中断;调用'QRY_DINT'指令查询中断状态。在'指令->扩展指令->中断->延时中断'中可以找相关指令,如下图4。
图4. 调用延时中断指令
OB1 中的编程见图5:
图5. OB1 中的编程
“SRT_DINT”指令参数说明:
EN |
:=%I0.0 |
//当 EN 端出现下降沿时,延时计时开始 |
OB_NR |
:=20 |
//延时时间后要执行的 OB 的编号 |
DTIME |
:=T#5S |
//延时时间(1 至 60000 ms) |
SIGN |
:=W#16#0001 |
//注:调用时必须为此参数赋值。但是,该值没有任何意义 |
RET_VAL |
:=%MW0 |
//状态返回值(详细信息请查看在线帮助) |
“CAN_DINT”指令参数说明:
EN |
:=%I0.1 |
//当 EN 端出现上升沿时,取消延时中断 |
OB_NR |
:=20 |
//需要取消的 OB 的编号 |
RET_VAL |
:=%MW2 |
//状态返回值(详细信息请查看在线帮助) |
“QRY_DINT”指令参数说明:
OB_NR |
:=20 |
//需要查询状态的 OB 编号 |
RET_VAL |
:=%MW4 |
//状态返回值(详细信息请查看S7-1200系统手册的指令参数帮助) |
STATUS |
:=%MW6 |
//延时中断的状态(详细信息请查看在线帮助) |
4、测试结果:当 I0.0 由1变0时,延时5s后延时中断执行,可看到 CPU 的输出 Q0.0 指示灯亮;当 I0.0 由1变0时,在延时的5s到达之前,如果 I0.1 由0变1则取消延时中断,OB20 将不会执行。
常见问题
使用延时中断需要注意什么?
1、延时中断 + 循环中断数量 <= 4;
2、延时时间1~60000ms,设置错误的时间,状态返回值 RET_VAL 将报错16#8091;
3、延时中断必须通过“SRT_DINT”指令设置参数,使能输入 EN 下降沿开始计时;
4、使用“CAN_DINT”指令取消已启动的延时中断;
5、启动延时中断的间隔时间必须大于延时时间与延时中断执行时间之和;否则会导致时间错误。
五、循环中断 OB
● 循环中断 OB 的功能
循环中断 OB 在经过一段固定的时间间隔后执行相应的中断 OB 中的程序。
S7-1200 最多支持 4 个循环中断 OB ,在创建循环中断 OB 时设定固定的间隔扫描时间。在 CPU 运行期间,可以使用“SET_CINT”指令重新设置循环中断的间隔扫描时间、相移时间;同时还可以使用“QRY_CINT”指令查询循环中断的状态。循环中断 OB 的编号必须为30~38,或大于、等于123。
● 与循环中断 OB 相关的指令功能
指令名称 |
功能说明 |
SET_CINT |
设置指定的中断 OB 的间隔扫描时间、相移时间,以开始新的循环中断程序扫描过程。 |
QRY_CINT |
使用该指令查询循环中断的状态。 |
以上指令的相关详细信息,请查看链接中S7-1200系统手册,第9.5.2章:循环中断。
● 循环中断 OB 的执行过程,请参见下图1:
1、PLC 启动后开始计时;
2、当到达固定的时间间隔后,操作系统将启动相应的循环中断 OB ;
3、图例中,到达固定的时间间隔后,循环中断 OB30 中断程序循环 OB1 优先执行。
循环中断的执行过程请参考下图:
图1. 循环中断 OB 执行图例
● 循环中断 OB 的使用示例:
例如:运用循环中断,使 Q0.0 500ms输出为1,500ms输出为0,即实现周期为1s的方波输出。具体实现过程如下:
1、按如下步骤创建循环中断 OB30 。如图2。
图2. 创建循环中断 OB30
2、OB30 中编程如下图,当循环中断执行时,Q0.0 以方波形式输出。如图3。
图3. OB30 中编程
3、在 OB1 中编程调用“SET_CINT”指令,可以重新设置循环中断时间,例如:CYCLE=1s(即周期为2s);调用“QRY_CINT”指令可以查询中断状态。在“指令->扩展指令->中断->循环中断”中可以找相关指令。如下图4。
图4. 调用循环中断指令
OB1 中的编程见图5:
图5. OB1 中的编程
“SET_CINT”指令参数说明:
EN |
:=%M100.0 |
//当 EN 端出现上升沿时,设置新参数 |
OB_NR |
:=30 |
//需要设置的 OB 的编号 |
CYCLE |
:=1000000 |
//时间间隔(微秒) |
PHASE |
:=0 |
//相移时间(微秒) |
RET_VAL |
:=%MW0 |
//状态返回值(详细信息请查看在线帮助) |
“QRY_CINT”指令参数说明:
OB_NR |
:=30 |
//需要查询的 OB 的编号 |
RET_VAL |
:=%MW2 |
//状态返回值(详细信息请查看在线帮助) |
CYCLE |
:=%MD4 |
//查询结果:时间间隔(微秒) |
PHASE |
:=%MD8 |
//查询结果:相移时间(微秒) |
STATUS |
:=%MW12 |
//循环中断的状态(详细信息请查看在线帮助) |
4、测试结果:程序下载后,可看到 CPU 的输出 Q0.0 指示灯0.5s亮,0.5s灭交替切换;当 M100.0 由0变1时,通过“SET_CINT”将循环间隔时间设置为1s,这时,可看到 CPU 的输出 Q0.0 指示灯1s亮,1s灭交替切换。
● 相移时间(Phase shift)功能
当使用多个时间间隔相同的循环中断事件时,设置相移时间可使时间间隔相同的循环中断事彼此错开一定的相移时间执行。请通过如下两幅图例理解相移时间的概念。
下图中,没有设置相移时间,以相同的时间间隔调用两个 OB ,则低优先级的 OB 块将不能以固定间隔时间 t 执行;何时执行受高优先级的 OB 执行时间影响,请看图6。
图6. 没有相移的循环 OB 调用
下图中,低优先级的 OB 块可以以固定间隔时间 t 执行;相移时间应大于较高优先级 OB 块的执行时间,请看图7。
图7. 有相移的循环 OB 调用
小结:如果以相同的时间间隔调用优先级较高和优先级较低的循环中断 OB ,则只有在优先级较高的 OB 完成处理后才会执行优先级较低的 OB 。低优先级 OB 的执行起始时间会根据优先级较高的 OB 的处理时间而延迟,如果希望以固定的时间间隔来执行优先级较低的 OB ,则优先级较低的 OB 需要设置相移时间,且相移时间应大于优先级较高的 OB 的执行时间。
六、如何设置相移时间?
请看下图的设置步骤。(请注意,如果程序中调用“SET_CINT”指令设置相移时间,则以程序中设定的时间为准)
图8. 相移的设置步骤
常见问题:
使用循环中断需要注意什么?
1、循环中断 + 延时中断数量 <= 4;
2、循环间隔时间1~60000ms,通过指令“SET_CINT”设置错误的时间将报错16#8091;
3、CPU 运行期间,可通过“SET_CINT”指令设置循环中断间隔时间、 相移时间;
4、如果“SET_CINT”指令的使能端 EN 为脉冲信号触发;则 CPU 的操作模式从 STOP 切换到 RUN 时执行一次,包括启动模式处于 RUN 模式时上电和执行 STOP 到 RUN 命令切换,循环中断间隔时间将复位为 OB 块属性中设置的数值;
5、如果循环中断执行时间大于间隔时间,将会导致时间错误。
七、硬件中断 OB
● 硬件中断 OB 的功能
硬件中断 OB 在发生相关硬件事件时执行,可以快速的响应并执行硬件中断 OB 中的程序(例如立即停止某些关键设备)。
硬件中断事件包括内置数字输入端的上升沿和下降沿事件以及 HSC(高速计数器)事件。当发生硬件中断事件,硬件中断 OB 将中断正常的循环程序而优先执行。S7-1200可以在硬件配置的属性中预先定义硬件中断事件,一个硬件中断事件只允许对应一个硬件中断 OB ,而一个硬件中断 OB 可以分配给多个硬件中断事件。在 CPU 运行期间,可使用“ATTACH”附加指令和“DETACH”分离指令对中断事件重新分配。硬件中断 OB 的编号必须为40~47,或大于、等于123。
● 与硬件中断 OB 相关的指令功能
指令名称 |
功能说明 |
ATTACH |
将硬件中断事件和硬件中断 OB 进行关联。 |
DETACH |
将硬件中断事件和硬件中断 OB 进行分离。 |
以上指令的相关详细信息,请查看链接中S7-1200系统手册,第9.5.1章:附加/分离OB和中断事件。
● 硬件中断 OB 的使用示例:
例如:当硬件输入 I0.0 上升沿时,触发硬件中断 OB40(执行累加程序),当硬件输入 I0.1 上升沿时,触发硬件中断 OB41(执行递减程序),硬件中断事件和硬件中断 OB 关系如图1。
图1. 硬件中断关系
1、按如下步骤创建硬件中断 OB40 ,同样的方法创建 OB41 。如图2。
图2. 创建硬件中断 OB40
2、OB40 中编程如下图,当硬件输入 I0.0 上升沿时,触发硬件中断执行 MW200 加1。如图3。
图3. OB 40 中编程
3、OB41 中编程如下图,当硬件输入 I0.1 上升沿时,触发硬件中断执行 MW200 减1。如图4。
图4. OB41 中编程
4、在 CPU 属性窗口中关联硬件中断事件,如下图所示,分别将 I0.0 和 OB40 关联,I0.1 和 OB41 关联。如图5、6。
图5. I0.0 和 OB40 关联
图6. I0.1 和 OB41 关联
5、测试结果:程序下载后,在监控表中查看 MW200 的数据。
① 当 I0.0 接通,触发中断 OB40 ,MW200 的数值累加1。结果如图7。
图7. I0.0 硬件中断结果
② 当 I0.1 接通,触发中断 OB41 ,MW200 的数值递减1。结果如图8。
图8. I0.1 硬件中断结果
6、如果需要在 CPU 运行期间对中断事件重新分配,可通过“ATTACH”附加指令实现,OB1 中编程步骤如下图。如图9。
图9. “ATTACH”指令
① 如果“ATTACH”附加指令的引脚“ADD”为 FALSE,EVENT 中的事件将替换 OB40 中的原有事件。即硬件中断事件 I0.1“上升沿1”事件将替换原来 OB40 中关联的 I0.0“上升沿0”事件,见下图10:
图10. 硬件中断关系
② 如果“ATTACH”附加指令的引脚“ADD”为 TRUE,EVENT 中的事件将添加至 OB40 ,OB40 在 I0.0“上升沿0”和 I0.1“上升沿1”事件触发时均会执行,见下图11:
图11. 硬件中断关系
“ATTACH”指令参数说明:
EN |
:=%M100.0 |
//当 EN 端出现上升沿时,使能该指令 |
OB_NR |
:=40 |
//需要关联的 OB 的编号 |
EVENT |
:=“上升沿1” |
//需要关联的硬件中断事件名称 |
ADD |
:=FALSE |
//ADD=FALSE(默认值):该事件将取代先前为此 OB 分配的所有事件。ADD=TRUE:该事件将添加到此 OB 中。 |
RET_VAL |
:=%MW0 |
//状态返回值(详细信息请查看在线帮助) |
7、如果需要在 CPU 运行期间对中断事件进行分离,可通过“DETACH”指令实现,OB 1 中编程如图12。
图12. “DETACH”指令
当 M100.2 置1使能指令 DETACH 后,硬件中断事件和硬件中断 OB 关系如下图。如图13。
图13. 硬件中断关系
“DETACH”指令参数说明:
EN |
:=%M100.2 |
//当 EN 端出现上升沿时,使能该指令 |
OB_NR |
:=40 |
//需要分离的 OB 的编号 |
EVENT |
:=“上升沿0” |
//需要分离的硬件中断事件名称 |
RET_VAL |
:=%MW2 |
//状态返回值(详细信息请查看在线帮助) |
常见问题:
使用硬件中断需要注意什么?
1、一个硬件中断事件只能分配给一个硬件中断 OB ,而一个硬件中断 OB 可以分配给多个硬件中断事件;
2、用户程序中最多可使用50个互相独立的硬件中断 OB ;数字量输入和高速计数器均可触发硬件中断;
3、中断 OB 和中断事件在硬件组态中定义;在 CPU 运行时可通过“ATTACH”和“DETACH”指令进行中断事件重新分配;
4、如果“ATTACH”指令的使能端 EN 为脉冲信号触发,在使用“ATTACH”指令进行中断事件重新分配后;若 CPU 的操作模式从 STOP 切换到 RUN 时执行一次,包括启动模式处于 RUN 模式时上电和执行 STOP 到 RUN 命令切换,则硬件中断 OB 和硬件中断事件将恢复为在硬件组态中定义的分配关系;
5、如果一个中断事件发生,在该中断 OB 执行期间,同一个中断事件再次发生,则新发生的中断事件丢失;
6、如果一个中断事件发生,在该中断 OB 执行期间,又发生多个不同的中断事件中,则新发生的中断事件进入排队,等待第一个中断 OB 执行完毕后依次执行。
八、时间错误 OB80
● 时间错误 OB80 的功能
当 CPU 中的程序执行时间超过最大循环时间或者发生时间错误事件(例如,循环中断 OB 仍在执行前一次调用时,该循环中断 OB 的启动事件再次发生)时,将触发时间错误中断优先执行 OB80 。由于 OB80 的优先级最高,它将中断所有正常循环程序或其它所有 OB 事件的执行而优先执行。
● 与时间错误 OB80 相关的信息
当触发时间错误中断时,通过 OB80 的接口变量读取相应的启动信息。OB80 的接口变量及启动信息参考下图1、2。
图1. OB80 接口变量
图2. OB80 启动信息
● 时间错误 OB 的使用示例:
例如:在 OB1 中做一个循环跳转程序,可通过设置时间控制该部分程序的循环时间,当该部分程序的执行时间大于CPU 设定的最大循环时间时,触发时间错误事件。
1、按如下步骤创建时间错误 OB80 。如图3。
图3. 创建时间错误 OB80
2、OB80 中编程如下图,创建地址为 MB100、MW102、MW104 的变量用于存储出现时间错误时读取到的启动信息。如图4。
图4. OB80 中编程
3、在 OB1 中编写一个循环跳转程序,其循环执行时间可通过变量“set_time”设定。如图5。
图5. OB1 中编程
4、程序下载,测试:
① 如果在监控表中将变量“set_time”设置为160ms,则 CPU 报故障且没有停机,可从监控表中读取到 OB80 的启动信息,同时查看故障缓冲区。如图6。
图6. 测试结果1
② 如果在监控表中将变量“set_time”设置为310ms,则 CPU 立即停机,可从监控表中读取到 OB80 的启动信息,同时查看故障缓冲区。如图7。
图7. 测试结果2
注:S7-1200 CPU 默认最大循环时间为150ms。
● 重新触发扫描循环看门狗指令“RE_TRIGR”
“RE_TRIGR”指令用于在单个扫描循环期间重新启动扫描循环监视定时器。其功能是执行一次“RE_TRIGR”指令,使允许的最大扫描周期延长一个最大循环时间段。
使用示例:在上个示例中的时间错误 OB80 块中调用指令“RE_TRIGR”,当 OB1 中的循环跳转程序执行时间大于 CPU 设定的最大循环时间时,触发时间错误 OB80 并执行指令“RE_TRIGR”重新触发扫描循环看门狗。
1、在 OB80 中编程调用“RE_TRIGR”指令。在“指令->基本指令->程序控制操作->运行时控制”中可以找相关指令。如下图8。
图8. 调用重新触发扫描循环看门狗指令
2、OB80 中编程如下图,在程序段2中增加重新触发扫描循环看门狗指令“RE_TRIGR”。如图9。
图9. OB80 中编程
3、程序下载,测试:
如果在监控表中将变量“set_time”设置为400ms(大于两倍最大循环时间300ms),由于“RE_TRIGR”指令的作用 CPU 报故障但没有停机,可从监控表中读取到 OB80 的启动信息,同时查看故障缓冲区。如图10。
图10. 测试结果3
关于指令“RE_TRIGR”的相关详细信息,请查看下面链接中S7-1200系统手册,第8.8.6章:重置周期监视时间。
按住 Shift 键时用鼠标点击下列链接,打开新浏览器窗口。
https://support.industry.siemens.com/cs/cn/zh/view/109764129
哪些情况会触发时间错误中断,以及 CPU 在这些情况下如何响应?
1.超出最大循环时间
在 CPU 属性中组态最大循环时间(默认150ms),当 CPU 中的程序执行时间超过最大循环时间时,如果 OB80 不存在,CPU 将切换到 STOP 模式(例外情况:V1 版 CPU 仍然处于 RUN 模式);如果 OB80 存在,则 CPU 执行 OB80 且不停机;如果同一程序循环中出现两次“超过最大程序循环时间”且没有通过指令“RE_TRIGR”复位循环定时器,则无论 OB80 是否存在,CPU 都将切换到 STOP 模式。
2.请求的 OB 无法启动
如果循环中断、延时中断请求 OB ,但请求的 OB 已经在执行,就会出现请求的 OB 无法启动这种情况。
3.发生队列溢出
如果中断的出现频率超过其处理频率,就会出现发生队列溢出这种情况。如果 OB80 不存在,则 CPU 将切换到 STOP 模式;如果 OB80 存在,则执行 OB80 ,CPU 将保持为 RUN 模式。
4.总结:发生任何上述事件都将在诊断缓冲区生成一个描述相应事件的条目。无论是否存在 OB80 ,都将生成诊断缓冲区条目。
诊断错误 OB82
● 诊断错误 OB82 的功能
S7-1200支持诊断错误中断,可以为具有诊断功能的模块启用诊断错误中断功能来检测模块状态。
出现故障(进入事件),故障解除(离开事件)均会触发诊断中断 OB82 。当模块检测到故障并且在软件中使能了诊断错误中断时,操作系统将启动诊断错误中断,诊断错误中断 OB82 将中断正常的循环程序优先执行。此时无论程序中有没有诊断中断 OB82,CPU 都会保持 RUN 模式,同时 CPU 的 ERROR 指示灯闪烁。如果希望 CPU 在接收到该类型的错误时进入 STOP 模式,可以在 OB82 中加入 STP 指令使 CPU 进入 STOP 模式。
● 与诊断错误 OB82 相关的信息
当触发诊断错误中断时,通过 OB82 的接口变量可以读取相应的启动信息,可以帮助确定事件发生的设备、通道和错误原因。OB82 的接口变量及启动信息参考下图1、2。
图1. OB82 接口变量
图2. OB82 启动信息
● 诊断错误 OB 的使用示例:
例如:模拟量输出模块 SM1232 的电压输出通道,对于通道1使能短路诊断,当通道1出现短路错误时,随即触发诊断错误 OB82 ,此时可从 OB82 的启动参数中读取诊断信息。
1、按如下步骤创建诊断错误 OB82 。如图3。
图3. 创建诊断错误 OB82
2、OB82 中编程如下图,创建地址为 MW100、MW102、MW104 的变量用于存储出现诊断错误时读取到的启动信息。如图4。
图4. OB82 中编程
3、在硬件组态窗口中,选中模拟量输出模块,选择模拟量输出通道1的“启用短路诊断”功能。如图5。
图5. 设置诊断功能
4、测试结果:程序下载后,在监控表中给“channel1”设置输出值5000,如果此时出现了短路故障,则将立即触发诊断错误功能。如图6。
图6. 测试结果
常见问题:
触发诊断错误中断时,CPU 如何响应?
1、启用诊断错误中断且 CPU 中创建了 OB82 ;
2、OB82 是唯一支持诊断错误事件的 OB ;一次只能报告一个通道的诊断错误;
3、如果多通道设备的两个通道出现错误,则第二个错误只会在以下情况触发 OB82 :第一个通道错误已清除,由第一个错误触发的 OB82 已执行完毕,并且第二个错误仍然存在;
4、事件的进入或离开都会触发一次 OB82 ;
5、触发 OB82 ,CPU 不会进入 STOP 模式。
哪些情况会触发诊断错误中断?
如下错误将触发诊断错误中断 OB82 :
① 无用户电源
② 超出上限
③ 超出下限
④ 断路(电流输出、电流4~20mA输入、RTD、TC)
⑤ 短路(电压输出)
插拔中断 OB83
● 插拔中断 OB83 的功能
如果移除或插入了已组态且未禁用的分布式 I/O 模块或子模块(PROFIBUS、PROFINET 和 AS-i),编程访问 OB83 的启动信息可以判断触发 OB83 的模块并作出响应。
● 与插拔中断 OB83 相关的信息
当触发插拔中断时,通过 OB83 的接口变量可以读取相应的启动信息,可以帮助确定事件发生的设备、发生的事件类别。OB83 的接口变量及启动信息以及导致 OB83 的启动事件参考下图1、2、3。
图1. OB83 接口变量
图2. OB83 的启动信息
图3. 导致OB83 的启动事件
● 插拔中断 OB83 的使用示例
1、按以下步骤创建插拔中断 OB83 。如图4。
图4.创建插拔中断 OB83
2、在 OB83 中编程,创建地址为MW100、MB102、MB103 的变量用于存储出现模块插拔时读取到的启动信息。如图5。
图5. OB83 中编程
3、测试结果:程序下载后,在监控表中查看 MW100、MB102 、MB103的数据。
① 当有模块拔出时,触发插拔中断 OB83 ,结果如图6。
图6. 测试结果1
② 当有模块插入时,触发插拔中断 OB83 ,结果如图7。
图7. 测试结果2
4、通过 OB83 启动信息中 LADDR 判断触发 OB83 的模块
LADDR是受影响模块或子模块的硬件标识符,通过 OB83 中LADDR的值就可以判断受影响的硬件,LADDR的查看方式如下,可以在PLC变量的系统常量中查看PLC项目中全部系统常量,也可以在网络视图中选择具体的站或者系统查看系统常数,如图8、9。
图8、全部系统常量查看方法
图9、具体站或系统的系统常数查看方法
常见问题:
使用插拔组织块需要注意什么?
1、插拔组织块OB数量<=1 ;
2、无论是否编程 OB83,移除或插入了已组态且未禁用的分布式 I/O 模块或子模块不会导致 CPU 进入 STOP 模式;
3、无论是否编程 OB83,移除或插入中央模块将导致 CPU 进入 STOP 模式;
4、如果希望CPU在接收到触发 OB83 的某种启动事件时进入STOP模式,可以在 OB83 中加入STP指令,使CPU进入STOP模式。
机架或站故障 OB86
● 机架或站故障 OB86 的功能
当CPU 检测到分布式机架或站出现故障或发生通信丢失时,可以编程访问机架或站故障 OB86 的启动信息判断触发中断的站并作出响应。
● 与机架或站故障 OB86 相关的信息
当触发 OB86 时,通过 OB86 的接口变量可以读取相应的启动信息,可以帮助确定事件发生的站、发生的事件类别。OB86 的接口变量、启动信息及导致 OB86 的启动事件参考下图1、2、3。
图1. OB86 接口变量
图2. OB86 的启动信息
图3. 导致 OB86 的启动事件
● 机架或站故障 OB86 的使用示例
1、按以下步骤创建插拔中断 OB86 。如图4。
图4. 创建机架或站故障 OB86
2、在 OB86 中编程,创建地址为MW100、MB102、MB103 的变量用于存储出现模块插拔时读取到的启动信息。如图5。
图5. OB86中编程
3、测试结果:程序下载后,在监控表中查看 MW100、MB102 、MB103的数据。当出现PROFINET IO 系统故障时,如图6。
图6. 测试结果
4、通过 OB86 启动信息中的 LADDR 判断触发 OB86 的故障硬件
LADDR是故障硬件的硬件标识符,通过 OB86 中LADDR的值就可以判断发生故障的硬件,LADDR的查看方式如下,可以在PLC变量的系统常量中查看PLC项目中全部系统常量,也可以在网络视图中选择具体的站或者系统查看系统常数,如图7、8。
图7、全部系统常量查看方法
图8、具体站或系统的系统常数查看方法
常见问题:
哪些情况会触发机架或站故障 OB86?
1、检测到 DP 主站系统或 PROFINET IO 系统发生故障(对于到达或离去事件);
2、检测到 DP 从站或 IO 设备发生故障(对于到达或离去事件);
3、 检测到 PROFINET 智能设备的部分子模块发生故障。
使用机架或站故障 OB86 需要注意什么?
1、机架或站故障OB数量<=1;
2、无论是否编程 OB86,当出现机架或站故障时不会导致 CPU 进入 STOP 模式;
3、如果希望CPU在接收到机架或站故障中的某种错误时进入STOP模式,可以在 OB86 中加入STP指令,使CPU进入STOP模式。
启动 OB
● 启动 OB 的功能
如果 CPU 的操作模式从 STOP 切换到 RUN 时,包括启动模式处于 RUN 模式时 CPU 断电再上电和执行 STOP 到 RUN 命令切换时,启动组织块 OB 将被执行一次。启动组织块执行完毕后才开始执行主“程序循环”OB 。S7-1200 CPU 中支持多个启动 OB ,按照编号顺序(由小到大)依次执行,OB100 是默认设置。其它启动 OB 的编号必须大于、等于123。
● 启动 OB 的执行过程,请参见下图1:
图1. 启动过程和运行过程图例
● 与启动 OB 相关的信息
启动 OB 中包含启动信息,可以用于判断保持性数据和实时时钟是否丢失,可以在启动 OB 中编写指令。启动 OB 的接口变量及启动信息参考下图2、3。
图2. 启动 OB 的接口变量
图3. 启动 OB 的启动信息
读取启动 OB 的启动信息的使用示例:当发生保持性数据丢失,输出 Q0.0 为1,当发生实时时钟丢失,输出 Q0.1 为1。
在启动 OB 中编程如图4:
图4. 检测保持性数据或时钟丢失例程
● 启动 OB 的使用示例:
例如:在启动 OB100 中无条件为地址为 MW100 赋初值100;有条件(当 I0.0 = true 时)为 MW102 赋初值200。具体实现过程如下:
1、按如下步骤创建启动组织块 OB100 。如图5。
图5. 创建启动组织块 OB100
2、OB100 中编程如下图。如图6。
图6. OB100 中编程
注意:由于启动 OB 在执行过程中不更新过程映像区,所以读到的过程映像数值均为0。因此,要在启动模式下读取物理输入的当前状态,必须对输入执行立即读取操作,例如 I0.0:P。
如果程序段2中使用的是 I0.0 ,则程序段2中的指令将不会被执行。
3、测试结果:程序下载后,在监控表中查看 MW100、MW102 的数据。
① 当硬件输入 I0.0 为0时,CPU 上电启动或 STOP--->RUN 操作时首先执行 OB100 ,即 MW100 被赋值100,MW102 未被赋值200。如图7。
图7. 测试结果1
② 当硬件输入 I0.0 为1时,CPU 上电启动或 STOP--->RUN 操作时首先执行 OB100 ,即 MW100 被赋值100,MW102 被赋值200。如图8。
图8. 测试结果2
常见问题:
使用启动组织块需要注意什么?
1、只要工作模式从 STOP 切换到 RUN ,CPU 就会清除过程映像输入、初始化过程映像输出并处理启动 OB ;
2、要在启动模式下读取物理输入的当前状态,必须执行立即读取操作;
3、在启动阶段,对中断事件进行排队但不进行处理,需要等到启动事件完成后才进行处理;
4、启动 OB 的执行过程没有时间限制,不会激活程序最大循环监视时间;
5、在启动模式下,可以更改 HSC(高速计数器)、PWM(脉冲宽度调制)以及 PtP(点对点通信)模块的组态。