本手册及样例包均为免费提供,仅供参考。所述版本、应用及案例可能与用户实际应用不符,请用户在使用前认真阅读相关使用说明,根据自身的应用环境及机床特点进行调整,并进行严格的测试,以规避可能存在的风险。对于在使用中发生的人员、财产等损失,由用户自行承担。
以上声明内容的最终解释权归西门子(中国)有限公司所有,后续内容更新恕不做另行通知。
该功能利用交互式编程指令MMC,在零件程序中,调用预先编辑好的界面脚本文件,实现通过执行零件程序,修改驱动数据的目的,在实际使用中,需预先将需要修改的驱动数据作为脚本代码编辑好,且修改赋值等需要修改对应的脚本代码,因此,此功能使用并不灵活,适用于固定逻辑修改驱动数据的场合。
硬件 | ||||
工艺 | PPU24x/NCU710 | PPU26x/NCU720 | PPU28x/NCU730 | PPU28x.Advance |
车床 | ● | ● | ● | ● |
铣床 | ● | ● | ● | ● |
磨床 | ● | ● | - | ● |
• 程序调用脚本修改驱动数据,无选项要求
MMC指令调用交互界面修改驱动数据,可使用Easy xml或Run Myscreens语言编辑脚本,本文将介绍使用Easy xml的方法。
在窗体文件中将需要修改的参数按预定的方式、算法赋值给驱动数据的代码编辑好,然后在零件程序代码中,借助MMC指令(交互式调用),调用的对应的窗体菜单,窗体在加载时即可完成驱动数据的修改,并保存驱动数据的操作。
首先,需要根据实际的需求,规划修改驱动数据的零件程序,及驱动数据的修改需求,例如:
界面脚本的格式同Easy XML相同,首先创建一个test.xml文件,名称推荐为不包含特殊字符的英文文件名,代码如下:
<DialogGui >
<!-- *************** 定义全局变量 *************** -->
<let name="drv_x" />
.......
<!-- *************** 定义菜单 *************** -->
<menu name = "func1">
.......
.......
</DialogGui>
每一个在零件程序中调用的MMC指令,可对应一组菜单定义,如实现功能相同可以重复调用,可使用R变量、GUD变量等作为参数传递。修改驱动数据的操作,定义在窗体的<init></init>间,即在窗体初始化时完成修改操作,举例说明如下:
在零件程序中完成脚本的调用,使用MMC指令实现。
MMC:交互式调用零件程序 (MMC) 窗口,通过预定义的子程序 MMC(...),可在操作界面上,如 SINUMERIK Operate,显示来源于数控程序的用户专用对话框。
MMC句法:MMC("<ADDRESS>,<COMMAND>,<FILE>,<DIALOG>","<QUIT>")
为实现调用章节5.3的xml文件定义的功能,在零件程序内执行MMC指令,例如:
执行程序后,执行N30指令时,将会触发调用界面文件test.xml的脚本菜单func1,并执行func1内定义的代码;
执行N200指令时,将会触发调用界面文件test.xml的脚本菜单func2,并执行func2内定义的代码。
在程序执行中,即可完成驱动数据修改、驱动数据保存的操作。
将界面脚本的xml文件,拷贝至OEM\sinumerik\hmi\appl\,执行MPF程序,即可实现设定功能。
本章节将以一个实际的应用 — 执行预定零件程序MPF,即可自动完成双向齿槽力矩补偿设定,进一步展示此功能。开发此应用的目的是,在大批量生产过程中,如需要使用齿槽力矩补偿功能,批量调试此功能,将会增加现场调试的难度,及整机的调试周期,再次情况下,使用此应用,在具有选项并激活补偿轴功能模块的情况下,只需运行学习程序MPF,即可完成设定轴的齿槽力矩补偿,无需值守操作。
在程序头,定义变量如下:
N1 DEF AXIS _AXVAR1 = X ;X轴,不做只需删除X,空变量不执行该轴
N2 DEF AXIS _AXVAR2 = Y ;Y轴,不做只需删除Y,空变量不执行该轴
N3 DEF AXIS _AXVAR3 = Z ;Z轴,不做只需删除Z,空变量不执行该轴
N4 DEF INT _num = 7 ;补偿圈数定义,即5254[0]均值,建议5~8
N5 DEF REAL _LS_min, _Feed= 0.6 ;速度定义,螺距的百分比定义速度,建议0.4~0.8
运行前可根据需要对变量进行编辑
;****轴的组合包括:XYZ,XY,X,Y,Z,五种组合方式选择
N6 G290
N7 IF ((_AXVAR1==X) AND (_AXVAR2==Y) AND (_AXVAR3==Z)) GOTO _XYZ_COCO
N8 IF ((_AXVAR1==X) AND (_AXVAR2==Y) AND (_AXVAR3<>Z)) GOTO _XY_COCO
N9 IF ((_AXVAR1==X) AND (_AXVAR2<>Y) AND (_AXVAR3<>Z)) GOTO _X_COCO
N10 IF ((_AXVAR1<>X) AND (_AXVAR2==Y) AND (_AXVAR3<>Z)) GOTO _Y_COCO
N11 IF ((_AXVAR1<>X) AND (_AXVAR2<>Y) AND (_AXVAR3==Z)) GOTO _Z_COCO
N12 MSG("轴组合错误,只支持,XYZ,XY,X,Y,Z,五种选择")
N13 M00
N14 M30
根据轴变量的比较,判断是单独执行X、Y、Z轴的补偿,或是同时执行XY轴,或XYZ轴的补偿,进行跳转。如所有跳转条件皆不满足时,将会出现错误提示,并结束运行。
此处以XYZ三轴同时进行的程序部分为例,程序如下:
其他跳转的程序部分同上述类似,请自行修改,或参考附件程序07_COCO_STUDY.MPF,限于篇幅,此处不做详细介绍。
1) 定义全局变量
<DialogGui >
<!-- ***************global var *************** -->
<let name="drv_x" /> <!-- **X轴模块编号变量 ** -->
<let name="drv_y" /> <!-- **Y轴模块编号变量 ** -->
<let name="drv_z" /> <!-- **Z轴模块编号变量 ** -->
<let name="p108_x" /> <!-- **X轴功能模块变量 ** -->
<let name="p108_y" /> <!-- **X轴功能模块变量 ** -->
<let name="p108_z" /> <!-- **X轴功能模块变量 ** -->
2) 菜单coco_xyz_set,XYZ轴,设置p5250.1=1,设置双向补偿
<!-- **xyz轴设置Coco双向补偿,5250 bit1=1 ,对应程序N24 **-->
<menu name = "coco_x_set"> <!-- **菜单定义** -->
<open_form name = "coco_x_setF" /> <!-- **打开窗体** -->
</menu>
<form name="coco_x_setF" width="1" height="1"> <!-- **窗体定义** -->
<init> <!-- **窗体初始化** -->
<caption> </caption> <!-- **窗体名称** -->
<DATA_ACCESS type = "true" />
<function name = "init_form" /> <!-- **取模块标号,及齿槽补偿功能模块的设定值,1:激活,0:未激活** -->
<function name = "x_set" /> <!-- ** 调用函数体,设置X驱动,双向齿槽力矩补偿,p5250.1=1 ** -->
<function name = "y_set" /> <!-- ** 调用函数体,设置Y驱动,双向齿槽力矩补偿,p5250.1=1 ** -->
<function name = "z_set" /> <!-- ** 调用函数体,设置Z驱动,双向齿槽力矩补偿,p5250.1=1 ** -->
</init>
</form>
<FUNCTION_BODY name = "init_form">
<!-- **取模块标号,及齿槽补偿功能模块的设定值,1:激活,0:未激活** -->
<op>
drv_x=$MA_CTRLOUT_MODULE_NR[0,AX1] <!-- **X轴模块编号赋值** -->
drv_y=$MA_CTRLOUT_MODULE_NR[0,AX2] <!-- ** Y轴模块编号赋值** -->
drv_z=$MA_CTRLOUT_MODULE_NR[0,AX3] <!-- ** Z轴模块编号赋值** -->
p108_x = ("drive/dc/p108[do$drv_x]" & 4194304) / 4194304 <!--取X p108 bit22设定值 -->
p108_y = ("drive/dc/p108[do$drv_y]" & 4194304) / 4194304 <!--取Y p108 bit22设定值 -->
p108_z = ("drive/dc/p108[do$drv_z]" & 4194304) / 4194304 <!--取Z p108 bit22设定值 -->
</op>
</FUNCTION_BODY>
<FUNCTION_BODY name = "x_set"> <!-- ** 函数体,设置X驱动,双向齿槽力矩补偿,p5250.1=1 ** -->
<if>
<condition>p108_x == 1</condition> <!-- 如果X轴p108.22=1,即齿槽补偿功能模块已激活 -->
<then>
<function name="ncfunc.bitset" refvar="drive/dc/p5250[DO$drv_x]" value="0" > 0 </function>
<!-- 设置X p5250.0=0,齿槽补偿不生效 -->
<function name="ncfunc.bitset" refvar="drive/dc/p5250[DO$drv_x]" value="1" > 1 </function>
<!-- 设置X p5250.1=1,齿槽补偿与方向相关,即双向激活 -->
<while>
<condition> "drive/dc/p5250[DO$drv_x]" !=2 </condition>
<!-- ** 当X p5250=2,继续执行** -->
</while>
</then>
<else>
<print text="%s">X轴齿槽转矩补偿功能未激活</print> <!-- * p108.22≠1,则提示错误信息* -->
</else>
</if>
</FUNCTION_BODY>
以上为设置齿槽补偿方向相关,并关闭齿槽补偿功能的脚本代码部分,被调用的函数体Y、Z轴设置同X类似,此处略过。
3) 菜单coco_xyz,XYZ轴,设置p5251.0=1,开始学习
<!-- 开始学习,xyz轴5251.0 = 1,对应程序N28 -->
<menu name = "coco_xyz"> <!-- **菜单定义** -->
<open_form name = "coco_xyzf" /> <!-- **打开窗体** -->
</menu>
<form name="coco_xyzf" width="1" height="1"> <!-- **窗体定义** -->
<init>
<caption> </caption>
<DATA_ACCESS type = "true" />
<function name = "init_form" /> <!-- **取模块标号,及齿槽补偿功能模块设定值,1:激活,0:未激活** -->
<function name = "x_start" /> <!-- ** 调用函数体,设置X驱动,齿槽补偿学习开始,p5251.0=1 ** -->
<function name = "y_start" /> <!-- ** 调用函数体,设置Y驱动,齿槽补偿学习开始,p5251.0=1 ** -->
<function name = "z_start" /> <!-- ** 调用函数体,设置Z驱动,齿槽补偿学习开始,p5251.0=1 ** -->
</init>
</form>
<FUNCTION_BODY name = "x_start"> <!-- **函数体定义** -->
<if>
<condition>p108_x == 1</condition> <!-- 如果X轴p108.22=1,即齿槽补偿功能模块已激活 -->
<then>
<function name="ncfunc.bitset" refvar="drive/dc/p5251[DO$drv_x]" value="1" > 0 </function>
<!-- 设置X p5251.0=1,齿槽补偿学习开始 -->
<while>
<condition> "drive/dc/p5251[DO$drv_x]" !=1 </condition> <!-- *当X p5250=1,继续执行* -->
</while>
</then>
<else>
<print text="%s">X轴齿槽转矩补偿功能未激活</print> <!-- * p108.22≠1,则提示错误信息* -->
</else>
</if>
</FUNCTION_BODY>
以上为设置齿槽补偿学习开始的驱动参数设置脚本,被调用的函数体Y、Z轴设置同X类似,此处略过。
4) 菜单coco_xyz_done,XYZ轴,设置p5251.0=0,学习结束
<!-- xyz轴p5251 = 0 ,对应程序N33 -->
<menu name = "coco_xyz_done"> <!-- **菜单定义** -->
<open_form name = "coco_xyz_end" /> <!-- **打开窗体** -->
</menu>
<form name="coco_xyz_end" width="1" height="1"> <!-- **窗体定义** -->
<init>
<caption> </caption>
<DATA_ACCESS type = "true" />
<function name = "init_form" /> <!-- **取模块标号,及齿槽补偿功能模块设定值,1:激活,0:未激活** -->
<function name = "x_done" /> <!-- ** 调用函数体,设置X驱动,齿槽补偿学习结束,p5251.0=0 ** -->
<function name = "y_done" /> <!-- ** 调用函数体,设置Y驱动,齿槽补偿学习结束,p5251.0=0 ** -->
<function name = "z_done" /> <!-- ** 调用函数体,设置Z驱动,齿槽补偿学习结束,p5251.0=0 ** -->
</init>
</form>
<FUNCTION_BODY name = "x_done"> <!-- **函数体定义** -->
<if>
<condition>p108_x == 1</condition> <!-- 如果X轴p108.22=1,即齿槽补偿功能模块已激活 -->
<then>
<data name = "drive/dc/p5251[DO$drv_x]">0</data>
<!-- 设置X p5251.0=1,齿槽补偿学习结束 -->
<while>
<condition> "drive/dc/p5251[DO$drv_x]" !=0 </condition> <!-- *当X p5250=0,继续执行* -->
</while>
</then>
<else>
<print text="%s">X轴齿槽转矩补偿功能未激活</print> <!-- * p108.22≠1,则提示错误信息* -->
</else>
</if>
</FUNCTION_BODY>
以上为设置齿槽补偿学习结束的驱动参数设置脚本,被调用的函数体Y、Z轴设置同X类似,此处略过。
5) 菜单coco_xyz_act,XYZ轴,设置p5250.0=1,功能生效
<!-- xyz轴p5250.0 = 1 ,功能生效,对应程序N46 -->
<menu name = "coco_xyz_act">
<open_form name = "coco_xyz_active" />
</menu>
<form name="coco_xyz_active" width="1" height="1">
<init>
<caption> </caption>
<DATA_ACCESS type = "true" />
<function name = "init_form" />
<function name = "x_act" /> <!-- ** 调用函数体,设置X驱动,齿槽补偿学习结束,p5251.0=0 ** -->
<function name = "y_act" /> <!-- ** 调用函数体,设置Y驱动,齿槽补偿学习结束,p5251.0=0 ** -->
<function name = "z_act" /> <!-- ** 调用函数体,设置Z驱动,齿槽补偿学习结束,p5251.0=0 ** -->
</init>
</form>
<FUNCTION_BODY name = "x_act">
<if>
<condition>p108_x == 1</condition>
<then>
<function name="ncfunc.bitset" refvar="drive/dc/p5250[DO$drv_x]" value="1" > 0 </function>
<!-- 设置X p5250.0=1,齿槽补偿功能生效 -->
<while>
<condition> "drive/dc/p5251[DO$drv_x]" !=3 </condition> <!-- *当X p5250=0,继续执行* -->
</while>
</then>
<else>
<print text="%s">X轴齿槽转矩补偿功能未激活</print> <!-- * p108.22≠1,则提示错误信息* -->
</else>
</if>
</FUNCTION_BODY>
以上为设置齿槽补偿功能生效的驱动参数设置脚本,被调用的函数体Y、Z轴设置同X类似,此处略过。
6) 菜单coco_xyz_save,XYZ轴,设置p971=1,保存驱动数据
<!-- xyz轴驱动参数保存,p971=1, 对应程序N50 -->
<menu name = "coco_xyz_save">
<open_form name = "coco_xyz_savef" />
</menu>
<form name="coco_xyz_savef" width="1" height="1">
<init>
<caption> </caption>
<DATA_ACCESS type = "true" />
<function name = "init_form" />
<function name = "x_save" /> <!-- ** 调用函数体,设置X驱动,驱动数据保存,p971=1 ** -->
<function name = "y_save" /> <!-- ** 调用函数体,设置Y驱动,驱动数据保存,p971=1 ** -->
<function name = "z_save" /> <!-- ** 调用函数体,设置Z驱动,驱动数据保存,p971=1 ** -->
</init>
</form>
<FUNCTION_BODY name = "x_save">
<data name = "drive/dc/p971[DO$drv_x]">1</data>
<!-- * 设置驱动数据p971=1,当保存完成后,p971恢复为0* -->
<while>
<condition> "drive/dc/p971[DO$drv_x]" !=0 </condition> <!-- *当X p971=0,继续执行* -->
</while>
</FUNCTION_BODY>
以上为设置驱动参数保存的脚本,被调用的函数体Y、Z轴设置同X类似,此处略过。
在CU中设置对应驱动模块号的P108 bit22=1,保存后即可生效,此处不做详细介绍。
将xml文件,拷贝至系统CF卡,OEM\sinumerik\hmi\appl\,执行MPF程序,即可实现自动完成齿槽力矩补偿学习并激活的无人值守过程。
至此,本应用实例介绍完毕。
1. SINUMERIK 840D sl/ 828D工作准备部分,08/2018
2. SINUMERIK 840D sl Easy XML编程手册,08/2018
3. SINAMICS S120/S150 参数手册,06/2020
4. S120驱动功能 功能手册,06/2020
Cao Peng
2021.10.13
版本 | 日期 | 修改内容 |
V1.0 | 2021.10.13 |