带参数调用子程序怎么实现
- 格式:doc
- 大小:22.00 KB
- 文档页数: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(期末作业)题目:班级:学号:姓名:完成日期 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、程序计数器指向堆栈中保存的返回地址,继续执行程序。
子程序调用指令的使用有很多优点,可以将程序设计的复杂性降低,提高代码的可维护性,减少重复的编码,并使程序更加结构良好和清晰。
同时,由于调用子程序时需要使用到跳转指令,也可以减少程序运行所需的时间。
然而,程序的运行效率有时也会根据子程序的大小和复杂性以及条件的多少而有所降低。
加工中心是一种高精度、高效率的数控机床,其主要作用是对工件进行加工。
在加工中心的操作过程中,通常会涉及到多个子程序的调用。
如何合理地调用多个子程序,可以有效提高加工效率,保证加工质量,本文将从以下几个方面介绍加工中心主程序调用多个子程序的方法:一、了解加工中心主程序的结构加工中心主程序通常采用G代码和M代码进行编程。
G代码用于控制加工中心的运动轨迹和加工轨迹,M代码用于控制加工中心的辅助功能,如刀具切换、冷却液开关等。
在编写加工中心主程序时,需要充分了解加工中心的结构和工作原理,明确每个子程序的功能和调用顺序。
二、合理规划加工过程中的子程序在加工中心的加工过程中,通常会涉及到多个子程序,如加工轨迹生成、刀具切换、冷却液控制等。
在编写加工中心主程序时,需要对加工过程进行合理规划,明确每个子程序的功能和调用顺序,确保加工过程顺利进行。
三、采用模块化编程思想在编写加工中心主程序时,可以采用模块化编程思想,将不同功能的子程序分解成多个模块,每个模块负责完成相应的功能。
通过模块化编程,可以有效提高代码的复用性和可维护性,简化主程序的编写和调试过程。
四、合理使用宏指令和循环结构在加工中心主程序中,可以合理使用宏指令和循环结构,简化代码的编写和提高代码的可读性。
宏指令可以将一系列操作封装成一个整体,通过简单的调用即可完成复杂的操作;循环结构可以简化重复操作的编写,提高代码的复用性和可维护性。
五、加强调试和测试工作在编写加工中心主程序时,需要加强调试和测试工作,确保主程序和子程序之间的调用顺利进行。
可以通过模拟加工、单步调试等方式对主程序和子程序进行验证,及时发现和解决问题,保证加工过程的顺利进行。
通过以上几点方法的合理运用,可以有效提高加工中心主程序调用多个子程序的效率和质量,确保加工过程的顺利进行。
希望本文对加工中心主程序调用多个子程序的方法有所帮助。
一、优化主程序结构加工中心的主程序结构通常需要按照加工过程的逻辑顺序来组织。
子程序的调用和返回指令
子程序是指在一个程序中定义的可以被其他程序调用的一段代码。
通过使用子程序,
程序员可以将重复的代码封装起来,减少代码的复制粘贴,提高代码的复用率和可维护性。
在编程语言中,子程序也被称为函数、过程或方法。
子程序的调用指令和返回指令是用于在程序中调用和退出子程序的指令。
在大多数编
程语言中,这些指令可以通过程序的控制流语句实现,在汇编语言中,这些指令是由特定
的汇编语句生成的机器指令。
子程序的调用指令通常包括以下步骤:
1. 保存当前程序计数器(PC)的值,以便返回时恢复执行点。
3. 将栈指针向下移动一定的偏移量,为子程序分配新的栈空间。
4. 将传入子程序的参数压入栈中,以便被子程序使用。
1. 弹出子程序的返回值,如果有的话。
4. 使用跳转指令将程序计数器更新为保存的返回地址,以便返回到调用者的程序
流。
子程序的调用和返回指令是编程中常用的技巧,可以优化程序的结构和代码重用。
在
高级编程语言中,编译器通常会自动为程序员处理子程序的调用和返回指令。
然而,在底
层编程和系统级编程中,程序员需要手动处理这些指令,以便更好地控制程序的执行流和
资源管理。
●带参数的子程序调用:1、建立子程序SUBJC.PRG,功能是求x的阶乘,代码如下:Parameters x , y && 定义形式参数N=1Y=1Do while n<=xY=Y*n &&累计乘积的表达式,结果保存y变量中N=N+1Enddoreturn &&返回主程序, 将y值回传给s,即s=y2、建立主程序JCMAIN.PRG,代码如下:S=0Do SUBJC with 5, S && 调用子程序,并传递参数5,S, 即x=5 y=s ? S &&120 5的阶乘值●带参数的过程文件调用1、建立过程文件SP1.PRG,功能是求x的阶乘,代码如下:Procedure JC &&在过程文件中定义一个名为JC的过程Parameters x , y &&定义形式参数N=1Y=1Do while N<=xY=Y*NN=N+1EnddoReturn &&返回主程序,将y值回传给s,即s=y注:多个过程可以放在一个过程文件中,用过程名来区分。
实际上,过程和子程序是一回事,只不过把多个子程序保存在一个PRG文件中,在PRG文件中每个子程序(过程)用Procedure 语句单独定义罢了,而把这个PRG文件成为过程文件。
2、建立主程序SPMAIN.PRG,代码如下:Set procedure to sp1 &&打开过程文件SP1.PRGS=0Do JC with 5,S &&调用JC过程,并传递参数5,S,即x=5 y=s? SSet procedure to &&关闭过程文件。
主程序与子程序参数传递方式一、什么是主程序与子程序参数传递方式在程序设计中,主程序与子程序参数传递方式是指在程序执行的过程中,主程序向子程序传递参数或者子程序向主程序返回结果的一种机制。
它是程序设计中一个非常重要的环节,因为只有通过参数的传递,程序才能够实现数据的处理和结果的输出。
1. 值传递方式值传递方式是指在主程序中将数据的值传递给子程序,子程序对这个值进行操作,但是不会对这个值进行修改。
这种方式是通过将数据的值作为参数传递给子程序的。
2. 引用传递方式引用传递方式是指在主程序中将数据的地址传递给子程序,子程序对这个地址所对应的数据进行操作,可以进行修改。
这种方式是通过将数据的地址作为参数传递给子程序的。
3. 指针传递方式指针传递方式是指在主程序中将指向数据的指针传递给子程序,子程序可以通过指针来访问和修改数据的值。
这种方式是通过将指针作为参数传递给子程序的。
三、主程序与子程序参数传递方式的应用主程序与子程序参数传递方式在各种编程语言中都有广泛的应用,例如在C语言中,通过值传递、引用传递和指针传递方式可以实现函数的调用和参数的传递;在Java语言中,通过值传递的方式可以将基本数据类型的值传递给方法,而通过引用传递的方式可以将对象的引用传递给方法。
而在实际编程中,我们需要根据具体的情况来选择使用哪种传递方式。
例如,如果我们需要在子程序中修改数据的值,那么就需要使用引用传递或者指针传递方式;如果我们只是需要在子程序中对数据进行操作,但是不需要修改数据的值,那么就可以使用值传递方式。
四、主程序与子程序参数传递方式的优缺点1. 值传递方式的优缺点优点:值传递方式比较简单,数据的值不会被修改,可以避免不必要的数据冲突。
缺点:如果需要修改数据的值,就不能使用值传递方式。
2. 引用传递方式的优缺点优点:引用传递方式可以修改数据的值,而且不会产生新的数据对象。
缺点:引用传递方式容易产生数据冲突,需要注意数据的同步性。
在子程序中定义局部变量表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浮点数值。