本使用手册及样例包目录内所包含文档、PLC程序、机床可执行程序(MPF、SPF、…)、电气图,可能与用户实际使用不同,用户可能需要先对例子程序做修改和调整,才能将其用于测试。本例程的作者和拥有者对于该例程的功能性和兼容性不负任何责任,使用该例程的风险完全由用户自行承担。由于它是免费的,所以不提供任何担保,错误纠正和热线支持,用户不必为此联系中国东方数控有限公司技术支持与服务部门。
对于在使用中发生的人员、财产损失本公司不承担任何责任,由使用者自行承担风险。
以上声明内容的最终解释权归中国东方数控有限公司所有,后续内容更新不做另行通知。
在专用机床中很多都有特定的加工程序以及界面,而在用户侧往往需要加工同类型不同规格的零件,此时只需修改相应界面参数即可。但是每次切换零件都需要重新输入相匹配的参数,有没有一种方法可以将常用零件的工艺参数保存出来,需要用的时候再读取出来呢,答案是肯定的。本例分享下如何将界面参数保存读取的方法。
硬件 | ||||
工艺 | PPU24x/NCU710 | PPU26x/NCU720 | PPU28x/NCU730 | PPU28x.Advance |
车床 | ● | ● | ● | ● |
铣床 | ● | ● | ● | ● |
磨床 | ● | ● | ● | ● |
• V4.7
本例只对保存参数,读取参数的相关语法做介绍,不针对所有界面语法。详细语法说明请在参考文献中查阅
保存流程:

读取流程:

1:FUNCTION_BODY:
属性 | name= “函数体的名称” ● parameter = “参数列表” (可选) 属性列出了需要的传输参数。参数相互之间以逗号分隔。 调用函数体时,函数调用中给定参数的值会复制到所列出的传递参数中。 ● return = “true” (可选) 如果属性设为 true,则创建局部变量 $return。将函数的返回值复制到其中, 在退出该函数时该值会继续传输给主调函数。 |
语法 | <FUNCTION_BODY name = "<function_name>" parameter = "<p1, p2, p3>" <LET name = "tmp></LET> <OP> tmp = p1 </OP> </FUNCTION_BODY> |
2:FOR 循环
说明 | for (初始化;测试;继续)指令 |
语法 | <FOR> <INIT>…</INIT> <CONDITION>…</CONDITION> <INCREMENT>…</INCREMENT> </FOR> 按下列方式执行 For 循环: 1. 运用表达式 初始化 (INIT)。 2. 运用表达式 文本 (CONDITION) 作为布尔型表达式。如果值为假(false),则结束 For 循环。 3. 执行后续的指令。 4. 运用表达式 继续 (INCREMENT)..
|
注意 | 所有在 INIT、CONDITION 和 INCREMENT 分支中使用的变量都要在 FOR 循 环的外部创建。 |
3:doc.writetofile
该函数可以将一个字符串变量的内容写入指定文件中。文件名只能用小写字母。需要访问另一个目录中的文件时,可采用相对路径,即目录从 appl 或 dvm 开始
参数 | progname - 文件名 str1 - 字符串 |
语法 | <function name="doc.writetofile" > progname, str1</function> |
示例 | <function name="doc.writetofile">_T"n:\mpf\test.mpf", my_var </function> |
4:MSGBOX
指令会打开一个信息盒,其给分支的返回值可供使用
语法 | <MSGBOX text="<Message>" caption="<caption>" retvalue="<variablename>" type="<button type>" /> |
属性 | ● text 文本 ● caption 标题 ● retvalue 其中复制有返回值的变量名: 1 – OK 0 – CANCEL ● type 应答可能: “BTN_OK” “BTN_CANCEL” “BTN_OKCANCEL” 如果对属性 "text" 或 "caption" 使用报警编号,则信息盒会显示为该编号所保存 的文本。 |
示例 | <MSGBOX text="保存参数组完成" caption="提示" retvalue="st2" type="BTN_OK" /> |
5:IF语句
有条件的指令(IF, THEN, ELSE)标签 THEN 和 ELSE 包含在标签 IF 中。标签 IF 后跟有条件,而条件在标签 CONDITION 中执行。需要通过其他的指令处理来确定运算结果。如果函数结果为真,则执行 THEN 分支而跳过 ELSE 分支。如果函数结果为假,则解析器执行 ELSE 跳转。
语法 | <IF> <CONDITION> 条件 != 7 </CONDITION> <THEN> 情况说明:条件满足 </THEN> <ELSE> 情况说明:条件不满足 </ELSE> </IF> |
举例 | <if> <condition> doext == 1</condition> <then> <MSGBOX text="读取参数组完成" caption="读取参数完成" retvalue="st2" type="BTN_OK" /> </then> <else> <MSGBOX text="无法找到相应名称数据组" caption="读取参数错误" retvalue="st2" type="BTN_OK" /> </else> </if> 如果doext==1则弹出读取参数完成提示框,否则弹出读取参数错误提示框
|
6:doc.exist
如文件存在,则函数提供值 1。文件名只能用小写字母。需要访问另一个目录中的文件时,可采用相对路径,即目录从 appl 或 dvm 开始。
语法 | <function name="doc.exist" return="<int_var>" >progname </function> |
参数 | progname - 文件名 |
示例 | <function name="doc.exist" return="doext">filename</function> |
7:readfromfile,string.find,string.left,string.trimrigh,string.delete,ftrans等语法说明,请参考SINUMERIK 840D sl基本软件和操作软件手册
1:在主标签xmldial.xml中定义所有界面标签,以及相应变量
<?xml version="1.0" encoding="UTF-8"?> <DialogGui type="1"> <?include src="f:\appl\Main.xml"?> <let name="st1" type="string" /> <let name="st2" type="string" /> </DialogGui> |
界面文件中包含main.xml标签 界面启动时定义字符串变量st1,st2 |
2:在main.xml标签中定义按键,以及按键调用
<menu name="main"> <OPEN_FORM name="main" /> <softkey position="1" type="user_controlled"> <state type="pressed" /> <caption>倒角加工</caption> <navigation>main</navigation> </softkey> <softkey position="11" type="user_controlled"> <state type="notpressed" /> <caption>保存参数</caption> <function name="paraset"></function> </softkey> <softkey position="9" type="user_controlled"> <state type="notpressed" /> <caption>读取参数</caption> <function name="pararead"></function> </softkey> </menu>
|
定义按键 倒角加工,按键跳转至main.xml标签
定义按键 保存参数,按键调用函数体paraset,函数体定义在后面会说到
定义按键 读取参数,按键调用函数体pararead,函数体定义在后面会说到 |
3:定义界面显示文本
<form name="main"> <paint> <text xpos="10" color="#000000" ypos="100" font="1">X轴进刀位置</text> <text xpos="10" color="#000000" ypos="125" font="1">X轴退刀位置</text> <text xpos="10" color="#000000" ypos="150" font="1">Z轴起始偏移角</text> <text xpos="10" color="#000000" ypos="175" font="1">XY轴安全位置</text> <text xpos="275" color="#000000" ypos="300" font="1">变位系数</text> <text xpos="275" color="#000000" ypos="325" font="1">齿顶高系数</text> <text xpos="275" color="#000000" ypos="350" font="1">齿底高系数</text> <text xpos="20" color="#000ff0" ypos="50" font="2">齿轮参数组名称</text> </paint> |
文本需定义在<paint>…</paint>之中
|
4:定义界面输入框
<init> <caption>倒角中心 </caption>
<control name="InputField91" xpos="150" ypos="50" height="16" width="100" refvar="st1" hotlink="true" />
<control name="InputField1" xpos="150" ypos="100" height="16" width="110" refvar="nck/channel/parameter/r[0]" hotlink="true" format="%10.3f" font="1" color_bk="#ffff80" />
<control name="InputField2" xpos="150" ypos="125" height="16" width="110" refvar="nck/channel/parameter/r[1]" hotlink="true" format="%10.3f" font="1" color_bk="#ffff80" />
<control name="InputField3" xpos="150" ypos="150" height="16" width="110" refvar="nck/channel/parameter/r[2]" hotlink="true" format="%10.3f" font="1" color_bk="#ffff80" />
<control name="InputField4" xpos="150" ypos="175" height="16" width="110" refvar="nck/channel/parameter/r[3]" hotlink="true" format="%10.3f" font="1" color_bk="#ffff80" />
<control name="InputField20" xpos="420" ypos="300" height="16" width="110" refvar="nck/channel/parameter/r[4]" hotlink="true" format="%10.3f" font="1" color_bk="#ffff80" />
<control name="InputField21" xpos="420" ypos="325" height="16" width="110" refvar="nck/channel/parameter/r[5]" hotlink="true" format="%10.3f" font="1" color_bk="#ffff80" />
<control name="InputField22" xpos="420" ypos="350" height="16" width="110" refvar="nck/channel/parameter/r[6]" hotlink="true" format="%10.3f" font="1" color_bk="#ffff80" /> </init> <timer /> <focus_in /> <edit_changed /> <index_changed /> <close /> <key_evennt /> <message /> </form> |
定义界面标题 倒角中心
定义齿轮参数组名称输入框,变量st1是在xmldial.xml中定义的字符串 变量
定义输入框所关联的R变量,以及位置,颜色等 如X轴进刀位置对应r[0].
固定结构 |
当完成第1,2,3,4步之后就可以显示出界面,如图所示:

5:定义保存函数体paraset,对应第1步中按键调用函数体
<function_body name="paraset"> <let name="filename" type="string"></let> <let name="doext" type="int">0</let> <let name="filecont" type="string"></let> <let name="midcont" type="string"></let> <let name="paran" type="int">0</let> <let name="paracnt" type="int">0</let> <let name="readcont" type="string"></let> <let name="entindex" type="int">0</let> <let name="substr" type="string"></let> <let name="index"></let> <let name="numbstr" type="string"></let> <let name="R_1" type="float"></let> | 对应按键保存参数,调用函数体名称paraset
在函数体paraset定义变量,用于函数体计算 |
<print name="filename"text="n:\mpf\para\%s.mpf">st1</print> | 输出文件名称,以及文件路径
|
<for> <init> <op>index=0</op> </init> <condition> index <=10</condition> <increment> <op>index = index + 1</op> </increment> <op>R_1="Nck/Channel/Parameter/R[$index]"</op> <print name="midcont" text="%f">R_1</print> <op>filecont =filecont+midcont + _T"\\n"</op> <function name="doc.writetofile">filename,filecont</function> </for> <MSGBOX text="保存参数组完成" caption="提示" retvalue="st2" type="BTN_OK" /> </function_body> | 循环结构: 1 初始化index为0 2 当index<=10时,将R[index]写入至定义路径文件中
结束循环后弹出保存完成对话框
|
6:定义读取函数体parasread,对应第1步中按键调用函数体
<function_body name="pararead"> <let name="filename" type="string"></let> <let name="filename-1" type="string"></let> <let name="doext" type="int">0</let> <let name="filecont" type="string"></let> <let name="midcont" type="string"></let> <let name="paran" type="int">0</let> <let name="paracnt" type="int">0</let> <let name="readcont" type="string"></let> <let name="entindex" type="int">0</let> <let name="substr" type="string"></let> <let name="mindex" type="int"></let> <let name="index"></let> <let name="numbstr" type="string"></let> <print name="filename" text="n:\mpf\para\%s.mpf">"st1"</print> <function name="doc.exist" return="doext">filename</function> | 对应按键读取参数,调用函数体名称pararead
在函数体pararead定义变量,用于函数体计算
|
<if> <condition> doext == 1</condition> <then> <function name="doc.readfromfile" return="readcont">filename</function> <for> <init> <op>index=0</op> </init> <condition> index<= 10</condition> <increment> <op>index = index + 1</op> </increment> <function name="string.find" return="entindex">readcont, _T"\\n"</function> <function name="string.left" return="substr">readcont, entindex</function> <function name="string.trimright">substr</function> <op>entindex = entindex +1</op> <function name="string.delete">readcont,0,entindex</function> <type_cast name="substr" type="float"/> <op> "Nck/Channel/Parameter/R[$index]"= substr</op> <type_cast name="ftrans" type="string"/> </for> <MSGBOX text="读取参数组完成" caption="读取参数完成" retvalue="st2" type="BTN_OK" /> </then> <else> <MSGBOX text="无法找到相应名称数据组" caption="读取参数错误" retvalue="st2" type="BTN_OK" /> </else> </if> </function_body> |
判断文件是否存在,若存在则doext为1,否则为0若文件存在,执行<then></then>中的循环字符串处理语句,完成后输出读取完成提示框 若不存在则执行<else></else>中语句输出读取失败提示框
文件不存在,输出错误提示框
|
例1保存参数演示:将界面参数保存至文件CHILUN1中,如图:
1:输入对应参数,如:X轴进刀位置11,输入齿轮参数组名称CHILUN1,按INPUT键确认

2 点击屏幕右侧保存参数,保存完成后弹出提示框:保存参数完成,如图:

3 此时在零件程序目录会生成CHILUN1.MPF文件,对应界面中定义的文件路径"n:\mpf\para\%s.mpf"如图:
保存的数值如下:

例2读取参数演示:将文件CHILUN2中的参数加载至变量中
1:CHILUN2文件中数值如图:

2: 在自定义界面 齿轮参数组名称中输入 CHILUN2,并按INPUT键确认
3:点击屏幕右侧读取参数按键,读取完成后弹出提示框:读取完成


4 此时观察之前定义的参数已经改变,比如X轴进刀位置原先是0.读取成功后变为10.,读取完成

例3读取不存在参数组演示:将文件CHILUN3(文件不存在)中的参数加载至变量

由于不存在CHILUN3文件,故读取失败,弹出读取失败提示框。如图:

SINUMERIK 840D sl基本软件和操作软件
Chen Jian
2020.10.30
版本 | 日期 | 修改内容 |
V1.0 | 2020.10.30 | |
V1.1 | 2020.10.31 | 完善可读性 |