首页 理论教育 子程序调用与返回指令详解

子程序调用与返回指令详解

时间:2023-06-27 理论教育 版权反馈
【摘要】:主程序中用指令决定具体子程序的执行状况,当主程序调用子程序并执行时,子程序执行全部指令直至结束,然后系统将返回至调用子程序的主程序。如果在使用子程序调用指令后,然后修改该子程序的局部变量表,调用指令则无效。

子程序调用与返回指令详解

在程序设计中,通常将具有特定功能,并且多次使用的程序段作为子程序。主程序中用指令决定具体子程序的执行状况,当主程序调用子程序并执行时,子程序执行全部指令直至结束,然后系统将返回至调用子程序的主程序。

子程序用于为程序分段和分块,使其成为较小的、更易于管理的块。在程序中调试和维护时,通过使用较小的程序块,对这些区域和整个程序简单地进行调试和排除故障。只在需要时才调用程序块,可以更有效地使用PLC,因为所有的程序块可能无须执行每次扫描。

在程序中使用子程序,必须执行下列三项任务:建立子程序;在子程序局部变量表中定义参数(如果有);从适当的POU(从主程序或另一个子程序)调用子程序。

1.建立子程序

可采用下列一种方法建立子程序:

①从“编辑”菜单,选择“插入”→“子程序”命令。

②从“指令树”,用鼠标右键单击“程序块”图标,并从弹出菜单选择“插入”→“子程序”。

③从“程序编辑器”窗口,用鼠标右键单击,并从弹出菜单选择“插入”→“子程序”。

程序编辑器从先前的POU显示更改为新的子程序。程序编辑器底部会出现一个新标签,代表新的子程序。此时,可以对新的子程序编程。

用右键双击指令树中的子程序图标,在弹出的菜单中选择/重新命名,可修改子程序的名称。如果为子程序指定一个符号名,例如USR_NAME,该符号名会出现在指令树的“子例行程序”文件夹中。

2.调用子程序

子程序有子程序调用和子程序返回两大类指令,子程序返回又分为条件返回和无条件返回。指令格式如图3-43所示。

978-7-111-49003-6-Chapter03-61.jpg

图3-43 子程序调用及子程序返回指令格式

CALL SBRn:子程序调用指令。在梯形图中为指令盒的形式。子程序的编号n从0开始,随着子程序个数的增加自动生成。操作数n:0~63。

CRET:子程序条件返回指令,条件成立时结束该子程序,返回原调用处的指令CALL的下一条指令。

RET:子程序无条件返回指令,子程序必须以本指令作结束。由编程软件自动生成。

子程序可以多次被调用,也可以嵌套(最多8层),还可以自己调用自己。子程序调用指令用在主程序和其他调用子程序的程序中,子程序的无条件返指令在子程序的最后网络段,梯形图指令系统能够自动生成子程序的无条件返回指令,用户无须输入。

3.带参数的子程序调用指令

(1)子程序的参数

子程序可能有要传递的参数(变量和数据),这时可以在子程序调用指令中包含相应参数,它可以在子程序与调用程序之间传送。如果子程序仅用要传递的参数和局部变量,则为带参数的子程序(可移动子程序)。为了移动子程序,应避免使用任何全局变量/符号(I、Q、M、SM、AI、AQ、V、T、C、S、AC内存中的绝对地址),这样可以导出子程序并将其导入另一个项目。子程序中的参数必须有一个符号名(最多为23个字符)、一个变量类型和一个数据类型。子程序最多可传递16个参数。传递的参数在子程序局部变量表中定义,如图3-44所示。

978-7-111-49003-6-Chapter03-62.jpg

图3-44 局部变量表

(2)变量的类型

局部变量表中的变量有IN、OUT、IN/OUT和TEMP4种类型。

IN(输入)型:将指定位置的参数传入子程序。如果参数是直接寻址(例如VB10),在指定位置的数值被传入子程序;如果参数是间接寻址,(例如*AC1),地址指针指定地址的数值被传入子程序;如果参数是数据常量(16#1234)或地址(&VB100),常量或地址数值被传入子程序。

IN_OUT(输入-输出)型:将指定参数位置的数值被传入子程序,并将子程序的执行结果的数值返回至相同的位置。输入/输出型的参数不允许使用常量(例如16#1234)和地址(例如&VB100)。(www.xing528.com)

OUT(输出)型:将子程序的结果数值返回至指定的参数位置。常量(例如16#1234)和地址(例如&VB100)不允许用作输出参数。

在子程序中可以使用IN、IN/OUT以及OUT类型的变量和调用子程序POU之间传递参数。

TEMP型:是局部存储变量,只能用于子程序内部暂时存储中间运算结果,不能用来传递参数。

(3)数据类型

局部变量表中的数据类型包括:能流、布尔(位)、字节、字、双字、整数、双整数和实数型。

能流:能流仅用于位(布尔)输入。能流输入必须用在局部变量表中其他类型的输入之前。只有输入参数允许使用。在梯形图中表达形式为用触点(位输入)将左侧母线和子程序的指令盒连接起来。图3-45中的使能输入(EN)和IN1输入使用布尔逻辑。

布尔:该数据类型用于位输入和输出。图3-45中的IN3是布尔输入。

字节、字、双字:这些数据类型分别用于1、2或4个字节不带符号的输入或输出参数。

整数、双整数:这些数据类型分别用于2或4个字节带符号的输入或输出参数。

实数:该数据类型用于单精度(4个字节)IEEE浮点数值。

(4)建立带参数子程序的局部变量表

局部变量表隐藏在程序显示区,将梯形图显示区向下拖动,可以露出局部变量表,在局部变量表输入变量名称、变量类型和数据类型等参数以后,双击指令树中子程序(或选择单击快捷键<F9>,在弹出的菜单中选择子程序项),在梯形图显示区显示出带参数的子程序调用指令盒。

局部变量表变量类型的修改方法:用光标选中变量类型区,单击鼠标右键得到一个下拉菜单,单击选中的类型,在变量类型区光标所在处可以得到选中的类型。

子程序传递的参数放在子程序的局部存储器(L)中,局部变量表最左列是系统指定的每个被传递参数的局部存储器地址。

(5)带参数子程序调用指令格式

带参数子程序调用的LAD指令格式如图3-45所示。系统保留局部变量存储器L内存的4个字节(LB60~LB63),用于调用参数。

978-7-111-49003-6-Chapter03-63.jpg

图3-45 带参数子程序调用

需要说明的是:该程序只能在STL编辑器中显示,因为用作能流输入的布尔参数,未在L内存中保存。子程序调用时,输入参数被复制到局部存储器。子程序完成时,从局部存储器复制输出参数到指令的输出参数地址。

如果在使用子程序调用指令后,然后修改该子程序的局部变量表,调用指令则无效。必须删除无效调用,并用反映正确参数的最新调用指令代替该调用子程序和调用程序共用累加器。不会因使用子程序对累加器执行保存或恢复操作。

子程序调用时,输入参数被复制到局部存储器。子程序完成时,从局部存储器复制输出参数到指令的输出参数地址。

在带参数的“调用子程序”指令中,参数必须与子程序局部变量表中定义的变量完全匹配。参数顺序必须以输入参数开始,其次是输入/输出参数,然后是输出参数。位于指令树中的子程序名称的工具将显示每个参数的名称。

调用带参数子程序使ENO=0的错误条件是:0008(子程序嵌套超界),SM4.3(运行时间)。

3.在子程序局部变量表中定义参数

可以使用子程序的局部变量表为子程序定义参数。注意:程序中每个POU都有一个独立的局部变量表,必须在选择该子程序标签后出现的局部变量表中为该子程序定义局部变量。编辑局部变量表时,必须确保已选择适当的标签。每个子程序最多可以定义16个输入/输出参数。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈