跳转至子例程 (JSR)、子例程 (SBR) 和返回 (RET)
此信息适用于
CompactLogix
5370、ControlLogix
5570、Compact GuardLogix
5370、GuardLogix
5570、Compact GuardLogix
5380、CompactLogix
5380、ControlLogix
5580、GuardLogix
5580 和 ControlLogix 5590 控制器。JSR 指令可调用其他例程。相应例程完成后,执行过程会返回至 JSR 指令。
SBR 指令接收 JSR 传递的输入参数。
RET 指令将返回参数传回 JSR 并结束子例程的扫描。
可用语言
梯形图



功能块



顺序功能图

结构化文本
JSR(RoutineName,InputCount,InputPar,ReturnPar);
SBR(InputPar);
RET(ReturnPar);
操作数
重要提示:
如果出现以下情况,可能会发生意外操作:
- 输出标签操作数被覆盖。
- 结构操作数的成员被覆盖。
- 除非另外指定,否则结构操作数由多条指令共用。
警告:
对于 SBR 或 RET 指令中的每个参数,请使用与 JSR 指令中对应的参数相同的数据类型(包括数组维数)。使用不同的数据类型可能导致出现意外的结果。
梯形图
JSR 指令
操作数 | 数据类型 CompactLogix 5370、ControlLogix 5570、Compact GuardLogix 5370 和 GuardLogix 5570 控制器 | 数据类型 CompactLogix 5380、ControlLogix 5580、Compact GuardLogix 5380、GuardLogix 5580 和 ControlLogix 5590 控制器 | 格式 | 说明 |
|---|---|---|---|---|
Routine Name | ROUTINE | ROUTINE | 名称 | 要执行的子例程 |
Input Par | BOOL SINT INT DINT REAL structure | BOOL SINT INT DINT LINT USINT UINT UDINT ULINT REAL LREAL structure DT LDT TIME32 TIME LTIME | 立即数 标签 数组标签 | 要从该例程中复制到子例程中的某个标签的数据。
|
Return Par | BOOL SINT INT DINT REAL structure | BOOL SINT INT DINT LINT USINT UINT UDINT ULINT REAL LREAL structure DT LDT TIME32 TIME LTIME | 标签 数组标签 | 该例程中要向其复制子例程的结果的标签。
|
SBR 指令
操作数 | 数据类型 CompactLogix 5370、ControlLogix 5570、Compact GuardLogix 5370 和 GuardLogix 5570 控制器 | 数据类型 CompactLogix 5380、ControlLogix 5580、Compact GuardLogix 5380、GuardLogix 5580 和 ControlLogix 5590 控制器 | 格式 | 说明 |
|---|---|---|---|---|
Input Par | BOOL SINT INT DINT REAL structure | BOOL SINT INT DINT LINT USINT UINT UDINT ULINT REAL LREAL structure DT LDT TIME32 TIME LTIME | 标签 数组标签 |
|
RET 指令
操作数 | 数据类型 CompactLogix 5370、ControlLogix 5570、Compact GuardLogix 5370 和 GuardLogix 5570 控制器 | 数据类型 CompactLogix 5380、ControlLogix 5580、Compact GuardLogix 5380、GuardLogix 5580 和 ControlLogix 5590 控制器 | 格式 | 说明 |
|---|---|---|---|---|
Return Par | BOOL SINT INT DINT REAL structure | BOOL SINT INT DINT LINT USINT UINT UDINT ULINT REAL LREAL structure DT LDT TIME32 TIME LTIME | 立即数标签 数组标签 | 此例程中的数据,要将其复制到 JSR 指令中相应的返回参数(最大值为 40)。 |
影响数学状态标志
否
严重/轻微故障
在以下情况下会发生严重故障: | 故障类型 | 故障代码 |
|---|---|---|
JSR 指令的输入参数比 SBR 指令的输入参数少 | 4 | 31 |
JSR 指令跳转到故障例程 | 4 | 990 或用户提供 |
RET 指令的返回参数比 JSR 指令的返回参数少 | 4 | 31 |
主例程内含有 RET 指令 | 4 | 31 |
操作
重要提示:
任何例程都可能包含一个 JSR 指令,但 JSR 指令不能调用(执行)主例程。

JSR 指令可启动指定例程(称为子例程)的执行:
- 子例程在每次被扫描时执行。
- 子例程执行后,逻辑执行将返回到含有 JSR 指令的例程,并在 JSR 后的指令处继续。
要对指向子例程的跳转进行编程,请遵循以下指导原则。
JSR
- 要将数据复制到子例程中的标签内,请输入输入参数。
- 要将子例程的结果复制到该例程中的标签内,请输入返回参数。
- 必要时最多可输入 40 个输入参数和 40 个返回参数。
SBR
- 如果 JSR 指令具有输入参数,请输入 SBR 指令。
- 将 SBR 指令作为第一条指令放入例程中。
- 对于 JSR 指令中的每个输入参数,输入要向其中复制数据的标签。
RET
- 如果 JSR 指令具有返回参数,请输入 RET 指令。
- 将 RET 指令作为最后一条指令放入例程中。
- 对于 JSR 指令中的每个返回参数,输入要发送到 JSR 指令的返回参数。
- 在梯形图例程中,必要时可放置其他 RET 指令,以便根据不同的输入条件来退出子例程(功能块例程只允许使用一个 RET 指令)。
最多可调用 25 个嵌套子例程,最多可以将 40 个参数传递到一个子例程中,以及最多可从一个子例程返回 40 个参数。

小贴士:
选择
编辑 > 编辑梯形图元素 (Edit > Edit Ladder Element)
菜单,添加和删除变量操作数。对于 JSR 和 SBR 指令,添加输入参数。对于 JSR 和 RET 指令,添加输出参数。对于所有三个指令,删除指令参数。执行
梯形图
条件/状态 | 执行的操作 |
|---|---|
预扫描 | 梯级设置为假。 控制器执行所有子例程。为确保子例程内的所有梯级都经过预扫描,控制器将忽略 RET 指令(即,RET 指令不会使子例程退出)。 不传递输入和返回参数。 如果多次调用同一个子例程,则只对其进行一次预扫描。 |
梯级输入条件对于 JSR 指令为假 | 不适用 |
梯级输入条件为真 | 传递参数并执行子例程。 |
后扫描 | 操作与预扫描相同 |
功能块
条件/状态 | 执行的操作 |
|---|---|
预扫描 | 请参阅“梯形图”表中的“预扫描”行。 |
EnableIn 为假 | 不适用 |
EnableIn 为真 | 传递参数并执行子例程 |
指令首次运行 | 不适用 |
指令首次扫描 | 不适用 |
后扫描 | 请参见“梯形图”表中的“后扫描”行。 |
结构化文本
条件/状态 | 执行的操作 |
|---|---|
预扫描 | 请参阅“梯形图”表中的“预扫描”行。 |
正常执行 | 传递参数并执行子例程。 |
后扫描 | 请参见“梯形图”表中的“后扫描”行。 |
示例
示例 1
梯形图

结构化文本
例程 | 程序 |
|---|---|
主例程 | JSR(routine_1,2,value_1,value_2,float_value_1); |
子例程 | SBR(value_a,value_b); <statements>; RET(float_a); |
示例 2
梯形图
主例程

subroutine_1

示例 3
功能块

提供反馈