第十一节 子程序的调用
- 格式:ppt
- 大小:435.50 KB
- 文档页数:12
浅谈西门子编程语言《子程序的调用》作者:李强来源:《科技创新导报》2019年第04期摘 ; 要:针对机电专业的学生学习西门子功能编程语言比较困难,功能编程语言经常用到子程序,从子程序的特点,运行方式,举例应用完整技术介绍了子功能编程,写程序时经常用到子程序,它是架构式的编程,学习西门子功能指令的重点和难点。
本文研究分析了西门子编程语言《子程序的调用》,希望为广大读者提供参考。
关键词:程序特点 ;运行方式 ;梯形图中图分类号:TP39 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; 文献标识码:A ; ; ; ; ; ; ; ; ; ; ; ;文章编号:1674-098X(2019)02(a)-0148-021 ;子程序的特点(1)子程序只有在主程序发出调用指令的时候才运行,运行完毕后,自动返回主程序,所以不用每个扫描周期都执行,这样可以减少整个程序的运行时间,对于一些初始化的程序,写在子程里比较合适。
(2)S7-200 CPU可以写64个子程序(0-63) CPU226XM还可以写128个子程序(0-127)。
(3)子程序可以嵌套使用(主程序中调用子程序,子程序再调用子程序),最大嵌套深度为8级,但是中断程序里不能嵌套子程序。
(4)子程序默认的名称是SBR_n。
(n子程序编号)也可以修改。
2 ;子程序的运行方式(1)并列运行,一个程序中有多个子程序,之间没有嵌套的关系,是并列的,只要调用的条件满足,这个子程序就能被运行。
(2)嵌套运行,主程序调用子程序,子程序还可以再调用子程序,这种方式叫做嵌套,最多可以嵌套8层,这种情况下,各个子程序的运行有先后之分。
(3)在子程序中不能使用END(结束指令),每一个每一个子程序在编译时编译器自动在子程序的最后加入无条件返回指令,当用户需要编程实现有条件返回时,可以在子程序使用有条件返回RET指令。
(4)带参数调用子程序。
在调用子程序时可以带参数调用。
第一种方法:在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,如果两者都没有,就会报错误信息。
子程序存储在存储器中,可供一个或多个调用程序(主程序)反复调用。
主程序调用子程序时使用CALL指令,由子程序返回主程序时使用RET指令。
由于调用程序和子程序可以在同一个代码段中,也可以在不同的代码段中,因此,CALL指令和RET指令也有近调用、近返回及远调用、远返回两类格式。
⑴ CALL NEAR PTR <子程序名> 近调用(near call) 近调用是CALL指令的缺省格式,可以写为"CALL <子程序名>rotine"。
它调用同一个代码段内的子程序(子过程),因此,在调用过程中不用改变CS的值,只需将子程序的地址存入IP寄存器。
CALL指令中的调用地址可以用直接和间接两种寻址方式表示。
⑵ CALL FAR PTR <子程序名> 远调用(far call) 远调用适用于调用程序(也称为主程序)和子程序不在同一段中的情况,所以也叫做段间调用。
和近调用指令一样,远调用指令中的寻址方式也可用直接方式和间接方式。
⑶ RET 返回指令(return) RET指令执行的操作是把保存在堆栈中的返回地址出栈,以完成从子程序返回到调用程序的功能。
● CALL <子程序名> 段内直接调用 执行操作:① (SP) ← (SP)-2,((SP)) ← (IP)当前 ② (IP) ← (IP)当前+16位位移量(在指令的第2、3个字节中) ● CALL DESTIN 段内间接调用 执行操作:① (SP) ← (SP)-2,((SP)) ← (IP)当前 ② (IP) ← (EA) ; (EA)为指令寻址方式所确定的有效地址 ● CALL FAR PTR <子程序名> 段间直接调用 执行操作:① (SP) ← (SP)-2,((SP)) ← (CS)当前 (SP) ← (SP)-2,((SP)) ← (IP)当前 ② (IP) ←偏移地址(在指令的第2、3个字节中) (CS) ←段地址(在指令的第4、5个字节中) ● CALL WORD PTR DESTIN 段间间接调用 执行操作:① (SP) ← (SP)-2,((SP)) ← (CS)当前 (SP) ← (SP)-2,((SP)) ← (IP)当前 ② (IP) ← (EA) ; (EA)为指令寻址方式所确定的有效地址 (CS) ← (EA+2) 从CALL指令执行的操作可以看出,第一步是把子程序返回调用程序的地址保存在堆栈中。
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)当子程序执行完时,需要返回到调用它的程序之中。
数控编程中子程序的定义和调用方法
1.子程序的定义
在编制加工程序中,有时会遇到一组程序段在-个程序中多次出现,或者在几个程序中都要使用它。
这个典型的加工程序可以做成固定程序,并单独加以命名,这组程序段就称为子程序。
2.使用子程序的目的和作用
使用子程序可以减少不必要的编程重复,从而达到减化编程的目的。
主程序可以调用子程序,一个子程序也可以调用下一级的子程序。
子程序必须在主程序结束指令后建立,其作用相当于一个固定循环。
3.子程序的调用
在主程序中,调用子程序的指令是一个程序段,其格式随具体的数控系统而定,FANUC-6T 系统子程序调用格式为
M98 P--L--
式中M98--子程序调用字;
p--子程序号;
L--子程序重复调用次数。
由此可见,子程序由程序调用字、子程序号和调用次数组成。
4.子程序的返回
子程序返回主程序用指令M99,它表示子程序运行结束,请返回到主程序。
5.子程序的嵌套
子程序调用下一级子程序称为嵌套。
上一级子程序与下一级于程序的关系,与主程序与第一层子程序的关系相同。
子程序可以嵌套多少层由具体的数控系统决定,在FANUC-6T系统中,只能有两次嵌套。
子程序的调用和返回指令
子程序是指在一个程序中定义的可以被其他程序调用的一段代码。
通过使用子程序,
程序员可以将重复的代码封装起来,减少代码的复制粘贴,提高代码的复用率和可维护性。
在编程语言中,子程序也被称为函数、过程或方法。
子程序的调用指令和返回指令是用于在程序中调用和退出子程序的指令。
在大多数编
程语言中,这些指令可以通过程序的控制流语句实现,在汇编语言中,这些指令是由特定
的汇编语句生成的机器指令。
子程序的调用指令通常包括以下步骤:
1. 保存当前程序计数器(PC)的值,以便返回时恢复执行点。
3. 将栈指针向下移动一定的偏移量,为子程序分配新的栈空间。
4. 将传入子程序的参数压入栈中,以便被子程序使用。
1. 弹出子程序的返回值,如果有的话。
4. 使用跳转指令将程序计数器更新为保存的返回地址,以便返回到调用者的程序
流。
子程序的调用和返回指令是编程中常用的技巧,可以优化程序的结构和代码重用。
在
高级编程语言中,编译器通常会自动为程序员处理子程序的调用和返回指令。
然而,在底
层编程和系统级编程中,程序员需要手动处理这些指令,以便更好地控制程序的执行流和
资源管理。
中断处理和子程序调用一、引言中断处理和子程序调用是计算机领域中常用的两种编程技术。
中断处理是指在程序执行过程中,遇到特定事件时,暂停当前任务,转而执行特定的中断处理程序。
而子程序调用是指将一个独立的程序段作为子程序,在需要的时候进行调用,执行完毕后返回到原程序继续执行。
本文将深入探讨中断处理和子程序调用的原理、应用场景及其优缺点。
二、中断处理中断处理是计算机系统中的一种重要机制,用于处理外部事件的发生。
当特定事件发生时,中断会打断当前程序的执行,转而执行中断处理程序。
中断可以分为硬件中断和软件中断两种类型。
2.1 硬件中断硬件中断是由硬件设备触发的中断,例如外部设备的输入输出、定时器的溢出等。
硬件中断需要通过硬件电路来实现,当硬件设备触发中断时,会向CPU发送中断请求信号,CPU则根据中断向量表找到对应的中断处理程序并执行。
2.2 软件中断软件中断是由软件指令触发的中断,也称为软中断或系统调用。
软件中断通常由程序员在程序中主动设置的中断指令触发,用于处理一些特定的操作,如操作系统的系统调用。
软件中断的触发和处理过程由CPU完成,通过改变程序计数器的值,使CPU跳转到中断处理程序的入口地址执行。
2.3 中断处理过程中断处理过程主要包括中断请求、中断响应和中断处理三个阶段。
1.中断请求:当硬件设备或软件触发中断时,会向CPU发送中断请求信号,请求CPU执行中断处理程序。
2.中断响应:CPU在接收到中断请求后,会根据中断类型和中断向量表找到对应的中断处理程序的入口地址,并将当前程序的状态保存起来,以便中断处理完成后能够恢复执行。
3.中断处理:CPU跳转到中断处理程序的入口地址开始执行中断处理代码。
中断处理程序会根据具体的中断类型进行相应的处理,处理完毕后会恢复之前保存的程序状态,并返回到原程序继续执行。
三、子程序调用子程序调用是一种将一个独立的程序段作为子程序,在需要的时候进行调用的编程技术。
子程序通常用于完成某个独立的功能,可以在不同的地方多次调用,提高代码的复用性和可维护性。