本使用手册及样例包目录内所包含文档、PLC程序、机床可执行程序(MPF、SPF、…)、电气图,可能与用户实际使用不同,用户可能需要先对例子程序做修改和调整,才能将其用于测试。本例程的作者和拥有者对于该例程的功能性和兼容性不负任何责任,使用该例程的风险完全由用户自行承担。由于它是免费的,所以不提供任何担保,错误纠正和热线支持,用户不必为此联系中国东方数控有限公司技术支持与服务部门。
对于在使用中发生的人员、财产损失本公司不承担任何责任,由使用者自行承担风险。
以上声明内容的最终解释权归中国东方数控有限公司所有,后续内容更新不做另行通知。
在Sinumerik中,借助带参数子程序以及RunMyscreen界面开发功能可以很方便地开发出像西门子标准循环一样的用户循环功能,从而可以在齿轮机床或桁架等应用场景中,帮助用户实现循环封装,极大方便了用户使用,带来了很好的使用效果。
同时西门子还提供循环加密保护功能,即“Lock MyCycles”功能,该功能是选项功能(订货号:6FC5800-0AP54-0YB0 ),用户开发完自己的用户循环并配合使用“Lock MyCycles”锁循环功能后可以很好的保护自己的知识产权。
• V4.7+SP02
5.1.1带参数子程序的基本概念
1.形式参数
在定义子程序时必须定义需要传递给子程序的参数(即形式参数)的类型和名称,形式参数由此定义了子程序的接口。
举例:
proc sub_prog1(real x_pos, real y_pos) ;形式参数: x_pos 和 y_pos,都是 real 型
N20 x1=x_pos y1=y_pos ;将轴 x1 运行到位置 x_pos 上;轴 y1 运行到位置 y_pos 上
...
N100 ret
2.实际参数
在调用子程序时,必须将绝对值或变量,即实际参数传递给子程序,在调用时,实际参数由此为子程序接口填充实际值。
举例:
N10 def real breite ; 变量定义
N20 breite=20.0 ;变量赋值
N30 sub_prog1(5.5, breite) ;子程序调用,带实际参数: 5.5 和 breite
...
N100 m30
3.参数传递
通过关键字PROC,建立所有子程序需要的参数,进而定义一个带参数传递的子程序。
在调用子程序时,不需要总是显式传递所有在子程序接口中定义的参数,如果省略了一个参数,会传递缺省值“0”给该参数,但为了明确区分参数的顺序,必须始终用逗号隔开参数,最后一个参数后面不需要逗号。
如果在调用时略去该参数,最后一个逗号也可以省略。
举例:
子程序
proc sub_prog2(real x, real y, real z) ;形式参数: x, y 和 z
...
N100 ret
主程序
proc main_prog2
...
N30 sub_prog2(1.0,2.0,3.0) ;子程序调用,带完整的参数传递:
x=1.0, y=2.0, z=3.0
…
N100 m30
其中N30行还可以这样写:
N30 sub_prog2( ,2.0,3.0) ; x=0.0, y=2.0, z=3.0
N30 sub_prog2(1.0, ,3.0) ; x=1.0, y=0.0, z=3.0
N30 sub_prog2(1.0,2.0) ; x=1.0, y=2.0, z=0.0
N30 sub_prog2( , ,3.0) ; x=0.0, Yy=0.0, z=3.0
N30 sub_prog2( , , ) ; x=0.0, y=0.0, z=0.0
4.检查传递参数
借助系统变量“$P_SUBPAR [ n ]”(其中n = 1, 2, ...)可以检查子程序中是否显式传递或省略了某个参数。索引 n 指形式参数的顺序,索引 n = 1 表示第 1 个形式参数;索引 n = 2表示第 2 个形式参数,依此类推。下面的程序段落举例说明了如何检查第 1 个形式参数。
举例
proc sub_prog2(real x,real y,real z) ;形式参数: x, y 和 z
N20 IF $P_SUBPAR[1]==true ;检查第 1 个形式参数 X。
... ;如果显式传递了形式参数 X,执行此动作。
N40 else
... ;如果没有显式传递形式参数 X,执行此动作。
N60 endif
... ;通用动作
N100 ret
5.1.2带参数子程序的定义
1.句法:
PROC <程序名称> (<参数类型> <参数名称>=<初始化值>, ...)
2.含义:
PROC: | 程序开头的定义指令 |
<程序名称>: | 程序的名称 |
<参数类型>: | 参数的数据类型,如 REAL, INT, BOOL |
<参数名称>: | 参数名称 |
<初始化值>: | 用于参数初始化的最优值(可选) 若在调用子程序时未设定参数,则会向参数分配初始值。 |
举例
主程序
main_prog3.mpf:
extern sub_prog3(real,real,real)
g0 x10 y10 z10
sub_prog3(,,20)
m02
子程序
sub_prog3.spf:
proc sub_prog3(real xpos=30, real ypos, real zpos) displof
g0 x=xpos y=ypos z=zpos
M17
主程序调用子程序时,前两个参数未赋值,执行结果是
注意子程序的第一句:proc sub_prog3(real xpos=30, real ypos, real zpos) displof
这里给xpos这个参数定义了一个默认值30,若主程序不赋值,子程序里xpos的值是30;若主程序赋值,则子程序的xpos的值就是主程序给的参数值。
3.其它相关定义语法
带参数的子程序必须用 extern 在主程序中声明。子程序中以 proc 开头定义子程序的形参数据类型,在proc后还可以通过下面语句定义其它一些相关属性:
(1) SAVE: 进入子程序时保存现场(如生效的G代码),子程序执行完后,再恢复现场
(2) SBLOF/SBLON: 进入子程序后,禁止/允许单段
(3) DISPLOF/DISPLON: 禁止/允许显示子程序程序段
(4) DISPLOF ACTBLOCNO:禁止显示子程序程序段时,若程序出错会显示出错程序段号
举例:
PROC sub_prog4 (real x_pos, real y_pos) SAVE DISPLOF ACTBLOCNO
5.1.3带参数子程序的调用
在带参数传递的子程序调用时,可以直接传递变量或数值,但必须在调用之前在主程序中使用EXTERN 声明带参数传递的子程序。
1.句法:
EXTERN <程序名称>(<类型_参数1>,<类型_参数2>,<类型_参数3>)
...
<程序名称>(<数值_参数1>,<数值_参数2>,<数值_参数3>)
2.含义:
<程序名称>: | 子程序名称 |
EXTERN: | 关键字,用于带有参数传递的子程序声明 提示: 必须仅当子程序在工件中或者在全局子程序目录中时,才可指定EXTERN。 循环不必声明为 EXTERN |
<类型_参数1>,<类型_参数2>,<类型_参数3>: | 传递序列中要传递的参数变量类型 |
<数值_参数1>,<数值_参数2>,<数值_参数3>: | 要传递的参数变量值 |
3.子程序调用顺序
Sinumerik有许多放程序的地方,有主程序目录、子程序目录、零件程序目录、制造商循环目录、用户循环目录等内存储器下的目录,当使用U盘等外部存储器时又会有对应目录。
如果在不同目录下创建了同名程序,那么在程序调用时系统会执行哪一个呢?
《SINUMERIK 840D sl/ 828D 编程手册_工作准备部分》给出的示例顺序如下:
1 | 当前目录/name | 当前目录下的程序 |
2 | 当前目录/name_SPF | 当前目录下后缀名是SPF的程序 |
3 | 当前目录/name_MPF | 当前目录下后缀名是MPF的程序 |
4 | //NC:/_N_SPF_DIR / name_SPF | 子程序目录下后缀名是SPF的程序 |
5 | /_N_WKS_DIR/_N_MYWPD_WPD/name_SPF | 通过CALLPATH指定的目录下的程序 |
6 | /_N_CUS_DIR/name_SPF | 用户循环目录下后缀名是SPF的程序 |
7 | /_N_CMA_DIR/name_SPF | 制造商循环目录下后缀名是SPF的程序 |
8 | /_N_CST_DIR/name_SPF | 标准循环目录下后缀名是SPF的程序 |
注意:
基于以上系统调用子程序时的查找顺序,要求用户在编写子程序时,不要和机床厂编写的循环重名!或者说作为系统商或机床厂编写循环时,名字要“特殊”些,就可以避免因名字相同而导致系统优先执行了位于优先级靠前的目录下的同名程序,从而造成麻烦。
5.2.1循环
机床制造商可以编写子程序实现机床的某一功能,或者机床用户可以编写子程序实现某一特定加工,我们把这种经常重复利用的、有特定目的的子程序,称之为“循环”。
循环有专门的存放目录,如下图所示,其中:
“标准循环”目录存放的是西门子的标准车削、铣削等工艺循环
“制造商循环”目录存放的是机床厂为这台机床编写的循环,比如换刀循环
“用户循环”目录应该是机床用户自己编写的一些循环
如要找到循环的目录,查看循环,首先要有对应的系统口令,如果有权限,进入“调试”区域,按“系统数据”软键,用光标键找到“NC数据”目录,回车,选择“循环”目录。如下图所示:
5.2.2 带参数传递的用户循环
将带参数的子程序拷贝到“制造商循环”或“用户循环”目录下,当有程序调用该循环时,系统即会执行。比如建立如下形参子程序sub_prog4.spf及主程序main_prog4.mpf
主程序:main_prog4.mpf ;(位置:_N_MPF_DIR)
extern sub_prog4(real,real)
g0 x0 y0
sub_prog4(100,200)
M30
子程序:sub_prog4.spf (位置:_N_SPF_DIR)
proc sub_prog4(real x_pos, real y_pos)
g01 X=x_pos Y0 F5000
X=x_pos Y=y_pos
X0 Y=y_pos
X0 Y0
M17
执行main_prog4.mpf启动后,分别如下图所示
这里注意,sub_prog4.spf的位置在_N_SPF_DIR,主程序的开头需要执行“extern sub_prog4(real,real)”语句才可以调用带形参的子程序sub_prog4.spf
下面我们将sub_prog4.spf剪切到用户循环中,并新建mymain.mpf,内容如下:
mymain.mpf
sub_prog4(90,90)
M02
这里去掉了extern开头定义行的语句,因为调用循环不需要extern指令,执行“mymain.mpf”,并启动后出现如下报警
注意:出现这个报警的原因是因为把子程序拷贝到循环目录下,要重新启动系统,系统才认这个循环。
我们重启启动后,再次执行循环启动后,如下图所示
在实际应用中,用户循环一般用在齿轮加工或者桁架机械手等专用机床或专用功能等场景中,而且往往需要用户自定义界面来配合循环参数的填写,然后自动生成用户循环。
SINUMERIK Operater 中的RunMyScreen界面开发功能提供了生成代码(GC)功能及输出加工程序变量(OUTPUT)的方法,当调用功能“GC” 时,运行“OUTPUT”方法,供用户进行自定义循环的开发使用。
1. OUTPUT(输出加工程序名称及变量)
句法 | OUTPUT(名称) ... END_OUTPUT |
说明 | 输出 NC 程序中的变量 (1)输出数值变量:使用1个双引号 (2)输出字符串变量:使用3个双引号 |
示例 | OUTPUT(NC1,1) "cyc("VARA1","VARA2","""VARA3""")" END_OUTPUT |
2. GC(生成NC代码)
句法 | GC("名称"[,"目标文件"][,Opt],[Append]) ;功能 GC 仅在 NC 中可用。请使用功能 CP 或 MP 来移动文件 ;Opt:0=带反编译注释;1=无反编译注释 ;Append:0=删除旧内容,1=在开始处写入,2=在结束处写入 |
说明 | 生成NC代码 |
示例 | GC("CODE1","\MPF.DIR\MESSEN.MPF") GC("CODE1") GC("CODE1","\MPF.DIR\MESSEN.MPF",0,0) GC("CODE1","\MPF.DIR\MESSEN.MPF",1,1) |
例1:在CUSTOM用户界面设计用户循环参数界面,然后生成主程序文件“**.mpf”,并输出到指定路径文件夹下
(1) 编写界面程序如下,生成主程序MAIN1.MPF,存储在_N_MPF.DIR中,同时设计子程序名为“CUSCYCLE”
//M{Mask1,hd="方法:OUTPUT + GC"}
DEF VARA1={TYP="R3",st="_AA1",TXT_x=50,TXT_w=60,x=130,w=80,bc_st="#00ff7f",bc="#EEEE00",VAL="0.0",}
DEF VARA2={TYP="R3",st="_AA2",TXT_x=50,TXT_w=60,x=130,w=80,bc_st="#00ff7f",bc="#EEEE00",VAL="0.0",}
VS2=("NC输出")
VS8=(SOFTKEY_NAV_BACK)
OUTPUT(MAIN1,1)
"CUSCYCLE("VARA1","VARA2")"
"m30"
END_OUTPUT
PRESS(VS1)
GC("MAIN1","\MPF.DIR\MAIN1.MPF")
END_PRESS
PRESS(VS8)
EXIT
END_PRESS
//END
如下图所示,按下“NC输出”后,如右图所示生成“MAIN1.MPF”主程序
(2) 编写带参数的子程序CUSCYCLE.SPF,并存储在_N_SPF.DIR路径下
CUSCYCLE.SPF
proc cuscycle(real x_pos, real y_pos)
g01 X=x_pos Y0 F5000
X=x_pos Y=y_pos
X0 Y=y_pos
X0 Y0
M17
(3) 执行MAIN1.MPF
如下图所示:用户子程序调用成功
(4) 将cuscycle.spf拷贝到“系统数据”——“循环”——“用户循环”中,并重启系统后,再次执行主程序MAIN1.MPF,效果如下,用户循环创建成功。
例2:某机床设计桁架电机X,Z轴,要求设计像西门子标准循环那样,在程序编辑界面,设计用户循环登入
按键,填入参数后按“确认”生成一行程序段。
具体设计要素如下:1.分别设计X、Z轴定位位置、定位速度
2.定位模式选择 POS,POSA,并在循环中设计参数配合界面选择POS或POSA运行模式
3.定位轴选择X/Z,并且要求选择X的时候不显示Z轴相关参数,选择Z的时候不
显示X轴相关参数
4.设计显示当前机床坐标值显示
(1)在easyscreen.ini初始化文件中设计用户循环登入按键在程序编辑画面,如下所示:
[STARTFILES]
StartFile01=area:=AreaProgramEdit, dialog:=SlProgramEdit,menu:=SlStepStdMillMenuHU,startfile:=aeditor.com
LngFile01 :=almc.txt
(2)设计界面程序 aeditor.com,如下所示
界面显示效果如下
(3)在用户循环中设计带参数子程序CYCLE123.SPF,内容如下,以及右图所示
CYCLE123.SPF
proc cycle123(int select_pos,int select_axis,real xpos,real spex,real zpos,real spez)
if select_pos==0
POS[X]=xpos FA[X]=spex
POS[Z]=zpos FA[Z]=spez
else
POSA[X]=xpos FA[X]=spex
POSA[Z]=zpos FA[Z]=spez
endif
M17
(4)执行主程序测试
打开MAIN1.MPF,选择“桁架设定”按键进入用户循环画面后,选择POS后并设定参数后执行MAIN1.MPF,如下图
打开MAIN1.MPF,选择“桁架设定”按键进入用户循环画面后,选择POSA后并设定参数后执行MAIN1.MPF,如下图
1.《SINUMERIK 840D sl/828D编程手册_工作准备部分》08/2018
3.《828D_840Dsl_手册_RunMyscreen应用手册》成飞 10/2019
4.《828D_840Dsl_工具_RunMyscreens_例程合集》成飞 06/2019
5. 微信公众号“mysinumerik”系列文章《子程序调用》刘同 02/2021
ZhuYuanji
2022.9.9
版本 | 日期 | 修改内容 |
V1.0 | 2022.9.9 |