子程序指令
汇编语言——子程序

6.2.2.2 RET指令 指令 【指令格式】RET 【功能】这是子程序返回指令,必须写在子程序的指令 序列之中。根据所在的子程序的类型不同,RET指令的功能 也分为两种情况: (1)如果RET所在子程序是NEAR类型,则从堆栈中出 栈一个字(当然,SP会加2),送给IP。 (2)如果RET所在子程序是FAR类型,则先从堆栈中出 栈一个字送到IP,再出栈一个字送到CS,栈顶指SP的值加4。
cr
PROC NEAR MOV AH,2 MOV DL,13 INT 21H MOV DL,10 INT 21H RET
cr ENDP main:MOV AX,dseg MOV DS,AX LEA DX,buf MOV AH,10 INT 21H CALL cr MOV AH,1 INT 21H MOV BL,AL ;输入一个字符 ;用BL保存读入的字符 ;输入一个符号串
【解】程序段(a)中,先把AX赋值为102H,再把BX赋 值为304H,然后用ADD指令把两数相加,和为406H,结果 放在ADD指令的目的操作数AX中。 程序段(b)的前两行与(a)完全相同,AX取值102H,BX 取值304H,但在相加之前调用了子程序cr。从例6.3中cr的 具体实现方法可以知道,调用过程中寄存器AH的值被改为 2,因为INT 21H输出功能,使AL的值也被修改,变成0AH, 并且这个值一直保持到调用结束,于是“CALL cr”指令调 用子程序后,AX的值不再是调用前的102H,而变成了 20AH,当ADD指令进行两个寄存器相加时,结果是50EH, 并放到目的操作数AX中。
6.3 应用子程序进行编程
6.3.1 子程序实例
【例6.3】分析下列程序,描述它的功能。 dseg SEGMENT buf DB 80,81 DUP(0) dseg ENDS sseg SEGMENT STACK DW 64 DUP(0) sseg ENDS cseg SEGMENT ASSUME CS:cseg,DS:dseg,SS:sseg
子程序的调用和返回指令

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)当子程序执行完时,需要返回到调用它的程序之中。
子程序调用和返回指令

FX2系列可 编程控制器 有10条程序 流向控制类 指令
CJ(条件跳转) CALL(子程序调用) SRET(子程序返回) IRET(中断返回)
EI、DI(中断允许与中断禁止)
FEND(主程序结束) WDT(监控定时器刷新)
FOR、NEXT(循环开始和循环结束)
子程序调用和返回指令
项目七: PLC功能指令应用
指令名称
助记符
指令代码位数
子程序调用 子程序返回
CALL CALL(P
)
SRET
FNC01 (16)
FNC02
操作数 D(•)
P0~P62 嵌套5级
无
程序步
3步 标号P 1步 1步
指令格式
项目七: PLC功能指令应用
1.指令编号及助记符
(1)子程序调用功能指令FNC01 CALL ,CALL(P);
子程序标号范围为P0~P62,这些标号与条件转 移中所用的标号相同,而且在条件转移中已经使 用了标号,子程序也不能再用
同一标号只能使用一次,而不同的CALL指令可以多 次调用同一标程序
标号
子程序
图7.20 CALL指令举例
2.子程序嵌套
项目七: PLC功能指令应用
(2)子程序返回功能指令 FNC02 SRET;
指令 格式
2.指令的目标操作元件是指 针号P0~P62(允许变址修改)
项目七: PLC功能指令应用
指令用法
1.子程序 与标号的
位置
CALL指令必须和FEND,SRET一起使用
子程序标号要写在主程序结束指令FEND之后
标号P0和子程序返回指令SRET间的程序构成了P0子 程序的内容 当主程序带有多个子程序时,子程序要依次放在主 程序结束指令FEND之后,并用不同的标号相区别
发那科加工中心子程序调用编程序例子

发那科加工中心子程序调用编程序例子发那科加工中心是一种高效、精确的机械加工设备,可以广泛应用于各种制造业领域。
其中,子程序调用编程序是发那科加工中心中重要的功能之一。
子程序调用编程是一种编写程序的方法,通过在主程序中调用子程序,可以实现复用代码、提高程序的灵活性和可读性。
在发那科加工中心上,子程序调用编程可以帮助操作员实现更加高效的加工操作。
下面是一个示例,展示了如何在发那科加工中心上使用子程序调用编程:```主程序:N10 G90 G54 G00 X0 Y0 ; 初始化设置N20 M06 T1 ; 载入刀具N30 G43 H01 Z50 ; 刀具长度补偿N40 G97 S2000 ; 设定主轴转速N50 M03 ; 主轴转向N60 G01 Z-10 F100 ; Z轴下降N70 G01 X10 Y10 F200 ; XY轴移动N80 M98 P100 L10 ; 调用子程序子程序:O100 ; 子程序起始位置N10 G01 Z-20 F150 ; Z轴下降N20 G01 X20 Y20 F300 ; XY轴移动N30 G01 X30 Y30 F300 ; XY轴移动N40 G01 X40 Y40 F300 ; XY轴移动N50 G01 Z-10 F150 ; Z轴抬升N60 M99 ; 子程序结束```在上述示例中,主程序首先进行了一系列的初始化设置,然后载入刀具,并进行刀具长度补偿、设定主轴转速和转向。
接下来,主程序通过G01指令实现Z轴下降和XY轴移动。
最后,通过调用子程序的M98指令,执行子程序中的代码。
子程序中的代码根据实际需求进行编写。
示例中的子程序从O100位置开始,通过G01指令实现Z轴下降和XY轴移动。
最后,通过M99指令结束子程序。
通过使用子程序调用编程,操作员可以将重复性的加工操作封装在子程序中,通过简单的调用实现复用。
这样可以大大提高编程效率,减少出错的可能性,并且使程序更加易读易懂。
数控铣常用指令之子程序

子程序 O0002; G91 G00 Z-95.0; G41 X40.0 Y20.0 D01; G01 Z-15.0 F100.0; Y30.0; X-10.0; X10.0 Y30.0; X40.0; X10.0 Y-30.0; X-10.0; Y-20.0; X-50.0; Z110.0; G40 X-30.0 Y-30.0 M99;
y
R 10
30
60
X 30
40
谢谢!
例如:M98P1002:; 调用1002号子程序,重复1次。
例一:如图所示,加工两个相同的工件,试编写
其加工程序。Z轴开始点为工件上方100mm处,切
深10mm。
Y D E
50
C N
B A M
G H
F
2
X O 50 10 0 15 0
1、编写子程序时,一般采用增量方式编程,这样可减少 计算量。 2、主程序中的模态指令可被子程序中同一组的其它G代 码所更改。如子程序用了G91代码后,在返回主程序时将 继续以G91方式进行,故应特别注意代码的转换,否则可 能产生位置错误。 3、调用程序时使用刀补,最好不要在刀具补偿状态下的 主程序中调用子程序,换句话说,刀补的建立和取消应在 子程序中进行。如果必须在主程序中建立,则应在主程序 中消除。决不能在主程序中建立,在子程序中消除,也不 能在子程序中建立,在主程序中消除,否则极易出错。 4、子程序不能单独运行。
M98
儿子
M99
子程序:
一次装夹加工多个相同零件或一个零件有重复加工部分的情况下 可使用子程序。
说明:子程序不是NC系统的标准功能,不同的NC系统所用的指令和格式均 不相同。
Assembly语言的基本指令与应用

Assembly语言的基本指令与应用Assembly语言是一种低级程序设计语言,它是由机器指令和符号指令组成的。
相较高级语言,如C、Python等,Assembly语言更接近计算机硬件,使程序员能够直接操作寄存器、内存等底层资源。
在本文中,我们将探讨Assembly语言的基本指令以及其应用。
一、数据传输指令数据传输指令用于在寄存器和内存之间传输数据。
其中,MOV指令是最基本的数据传输指令,可以将数据从一个位置复制到另一个位置。
例如,MOV AX, BX指令可以将寄存器BX中的数据复制到AX寄存器中。
二、算术指令算术指令用于数值计算。
例如,ADD指令可以实现两个寄存器中的数值相加,并将结果保存在目标寄存器中。
SUB指令则可实现两个寄存器中的数值相减。
除此之外,还有MUL指令用于实现乘法,DIV指令用于实现除法等。
三、逻辑指令逻辑指令用于逻辑运算,例如AND、OR、NOT等。
AND指令可实现两个寄存器中的位与运算。
OR指令实现两个寄存器中的位或运算。
NOT指令则可对寄存器中的数据按位取反。
四、条件分支指令条件分支指令用于根据条件执行不同的操作。
例如,JMP指令可根据条件跳转到指定的地址。
JE指令用于判断两个数是否相等,并根据结果执行相应的操作。
五、循环指令循环指令用于实现循环结构。
例如,LOOP指令可根据条件循环执行一系列指令。
比如,可以使用LOOP指令实现对数组中的每个元素进行遍历和处理。
六、子程序指令子程序指令用于实现代码的模块化和重用。
例如,CALL指令可调用一个子程序。
RET指令用于从子程序中返回,并继续执行主程序的代码。
除了以上基本指令外,Assembly语言还有丰富的指令集供程序员使用,如字符串处理指令、输入输出指令等。
通过灵活运用这些指令,程序员可以编写出高效、底层的程序。
值得一提的是,Assembly语言虽然功能强大,但也存在一些局限性。
首先,它是与特定硬件平台相关的,因此编写的程序通常不能跨平台执行。
子程序的调用和返回指令

子程序的调用和返回指令
子程序是指在一个程序中定义的可以被其他程序调用的一段代码。
通过使用子程序,
程序员可以将重复的代码封装起来,减少代码的复制粘贴,提高代码的复用率和可维护性。
在编程语言中,子程序也被称为函数、过程或方法。
子程序的调用指令和返回指令是用于在程序中调用和退出子程序的指令。
在大多数编
程语言中,这些指令可以通过程序的控制流语句实现,在汇编语言中,这些指令是由特定
的汇编语句生成的机器指令。
子程序的调用指令通常包括以下步骤:
1. 保存当前程序计数器(PC)的值,以便返回时恢复执行点。
3. 将栈指针向下移动一定的偏移量,为子程序分配新的栈空间。
4. 将传入子程序的参数压入栈中,以便被子程序使用。
1. 弹出子程序的返回值,如果有的话。
4. 使用跳转指令将程序计数器更新为保存的返回地址,以便返回到调用者的程序
流。
子程序的调用和返回指令是编程中常用的技巧,可以优化程序的结构和代码重用。
在
高级编程语言中,编译器通常会自动为程序员处理子程序的调用和返回指令。
然而,在底
层编程和系统级编程中,程序员需要手动处理这些指令,以便更好地控制程序的执行流和
资源管理。
sinumerik数控编程指令高级讲解

sinumerik数控编程指令高级讲解Sinumerik是西门子公司的数控系统,广泛应用于各类数控机床。
在数控编程中,掌握高级编程指令能够有效提高编程效率和加工精度。
本文将对Sinumerik数控编程中的高级指令进行详细讲解,帮助读者深入理解和运用这些指令。
一、循环指令1.MOD:模数循环指令,用于实现固定循环的多次执行。
语法:MOD [循环次数]示例:MOD 5含义:执行5次固定循环。
2.WHILE-ENDWH:条件循环指令,根据指定条件重复执行循环体内的指令。
语法:WHILE 条件...ENDWH示例:WHILE [I] <= 10...ENDWH含义:当变量I的值小于等于10时,重复执行循环体内的指令。
二、数组指令1.DIM:定义数组指令,用于定义一个数组。
语法:DIM [数组名]([维数])示例:DIM TABLE(10)含义:定义一个名为TABLE的一维数组,包含10个元素。
2.INDEX:数组索引指令,用于访问数组元素。
语法:[数组名](INDEX)示例:TABLE(INDEX)含义:访问数组TABLE的当前元素。
三、子程序调用指令1.CALL:调用子程序指令,用于调用已定义的子程序。
语法:CALL [子程序名]示例:CALL SUB1含义:调用名为SUB1的子程序。
2.RETURN:子程序返回指令,用于从子程序返回到主程序。
语法:RETURN示例:RETURN含义:从当前子程序返回到主程序。
四、其他高级指令1.IF-THEN-ELSE-ENDIF:条件判断指令,根据条件执行不同路径的指令。
语法:IF 条件THEN...ELSE...ENDIF示例:IF [I] > 10 THEN...ELSE...ENDIF含义:如果变量I的值大于10,执行第一个路径的指令;否则,执行第二个路径的指令。
2.PAUSE:暂停指令,用于暂停程序的执行。
语法:PAUSE [时间]示例:PAUSE 5含义:暂停5秒。
plc的sub指令用法

plc的sub指令用法PLC(可编程逻辑控制器)是一种广泛应用于工业自动化领域的计算机设备,它通过执行一系列的指令来控制各种机械设备和生产过程。
在PLC编程中,Sub指令是一种常用的子程序指令,它允许将常用的程序段封装成一个独立的子程序,以便在需要时重复调用。
本文将介绍Sub指令的用法、优点、注意事项以及应用案例。
一、Sub指令的用法Sub指令用于创建一个子程序,也称为子程序块或函数/过程块。
子程序可以包含一系列的指令,用于完成特定的任务。
当调用子程序时,PLC会执行子程序中的指令,并返回一个结果。
如果子程序中有需要返回结果的指令,则需要在子程序末尾添加Return指令。
Sub指令的使用步骤如下:1. 编写子程序:首先,需要编写子程序的代码,包括指令、逻辑和变量等。
2. 保存子程序:将子程序保存到PLC中,以便后续调用。
3. 调用子程序:在主程序中需要使用子程序的地方,使用Call Sub指令来调用子程序。
4. 等待子程序执行结果:在调用子程序后,需要等待子程序执行完毕,并获取其返回结果。
二、Sub指令的优点Sub指令具有以下优点:1. 提高了编程效率:将常用的程序段封装成子程序,可以减少重复编写代码的工作量,提高编程效率。
2. 提高了可读性和可维护性:将复杂的程序分解成多个子程序,可以使程序结构更加清晰,便于维护和调试。
3. 增强了可扩展性:通过使用Sub指令,可以将一些常用的功能封装成独立的子程序,方便后续扩展和修改。
三、Sub指令的注意事项在使用Sub指令时,需要注意以下几点:1. 参数传递:在调用子程序时,需要传递参数。
需要注意参数的类型和数量,以确保子程序的正确执行。
2. 错误处理:在子程序中需要添加适当的错误处理机制,以避免出现异常情况。
3. 避免死循环:在子程序中需要合理控制循环次数,以避免出现死循环或资源占用过多的问题。
4. 避免重复操作:在子程序中需要避免对同一变量或设备进行重复操作,以避免对系统造成不必要的负担。
子程序调用指令

FNC2 SRET
FNC6 FEND
无
无
SRET 1步
FEND 1步
FEND指令表示主程序结束。END是指整个程序(包括主程序和子程序)结束。 一个完整的程序可以没有子程序,但一定要有主程序。 子程序编写在FEND指令的后面,以标号P开头,以返回指令SRET结束。 如果子程序调用条件满足,则中断主程序去执行子程序,标号是被调用子程序 的入口地址。在子程序结束处一定要使用返回指令SRET,意思是返回主程序中断处 去继续执行主程序的下一条指令语句。 在子程序中,使用定时器的范围是T192~T199。 如果在子程序中再调用其他子程序称为子程序嵌套,嵌套总数可达5级。 标号P63相当于END。 子程序调用指令CALL与跳转指令CJ不能使用相同的标号。
2.循环指令FOR、NEXT举例 【例题5.3】 求 0+1+2+3+…+100 的和,并将和存入D0。 【解】 用循环指令编写的程序如图5.32所示,D1作为循环增量。
图5.32 应用循环指令求和的程序
【例题5.4】 求 0+1+2+3+…+100 的和,并将和存入 D0。
图5.33 应用循环嵌套求和的程序
专题5 PLC功能指令的应用
5.1 用数据传送指令实现电动机的Y-△降压启动控制 5.2 用跳转指令实现选择运行程序段 5.3 算术运算指令与单按钮的功率控制 5.4 字逻辑运算指令及应用 5.5 子程序调用指令及应用 5.6 循环指令及应用 5.7 比较指令的应用与时钟控制程序 5.8 循环移位指令及应用 5.9 数码显示及应用
5.5 子程序调用指令及应用
图5.29 子程序调用与返回结构
5.5.1 子程序指令CALL、SRET与主程序结束指令FEND
汇编语言——子程序

M
【解】 (1)当计算机把CALL subp对应的机器指令取到CPU中 时,IP的值已经是CALL的下一行的MOV指令所在的偏移地 址5678H,此时还未进栈,栈的情况如图6.3(a)所示。 (2)由于子程序subp是NEAR类型,按照CALL指令功能 的第一种情况执行CALL指令,把IP的值入栈,并把IP的值改 为subp子程序的入口地址1234H,此时堆栈的情况如图6.3(b) 所示。 (3)执行完CALL指令 IP的值已经变成1234H,CS没变, CPU按新的IP值,在CS段下取出一条指令,即INC AL指令。
【例6.2】分析下面的程序段的执行过程,以及在执行过 程中堆栈及指令指针IP的变化情况,并假设在执行CALL指令 前,SP的值是0FEH。 subp PROC INC NEAR AL ;假设本指令所在的偏移地址是1234H
M
RET subp ENDP
M
CALL MOV 5678H subp AX,BX ;假设本指令所在的偏移地址是
M
子程序2 ENDP
M
子程序n PROC NEAR
M
子程序n ENDP 入口标号: M 段名 ENDS
从入口标号起的程序段是主程序。RET指令必须出现在子 程序中,而CALL指令可以出现在代码段的任何地方。主程序 可以调用子程序,一个子程序可以调用另一个子程序,还可 以调用它自身,并且在书写次序上没有“先定义后调用”的 限制。 源程序中的指令段在经过汇编程序的翻译后,所有伪指 令都不存在了。作为CALL指令的操作数,“子程序名”部分 会翻译成子程序第一条指令的逻辑地址。当计算机在执行 CALL 指令时,CS和IP已经是下一条指令的逻辑地址。CALL 指令具有保存当前IP或者CS和IP并修改它们的值的能力,因 此CALL执行完后,会按照新的CS及IP,转去执行子程序的第 一条指令,并依次执行后续指令,完成子程序的功能,直至 遇到RET指令。RET指令的执行效果是从栈中取出由CALL保 存的数据,恢复在执行CALL指令时的IP或者CS与IP值,从而 回到CALL指令的下一行继续执行。
PLC梯形图的子程序指令和子程序调用指令

PLC 梯形图的子程序指令和子程序调用指令摘要: 子程序将大量的控制任务分离成许多小块的控制任务,并可以重复执行一组指令,当主程序调用一个子程序时,控制就转到子程序,执行子程序中的指令。
当子程序执行完后,再返回主程序继续执行。
有些子程序可以通过中断或...子程序将大量的控制任务分离成许多小块的控制任务,并可以重复执行一组指令,当主程序调用一个子程序时,控制就转到子程序,执行子程序中的指令。
当子程序执行完后,再返回主程序继续执行。
有些子程序可以通过中断或MCR0(99)指令启动。
中断同子程序调用类似,在主程序运行的流程中,中断引起主程序运行停顿,执行中断子程序,子程序执行完毕后,再返回中断点继续执行主程序,中断可以由外部中断源(如中断输入单元的输入信号)引起,也可以由内部的中断源(定时中断)引起。
INT(89)用于控制从中断输入单元接收到的中断信号和控制中断的安排,INT(89)提供中断屏蔽(记忆中断但不响应)和中断清除功能。
宏指令是一个独立的子程序,该子程序可以改变操作数,从而相当于多个结构相同但数据不同的子程序。
子程序调用指令梯形图符号如下所示。
操作数数据区域N:子程序编号00~255子程序编号00~15 与中断一起使用,子程序编号99 用于定时中断。
说明:在主程序中将SBS(91)指令放在要执行的子程序处,当主程序执行到此处,子程序就被执行。
SBS( 91)中的子程序编号是要调用的子程序编号。
当SBS(91)指令的执行条件为“ON”时,plc 执行和SBS(91)指令中编号N 相同的SBN(92)指令和RET(93)之间的子程序;当执行到RET(93)指令时,程序从子程序返回主程序。
SBS(91)在程序中可被多次调用,而且SBS( 91)也可以用作子程序中形成子程序嵌套,嵌套的级数没有限制。
使用中注意子程序的执行时间不能超过10ms,否则会出现错误。
S7-200 跳转和子程序调用指令

例4:
某生产线对产品进行加工处理,同时利用增 减计数器对成品进行累计,每当检测到10个成 品时,就要跳过某些控制程序,直接进入小包 装控制程序。每当检测到40个成品(4个小包 装),直接进入到大包装控制程序。
子程序调用指令
子程序调用指令
SBR_0 EN
CALL SBR _N
条件返回指令 ( RET ) CRET
CALL以指令盒的 形式表示; CRET以线圈的 形式表示。
子程序可以用 SBR_N的格式表示
子程序调用指令(SBR)
CALL SBR0//子程序调用 CRET//条件返回 RET//无条件返回(自动)
2 ( JMP )
手动程序 2
LBL
工作方式选 择开关
当I0.4接通时,JMP1 接通,跳转到LBL1,顺 序扫描手动程序。
当I0.4断开时,JMP1 未接通,不跳转,顺序 扫描自动程序,且 JMP2接通,跳转到LBL2, 不再执行手动程序。
子程序调用指令(SBR)
通常将具有特定功能、并且要多次 使用的程序段作为子程序子程序可以 多次被调用,也可以嵌套(最多8层) ,还可以递归调用(自己调自己)。
返回本节
带参数子程序调用指令格式举例
只能显示STL LD I0.0 CALL SBR0 I0.1 VB10 I1.0 &VB100 *AC1 VD200 可以在LAD和FBD中正确显示 LD I0.0 = L60.0 LD I0.1 = L63.7 LD L60.0 CALL SBR0, L63.7, VB10, I1.0, &VB100, *AC1, VD200
子程序调用指令

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

数控车床m99指令的用法数控车床M99(也称为子程序调用指令)是数控加工中非常常用的一种G代码指令,通过它可以实现编写一次通用指令,然后在多个程序中反复调用,从而简化编程流程,提高工作效率。
M99指令的语法格式如下:M99 PnPn代表子程序的编号,n表示0~999之间的数字。
Pn必须与子程序的O代码编号完全相同,否则系统将无法识别该子程序。
M99指令的使用方法:1.需要编写一个通用子程序,也就是一个待调用的代码段。
比如:O1010G00 X20 Z20G01 Z-10 F0.2G01 X-20 F0.2G00 Z20M99注:该程序是一个简单的车削程序,指令中含义如下:G00 X20 Z20:快速定位到(20,20)坐标点。
G01 Z-10 F0.2:切入,Z轴向下移动10mm,切削深度10mm。
G01 X-20 F0.2:工件长度方向顺序削除,X轴向左移动20mm。
G00 Z20:补偿切入的深度,Z轴向上移动10mm。
M99:子程序结束,返回主程序。
2.在主程序中调用子程序。
想要在主程序中调用编号为1010的子程序,可以在主程序中插入下列代码:O1000G00 X-50 Z-30M98 P1010G00 X50 Z30M30注:该程序是一个简单的主程序,指令中含义如下:G00 X-50 Z-30:快速移动到(-50,-30)坐标点。
M98 P1010:调用编号为1010的子程序。
G00 X50 Z30:从子程序返回后,快速移动到(50,30)坐标点。
M30:程序结束。
总结:通过M99指令的使用,我们可以减少编写类似代码的繁琐。
通过编写一个通用子程序,可以在多个程序中反复调用,从而简化编程流程,提高工作效率。
M99指令的使用不仅可以提高工作效率,还可以帮助我们规范化程序设计,增强程序的可读性和可维护性。
下面我们来详细讲解一下M99指令的使用方法和注意事项。
1.编写通用子程序在编写通用子程序时,需要考虑代码的复杂度和可读性。
子程序调用指令【精选】

子程序存储在存储器中,可供一个或多个调用程序(主程序)反复调用。
主程序调用子程序时使用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指令执行的操作可以看出,第一步是把子程序返回调用程序的地址保存在堆栈中。
m98调用子程序的格式

m98调用子程序的格式
在CNC(计算机数控)编程中,M98是一种常用的调用子程序的G代码指令。
子程序是一系列G代码指令的集合,它可以被主程序多次调用,以减少代码的重复编写,提高编程效率。
M98指令的基本格式如下:
其中:
M98 是调用子程序的指令。
Pxxxx 指定子程序的编号。
xxxx 是子程序的标识号,具体格式和位数取决于机床的控制系统。
例如,P9010可能代表子程序号为9010。
Lyy (可选参数)指定子程序的重复执行次数。
yy 是一个整数,表示子程序需要重复执行的次数。
如果省略此参数,子程序默认执行一次。
子程序本身应该以Oxxxx开头,其中xxxx与调用时的Pxxxx相对应。
子程序的结尾通常使用M99指令来标示。
例如:
主程序中调用子程序:
在这个例子中,子程序O9010将被主程序调用并执行10次。
请注意,不同的CNC控制系统可能在M98指令的具体使用上有所不同,因此在使用时应参考相关机床和控制系统的文档或手册。
子程序的调用和返回指令子程序举例

编写⼀个⼦程序UPPER,实现把寄存器AL中存放的字符变⼤写。
解:
;⼦程序功能:把AL中存放的字符变⼤写
;⼊⼝参数:AL
;出⼝参数:AL
;算法描述:判断AL中字符必须在’a’~’z’之间才能把该字符变为⼤写
UPPERPROC
CMPAL, ’a’;书写’a’的ASCII码61H也可以
JBover
CMPAL, ’z’
JA over
SUBAL, 20H;书写指令AND AL, 0DFH也可以
over:RET
UPPERENDP
例7.2 编写⼀个求字符串长度的⼦程序StrLen,该字符串以0为结束标志,其⾸地址存放在DS:DX,其长度保存在CX中返回。
解:
;⼦程序功能:求字符串的长度
;⼊⼝参数:DS:DX存放字符串的⾸地址,该字符串以0为结束标志
;出⼝参数:CX存放该字符串的长度
;算法描述:⽤BX来指针来扫描字符串中的字符,如果遇到其结束标志,则停⽌扫描字符串操作
StrLenPROC
PUSHAX
PUSHBX;⽤堆栈来保存⼦程序所⽤到的寄存器内容
XORCX, CX
XORAL, AL
MOVBX, DX
again:CMP[BX], AL
JZover
INCCX;增加字符串的长度
INCBX;访问字符串的指针向后移
JMPagain
over:POPBX;恢复在⼦程序开始时所保存的寄存器内容
POPAX
RET
StrLenENDP。
数控车床子程序M98、M99编程

数控车床子程序M98 【2 】.M99编程把程序中某些固定次序和反复消失的程序单独抽出来,按必定格局编成一个程序供挪用,这个程序就是常说的子程序,如许可以简化主程序的编制.子程序可以被主程序挪用,同时子程序也可以挪用另一个子程序.如许可以简化程序的编制和节俭CNC体系的内存空间.子程序必须有一程序号码,且以M99作为子程序的停止指令.主进程挪用子程序的指令格局如下:M98 P___L___;个中P为被挪用的子程序号L为反复挪用的次数例如:M98 P1234L4主程序挪用统一子程序履行加工,最多可履行999次,且子程序亦可再挪用另一子程序履行加工,最多可挪用4层子程序(不同的体系其履行的次数及层次可能不同).例:以HNC-21T体系子程序指令,加工图2-11工件上的四个槽.分离编制主程序和子程序如下:
主程序%123;M3 S600 G95 T0101;G00 X82.0 Z0;M98 P1234 L4;(挪用于程序1234履行四次,切削四个凹槽)X150.0 Z200.0;M30;子程序%1234;W-20.0;G01 X74.0 F0.08;G00 X82.0;M99;M99指令也可用于主程序最后程序段,此时程序履行指针会跳回主程序的第一程序段持续履行此程序,所以此程序将一向反复履行,除非按下RESET键才能中止履行.
第1页,-共1页。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
子程序调用
MCRO 指令参数区域
子程序编号 0001
输入
SBN~RET 间的子程 序程序执行处理
子
程
(同等)
序
指
令
子程序回送
输出
MCRO 指令 返数区域
同样按照 200~203CH→A600~A603CH、A604~ A607CH→400~403CH 传送
仅地址 不同
3-454
子程序指令
3-193 子程序进入 SBN(092)ʗ子程序回送 RET(093)
页码 3-448 3-452 3-455
3-457 3-462
3-447
子程序指令
3-191 子程序调用 SBS(091)
概要
输ೖ入ྗ0O/N
3-191
子程序调用 SBS(091)
调用指定编号的子程序,执行程序。
3
各 符号
指
令
4#4
说
/
N/:ɿ子α程ϒ序ϧ编ʔ号νϯ൪߸
明
4#4 O 常௨规ৗϓ程ϩ序άϥϜ %
常数
数据和 D 所指定的返数数据,可以进行与子程序区域程 序的数据传递。 由此,可以作为仅改变 1 个子程序区域程序的地址的多
数据寄存器 变址寄存器(直接) 变址寄存器(间接)
子
个回路分开使用。
程
将 S~S+3 CH 的数据复制到 A600~A603 CH(MCRO
序 指
指令用参数区域),调用指定编号的子程序。将 A600~
带参数的子程序调用。
3
各 符号
指
令
.$30
说
/
N/:ɿ子α程ϒ序ϧ编ʔ号νϯ൪߸
明
4
S4:ɿ参Ҿ数数σ据ʔ低λ位ԼCҐH 编$)号൪߸
%
D%:ɿ回ฦ信数σ据ʔ低λ位ԼCҐH 编$)号൪߸
执行条件/每次刷新指定
执行条件
ON 时每周期执行 上升沿1周期执行 下降沿1周期执行 每次刷新指定
④
再
子程序 1
次
执
行
子
程
序
ɾ 相反,执行子程序内的微分指令(DIFU、DIFD 指令),
指
在该输出为 ON 的状态下,下一次开始不调用同一子
令
程序的情况下,微分指令(DIFU、DIFD 指令)的输
出保持 ON,而不发生 OFF,请注意。
ɾ 在下述示例中,0.00 为 ON 时执行子程序 0001,0.01
执行顺序
0.00 为 ON 时,执行子程序编号 1 的子程序程序, 0.01 为 ON 时,执行子程序编号 2 的子程序程序后,返回 SBS2 指令的下一指令。执行 SBN2 的前一指令后,返回 SBS1 的下一 指令。执行 SBN1 的前一指令后结束。
执行顺序
3-450
动作说明
(例)
常规程序 区域
定义时为 ON ɾ除此之外为 OFF
在子程序内使用输出微分型指令(DIFU、DIFD、带动
作选项@、%指令)时,请注意以下事项。
3
ɾ 在同一周期内,多次执行同一子程序时,子程序内的
各
输出微分型指令(DIFU、DIFD、带动作选项@、% 指令)动作不固定,请注意。
指 令 说
ɾ 在下述示例中,输出继电器 0.00 为 ON 时执行子程
由 OFF 转成 ON 时,DIFU 指令使 100.00 转成 ON。
如果在之后的周期中,0.00 保持 OFF 不变,子程序
0001 不执行时,DIFU 指令的输出 100.00 保持 ON
状态。
下 1 周期之后 不执行子程序
3-449
子程序指令
子程序调用 SBS(091)
动作说明
3
有两个子程序调用指令时
3-452
子程序指令
宏 MCRO(099)
状态标志的动作
名称 出错标志
标签 ER
内容
ɾ嵌套数超过 16 层时为 ON ɾ不存在指定目的地的子程序时为 ON ɾ从自子程序中调用自子程序时为 ON ɾ调用执行中的子程序时为 ON ɾ 指定目的地的子程序没有在自任务内加以
定义时为 ON ɾ除此之外为 OFF
ೖ输ྗ入0/ON
4#4
3&5 4#/
N
#
嵌ωε套ς2Ο层ϯ时ά ஈͷ߹
子αϒ程ϧ序ʔ程νϯ序
#
mϓϩάϥϜ
N
O
常௨ৗ规ϓ程ϩ序άϥϜ
#
子
#
程
序
指
4#/
令
O
子αϒ程ϧ序ʔνϯ (ϓϩSBάNϥ~ϜRET)
"
"
ʢ4#/ʙ3&5ʣ
3&5 &/%
程ϓ序ϩ结ά束ϥϜऴྃ
执行条件/每次刷新指定
参考
相同动作模式ɾ 结构下,存在仅地址不同的多个回路时,
如果使用该 MCRO(宏)指令,可以将这些多个回路汇 3
总到多个 MCRO 指令和 1 个回路。该宏指令是子程序
各
的一种。在执行 MCRO(宏)指令时,将子程序编号所 指定的子程序变更为指定的输入输出编号后执行。
但是,能够通过 MCRO(宏)指令汇总的回路必须为仅
中断任务程 序区域
可以
数据内容
ྫʣ
4#/
4#4
3&5
ʙ ʙ ʙ ʙ
ʙ
4#/
4#4
3&5
4#/
3&5
区域 CIO(输入输出继电器等)
内部辅助继电器 保持继电器 特殊辅助继电器 定时器 计数器 数据存储器 DM 间接(BIN) DM 间接(BCD) 常数 数据寄存器 变址寄存器(直接) 变址寄存器(间接)
使用限制
区域
块程序 区域
使用
可以
工序步进 程序区域
可以
子程序区域 可以
MCRO @MCRO
无 无
中断任务 程序区域
可以
操作数说明
数据内容
N:0~255(10 进制)
区域
N
S
D
CIO(输入输出继电器等)
-
0000~6140
组合使用指令
内部辅助继电器
-
W000~508
SBN(子程序进入)指令以及 RET(子程序回送)指令
令
A603 CH 的数据作为输出数据,执行将 A604~A607
- - - 0~255 (10 进制)
ʵ
D00000~32764 @D00000~32767 *D00000~32767
ʵ
ʕ ʕ
,IR0~15 -2048~+2047,IR0~15
DR0~15,IR0~15 ,IR0~15+(++)
无
各
指
使用限制
令
区域 块程序 区域
工序步进 程序区域
子程序区域 中断任务 程序区域
说 明
SBN 不可以
不可以
不可以
可以
RET 不可以
不可以
可以
可以
操作数说明
N:0~255(10 进制)
组合使用指令
ɾ RET(子程序回送)指令 ɾ SBS(子程序调用)指令或 MCRO(宏)指令
功能说明
显示子程序区域的开始。 最初的 SBN 指令以后为子程序区域,子程序区域只能通 过 SBS 指令或 MCRO 指令执行。
必须在同一任务内。如果不在同一任务内,会发生错误,
ER 标志为 ON。
ɾ 即使执行子程序指令,在下列情况下,ER 标志为 ON, 实际上不进行调用。
1)指定目的地的子程序未在自任务内加以定义。
2)从自子程序中调用自子程序时
3)子程序的嵌套超过 16 层时 4)指定子程序在执行过程中时 ɾ 通过 IL-ILC 指令进行互锁的过程中,SBS 指令进入 NOP 处理。
注:
ɾ 在通过 MCRO 指令调用的子程序中,必须在输出地址中
使用参数区域(A600~A603 CH)的 4 CH 数据(通道、
位等),在输出地址中使用返数区域(A604~A607 CH)
子
的 4CH 数据(通道、位等)。该 4 CH 以上的数据不能 传递,请注意。
程 序 指
ɾ MCRO 指令可以嵌套。但是,参数区域(A600~A603
N ʕ
ʕ ʕ ʕ ʕ ʕ ʕ ʕ ʕ 0~255(10 进制) ʕ ʕ ʕ
3-448
子程序指令
子程序调用 SBS(091)
状态标志的动作
请注意
名称 出错标志
注:
标签 ER
内容
ɾ嵌套数超过 16 层时为 ON ɾ不存在指定目的地的子程序时为 ON ɾ从自子程序中调用自子程序时为 ON ɾ调用执行中的子程序时为 ON ɾ 指定目的地的子程序没有在自任务内加以
SBN 指令
3-193
子程序进入 SBN(092)/子程序回送 RET(093)
概要
显示指定编号的子程序开始。 在 RET 指令和设置中使用,定义子程序区域。
符号
4#/ /
N/:ɿ子αϒ程ϧ序ʔ编ν号ϯ൪߸
执行条件/每次刷新指定
执行条件 常时 ON 输出每周期执行
SBN RET
3
每次刷新指定
无
明
序 0001,输出继电器 0.01 由 OFF 转成 ON 时,DIFU
指令使 100.00 转成 ON。但是,在同一周期内输出继
ɾ 可以多次调用同一子程序。
电器 0.01 为 ON 时,由于再次执行子程序 0001,本
ɾ 该子程序调用(SBS)指令和子程序进入(SBN)指令
次不检测 DIFU 指令的 0.01 上升,100.00 转成 OFF。