带参数调用子程序怎么实现
(1)带参数的子程序的概念及用途

(1)带参数的子程序的概念及用途子程序可能有要传递的参数(变量和数据),这时可以在子程序调用指令中包含相应参数,它可以在子程序与调用程序之间传送。
如果子程序仅用要传递的参数和局部变量,则为带参数的子程序(可移动子程序)。
为了移动子程序,应避免使用任何全局变量/符号(I、Q、M、SM、AI、AQ、V、T、C、S、AC内存中的绝对地址),这样可以导出子程序并将其导入另一个项目。
子程序中的参数必须有一个符号名(最多为23个字符)、一个变量类型和一个数据类型。
子程序最多可传递16 个参数。
传递的参数在子程序局部变量表中定义。
如表4-7所示。
表4-7 局部变量表(2)变量的类型局部变量表中的变量有IN、OUT、IN/OUT和TEMP等4种类型。
IN(输入)型:将指定位置的参数传入子程序。
如果参数是直接寻址(例如VB10),在指定位置的数值被传入子程序。
如果参数是间接寻址,(例如*AC1),地址指针指定地址的数值被传入子程序。
如果参数是数据常量(16#1234)或地址(&VB100),常量或地址数值被传入子程序。
IN_OUT(输入-输出)型:将指定参数位置的数值被传入子程序,并将子程序的执行结果的数值返回至相同的位置。
输入/输出型的参数不允许使用常量(例如16#1234)和地址(例如&VB100)。
OUT(输出)型:将子程序的结果数值返回至指定的参数位置。
常量(例如16#1234)和地址(例如&VB100)不允许用作输出参数。
在子程序中可以使用IN,IN/OUT,OUT类型的变量和调用子程序POU之间传递参数。
TEMP型:是局部存储变量,只能用于子程序内部暂时存储中间运算结果,不能用来传递参数。
(3)数据类型局部变量表中的数据类型包括:能流、布尔(位)、字节、字、双字、整数、双整数和实数型。
能流:能流仅用于位(布尔)输入。
能流输入必须用在局部变量表中其他类型输入之前。
只有输入参数允许使用。
子程序调用—自己总结

第一种方法:在Job模块里,创建工作,在Edit Job对话框中选择General选项卡,在User subroutine file中点击Select按钮,从弹出对话框中选择你要调用的子程序文件(后缀为.for或.f)。
第二种方法:1. 建立工作目录2. 将Abaqus安装目录\6.4-pr11\site下的aba_param_dp.inc 或aba_param_sp.inc拷贝到工作目录,并改名为aba_param.inc;3. 将编译的fortran程序拷贝到工作目录;4.将.obj文件拷贝到工作目录;5. 建立好输入文件.inp;6. 运行abaqus job=inp_name user=fortran name即可。
以下是网上摘录的资料,供参考:用户进行二次开发时,要在命令行窗口执行下面的命令:abaqus job=job_name user=sub_nameABAQUS会把用户的源程序编译成obj文件,然后临时生成一个静态库standardU.lib和动态库standardU.dll,还有其它一些临时文件,而它的主程序(如standard.exe和explicit.exe等)则没有任何改变,由此看来ABAQUS是通过加载上述2个库文件来实现对用户程序的连接,而一旦运行结束则删除所有的临时文件。
这种运行机制与ANSYS、LS-DYNA、marc等都不同。
这些生成的临时文件要到文件夹C:\Documents and Settings\Administrator\Local Settings\Temp\中才能找到,这也是6楼所说的藏了一些工作吧,大家不妨试一下。
1子程序格式(程序后缀是.f; .f90; .for;.obj??)答:我试过,.for格是应该是不可以的,至少6.2和6.3版本应该是不行,其他的没用过,没有发言权。
在Abaqus中,运行abaqus j=jobname user=username时,默认的用户子程序后缀名是.for (.f,.f90应该都不行的,手册上也有讲过),只有在username.for文件没有找到的情况下,才会去搜索username.obj,如果两者都没有,就会报错误信息。
子程序的调用和返回指令

1、子程序的调用和返回指令子程序的调用和返回是一对互逆操作,也是一种特殊的转移操作。
一方面,之所以说是转移,是因为当调用一个子程序时,程序的执行顺序被改变,CPU将转而执行子程序中的指令序列,在这方面,调用子程序的操作含有转移指令的功能,子程序的返回指令的转移特性与此类似;另一方面,转移指令是一种“一去不复返”的操作,而当子程序完后,还要求CPU能转而执行调用指令之下的指令,它是一种“有去有回”的操作。
为了满足子程序调用和返回操作的特殊性,在指令系统中设置了相应的特定指令。
1、1调用指令(CALL)调用子程序指令的格式如下:CALL 子程序名/Reg/Mem子程序的调用指令分为近(near)调用和远(far)调用。
如果被调用子程序的属性是近的,那么,CALL指令将产生一个近调用,它把该指令之后地址的偏移量(用一个字来表示的)压栈,把被调用子程序入口地址的偏移量送给指令指针寄存器IP即可实现执行程序的转移如果被调用子程序的属性是远的,那么,CALL指令将产生一个远调用。
这时,调用指令不仅要把该指令之后地址的偏移量压进栈,而且也要把段寄存器CS的值压进栈。
在此之后,再把被调用子程序入口地址的偏移量和段值分别送给IP和CS,这样完成了子程序的远调用操作00405600 call 0040689500405604 ......子程序调用指令本身的执行不影响任何标志位,但子程序体中指令的执行会改变标志位,所以,如果希望子程序的执行不能改变调用指令前后的标志位,那么,就要在子程序的开始处保护标志位,在子程序的返回前恢复标志位。
例如:CALL DISPLAY;DISPLAY是子程序名CALL BX;BX的内容是子程序的偏移量CALL WORD1;WORD1是内存字变量,其值是子程序的偏移量CALL DWORD1;DWORD1是双字变量,其值是子程序的偏移量和段值CALL word ptr [BX];BX所指内存字单元的值是子程序的偏移量CALL dword ptr [BX];BX所指内存双字单元的值是子程序的偏移量和段值1、2返回指令(RET)当子程序执行完时,需要返回到调用它的程序之中。
GE PAC CALL指令说明及应用举例

南阳理工学院可编程控制器GE(期末作业)题目:班级:学号:姓名:完成日期 2015 年 5 月RX3i CALL指令说明[1]一 CALL指令格式通过调用子程序(CALL)指令可以实现模块化程的功能。
CALL指令可以使程序转入特定的子程序块。
如图1所示。
图1 CALL指令二指令功能2.1 梯形图2.1.1 无参数的调用打开Proficy Machine Ediion 的开发软件环境,建立一个新的工程,点开编辑程序的 Logic,选用CALL指令,注意红色标记的 CALL 指令。
图2 无参数的调用2.1.2 带参数调用可以调用一个带参数的外部子程序或者一个参数子程序,可以有7个输入和8个输出参数。
打开Proficy Machine Ediion 的开发软件环境,建立一个新的工程,点开编辑程序的 Logic,进行编写带参数的程序,选用CALL指令。
图3 带参数调用设置2.1.3带参数调用子程序的参数设置对带有参数调用子程序的使用,PAC软件中程序编写应该注意设置参数,结合自己编写的程序来设置Inputs中的Data Type(数据类型),Pass By(经过)如图4所示和Outputs 中的Data Type(数据类型)进行选定(注意图片中红色标记的为选择设置内容)。
如图5所示:图4 Intputs参数的设置图5 Outputs参数的设置2.1.4 总结当CALL 功能块接收能流,它将使逻辑执行立即跳转到目的程序块,外部子程序(带参数或无参数),或参数子程序并执行。
该子程序执行结束后,控制立即返回在CALL 指令之后的原调用点。
注意:①一个CALL功能块能在任何程序块中使用,包括_MAIN块或一个带参数块。
但不能在一个外部块中使用。
②不能调用一个_MAIN块。
③执行调用之前,被调用的块必须存在。
④一个已知块的调用和被调用的次数没有限制。
⑤通过调用块本身可以形成递归子程序。
当堆栈容量配置为默认值(64K),保证在“应用堆栈⑥溢出”错误发生之前8个嵌套调用中最小一个调用。
子程序调用指令

子程序调用指令
子程序调用指令是指一个程序在一段程序运行时,该段程序执行某个功能时,会调用由另一段子程序处理的指令的一种机器指令。
子程序调用指令的运行过程主要分为六个步骤:
1、先将书写代码时在子程序指令里声明的一个标记符(参数可以有一到多个)放入程序计数器,编程使程序跳转至对应的子程序。
2、将参数放入堆栈中。
3、程序计数器指向下一个指令(位置),将其存入返回地址寄存器中。
4、转至子程序,调用子程序中的指令,直至子程序返回跳转指令。
5、将从子程序返回的参数或结果放入程序总线中。
6、程序计数器指向堆栈中保存的返回地址,继续执行程序。
子程序调用指令的使用有很多优点,可以将程序设计的复杂性降低,提高代码的可维护性,减少重复的编码,并使程序更加结构良好和清晰。
同时,由于调用子程序时需要使用到跳转指令,也可以减少程序运行所需的时间。
然而,程序的运行效率有时也会根据子程序的大小和复杂性以及条件的多少而有所降低。
第十一节 子程序的调用

主程序与子程序间的参数传递 主程序与子程序相互传递的信息称为参数。 主程序与子程序相互传递的信息称为参数。主程序提供给 子程序以便加工处理的信息称为入口参数, 子程序以便加工处理的信息称为入口参数,经子程序加工 处理后回送给主程序的信息称为出口参数。 处理后回送给主程序的信息称为出口参数。在调用子程序 主程序应事先把入口参数放到某些约定的位置。 时,主程序应事先把入口参数放到某些约定的位置。子程 序在运行时,可以从约定的位置得到有关的参数。同样, 序在运行时,可以从约定的位置得到有关的参数。同样, 子程序在运行结束前,也应把出口参数送到约定位置。 子程序在运行结束前,也应把出口参数送到约定位置。在 返回主程序后,主程序可以从这些地方得到需要的结果。 返回主程序后,主程序可以从这些地方得到需要的结果。
第十节 子程序的调用
子程序的概念
• 子程序是一种重要的程序结构。 在实用中, 子程序是一种重要的程序结构 。 在实用中 , 常会遇到需要反复多次执行同一程序段的情 为了减少重复编写的工作量, 形 。 为了减少重复编写的工作量 , 并减少程 序存储空间, 常常把功能完整、 序存储空间 , 常常把功能完整 、 意义明确并 次使用的程序段从原来的程序( 被多次使用的程序段从原来的程序(称为主程 中分离出来独立编写,就成为子程序, 序)中分离出来独立编写,就成为子程序,从 而主程序可根据需要多次调用子程序。 而主程序可根据需要多次调用子程序。
子程序调用与堆栈的关系
• 为了能够成功地调用子程序,主程序应能在需要时通过调用指 为了能够成功地调用子程序, 令自动转入子程序, 令自动转入子程序,子程序完成后应能够通过末尾的返回指令 自动返回调用指令下一条指令地址(称为断点地址 处继续执行。 称为断点地址)处继续执行 自动返回调用指令下一条指令地址 称为断点地址 处继续执行。 • 因此,调用指令不仅要将子程序入口地址送到程序计数器 , 因此,调用指令不仅要将子程序入口地址送到程序计数器PC, 还要将断点地址存入堆栈保护起来。 以便实现程序转移,还要将断点地址存入堆栈保护起来。返回 指令则要将断点地址从堆栈中取出送给PC, 指令则要将断点地址从堆栈中取出送给 ,以便返回断点处继 续执行主程序。 续执行主程序。
加工中心主程序调用多个子程序的方法

加工中心是一种高精度、高效率的数控机床,其主要作用是对工件进行加工。
在加工中心的操作过程中,通常会涉及到多个子程序的调用。
如何合理地调用多个子程序,可以有效提高加工效率,保证加工质量,本文将从以下几个方面介绍加工中心主程序调用多个子程序的方法:一、了解加工中心主程序的结构加工中心主程序通常采用G代码和M代码进行编程。
G代码用于控制加工中心的运动轨迹和加工轨迹,M代码用于控制加工中心的辅助功能,如刀具切换、冷却液开关等。
在编写加工中心主程序时,需要充分了解加工中心的结构和工作原理,明确每个子程序的功能和调用顺序。
二、合理规划加工过程中的子程序在加工中心的加工过程中,通常会涉及到多个子程序,如加工轨迹生成、刀具切换、冷却液控制等。
在编写加工中心主程序时,需要对加工过程进行合理规划,明确每个子程序的功能和调用顺序,确保加工过程顺利进行。
三、采用模块化编程思想在编写加工中心主程序时,可以采用模块化编程思想,将不同功能的子程序分解成多个模块,每个模块负责完成相应的功能。
通过模块化编程,可以有效提高代码的复用性和可维护性,简化主程序的编写和调试过程。
四、合理使用宏指令和循环结构在加工中心主程序中,可以合理使用宏指令和循环结构,简化代码的编写和提高代码的可读性。
宏指令可以将一系列操作封装成一个整体,通过简单的调用即可完成复杂的操作;循环结构可以简化重复操作的编写,提高代码的复用性和可维护性。
五、加强调试和测试工作在编写加工中心主程序时,需要加强调试和测试工作,确保主程序和子程序之间的调用顺利进行。
可以通过模拟加工、单步调试等方式对主程序和子程序进行验证,及时发现和解决问题,保证加工过程的顺利进行。
通过以上几点方法的合理运用,可以有效提高加工中心主程序调用多个子程序的效率和质量,确保加工过程的顺利进行。
希望本文对加工中心主程序调用多个子程序的方法有所帮助。
一、优化主程序结构加工中心的主程序结构通常需要按照加工过程的逻辑顺序来组织。
子程序的调用和返回指令

子程序的调用和返回指令
子程序是指在一个程序中定义的可以被其他程序调用的一段代码。
通过使用子程序,
程序员可以将重复的代码封装起来,减少代码的复制粘贴,提高代码的复用率和可维护性。
在编程语言中,子程序也被称为函数、过程或方法。
子程序的调用指令和返回指令是用于在程序中调用和退出子程序的指令。
在大多数编
程语言中,这些指令可以通过程序的控制流语句实现,在汇编语言中,这些指令是由特定
的汇编语句生成的机器指令。
子程序的调用指令通常包括以下步骤:
1. 保存当前程序计数器(PC)的值,以便返回时恢复执行点。
3. 将栈指针向下移动一定的偏移量,为子程序分配新的栈空间。
4. 将传入子程序的参数压入栈中,以便被子程序使用。
1. 弹出子程序的返回值,如果有的话。
4. 使用跳转指令将程序计数器更新为保存的返回地址,以便返回到调用者的程序
流。
子程序的调用和返回指令是编程中常用的技巧,可以优化程序的结构和代码重用。
在
高级编程语言中,编译器通常会自动为程序员处理子程序的调用和返回指令。
然而,在底
层编程和系统级编程中,程序员需要手动处理这些指令,以便更好地控制程序的执行流和
资源管理。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在子程序中定义局部变量表IN ,OUT,IN_OUT,TEMP等。
用参数调用子例行程序子例行程序可能包含交接的参数。
参数在子例行程序的局部变量表中定义。
参数必须有一个符号名(最多为23个字符)、一个变量类型和一个数据类型。
可向子例行程序交接16个参数或从子例行程序交接16个参数。
局部变量表中的变量类型域定义参数是否交接至子例行程序(IN)、交接至或交接出子例行程序(IN_OUT)或交接出子例行程序(OUT)。
下表说明子例行程序的参数类型。
欲增加参数条目,将光标放在您希望增加的类型的变量类型域上(IN、IN_OUT或OUT)。
单极滑鼠右键,获得选项菜单。
选择“插入”选项,然后选择“下一行”选项。
在当前条目的下方会显示所选类型的另一个参数条目。
调用参数类型说明IN 参数被交接至子例行程序。
如果参数是直接地址(例如VB10),在指定位置的数值被交接至子例行程序。
如果参数是间接地址,(例如*AC1),位于指向位置的数值被交接至子例行程序。
如果参数是数据常量(16#1234)或地址(&VB100),常量或地址数值被交接至子例行程序。
IN_OUT 位于指定参数位置的数值被交接至子例行程序,来自子例行程序的结果数值被返回至相同的位置。
输入/输出参数不允许使用常量(例如16#1234)和地址(例如&VB100)。
OUT 来自子例行程序的结果数值被返回至指定的参数位置。
常量(例如16#1234)和地址(例如&VB100)不允许用作输出。
TEMP 未用作交接参数的任何本地内存不得用于子例行程序中的临时存储。
局部变量表中的数据类型域定义参数的大小和格式。
下表列出了参数类型。
参数数据类型说明功率流布尔功率流仅限用于位(布尔)输入。
该说明通知STEP 7-Micro/WIN 32该输入参数是依据位逻辑指令组合的功率流结果。
布尔功率流输入必须首先在局部变量表中任何其他类型输入之前显示。
只有输入参数允许这样使用。
下例中的启用输入(EN)和IN1输入使用布尔逻辑。
布尔该数据类型用于单位输入和输出。
下例中的IN3是布尔输入。
字节、字、双字这些数据类型分别识别1、2或4个字节不带符号的输入或输出参数。
整数、双整数这些数据类型分别识别2或4个字节带符号的输入或输出参数。
实数该数据类型识别单精度(4个字节)IEEE浮点数值。