上一课已经生成了两条延时记录,并让其中一条引用配方。接下来要解决的是日常使用中的几个问题:怎样在中间加一条记录,怎样复制已有指令,怎样保存下来供以后继续编辑,以及程序和配方应该怎样配套使用。
本课继续使用标准“教导”页面和原有脚本,不增加新的按钮或指令。先完成一遍操作,再对照短脚本看懂它的做法。
进入“教导”,左侧选择“程序”。程序表下方分三排按钮:第一排选择记录和翻页,第二排编辑记录,第三排新建、保存、打开和加载代码。
点击截图可查看原图。
下面的局部图用于看清按钮文字。后文说的“保存”“打开”,都是这里的按钮。
点击截图可查看原图。
在练习副本中准备好上一课的两条记录:
G04P1250
G04PINT[#1550.item[0]*1000]
配方第1项为“延时时间”,值2.5;第2项为“备用延时”,值0.75。第一条代码固定等待1.25秒,第二条在NC解释时读取配方第1项。生成方法见教导配方引用。
开始前保存要保留的教导程序和配方。本课会插入、删除记录,还会用“新建”清空练习程序;这些操作不应直接用于尚未保存的生产资料。
程序表的一条记录保存在 #1551 的同一下标中,同时带有四份内容:
| 字段 | 用途 | 本例第1条记录 |
|---|---|---|
#1551.item[0] |
输出到NC文件的代码 | G04P1250 |
#1551.itemdesc[0] |
程序表显示的文字 | G04P1250 |
#1551.itemversion[0] |
指令类别,供选回时判断 | 7,延时指令 |
#1551.itemtitle[0] |
恢复右侧输入项所需的编辑资料 | A0B0C1.250DfalseE1 |
这里的 .itemtitle[...] 用来保存编辑资料,不是给操作者看的标题。标记A~E的含义已在上一课解释。
还有三个与位置有关的量:
| 参数 | 含义 |
|---|---|
#1551 |
当前记录下标,从0开始 |
#1551.itemnum |
已分配的记录数量,包括插入但尚未填入代码的记录 |
#1551.channel |
程序表当前页,从0开始,每页显示10项 |
因此,画面的第2项对应下标1。表中的“序号”用于选择教导记录,不是NC程序中的N行号。一条空间圆弧记录还可能包含两行代码,不能把“删除一条记录”理解成必定只删除一行NC文字。
本例要在两条延时之间复制一条固定延时:
点击截图可查看原图。
“插入”运行 env/teach/insnodeonly,完整内容如下:
IF#1551>=#1551.itemnumGOTO1
#1500.channel=0
widgetFunc["insertSystemParamItem",1551,#1551,1]
N1
第一句判断当前位置是否已经超出已有记录。最后一条之后的空位置没有可向后移动的记录,这个按钮便不作插入。insertSystemParamItem 的三个数字依次表示:参数1551、插入位置、插入数量1。
插入会把原记录的代码、显示文字、类别和编辑资料一起向后移动,并在当前位置留出空记录。它没有把右侧输入内容生成到这里。空位置准备好以后,还要生成代码或粘贴一条完整记录。
在末尾追加时,直接选择最后一条之后的空位置,再生成或粘贴即可,不需要先按“插入”。
接着完成刚才的插入:
G04P1250,第3项仍是配方延时。右侧也恢复为固定数值1.25秒。点击截图可查看原图。
env/teach/copy 只有一句:
#1551.version=#1551
它记住的是来源记录的下标。例如复制第1项,便将0保存到 #1551.version。它没有把内容放到Windows剪贴板,也没有在此时另外保存一份记录。
env/teach/paste 的完整内容是:
IF#1551.version>=#1551.itemnumGOTO1
IF#1551==-1THEN#1551.itemnum=1
IF#1551==-1THEN#1551=0
IF#1551>=#1551.itemnumTHEN#1551.itemnum=#1551+1
#1551.item[#1551]=#1551.item[#1551.version]
#1551.itemtitle[#1551]=#1551.itemtitle[#1551.version]
#1551.itemdesc[#1551]=#1551.itemdesc[#1551.version]
#1551.itemversion[#1551]=#1551.itemversion[#1551.version]
widgetFunc["SysFunc","0","parser","/env/teach/parsenode"]
N1
先检查来源位置,再按需要增加目标记录数量,随后复制四份内容,最后调用 parsenode 恢复右侧参数。粘贴后仍停在目标位置,不会像生成延时代码那样自动移到下一项。
要掌握下面三个使用规则:
| 操作情况 | 实际结果 |
|---|---|
| 粘贴到已有记录 | 覆盖该位置的记录,不自动插入 |
| 粘贴到末尾第一个空位置 | 扩充记录数量,追加一条 |
| 复制后修改并重新生成来源记录,再粘贴 | 取得来源位置此时的新内容 |
例如,复制1.25秒的记录后,又把来源记录改为3秒并重新生成,再去粘贴,得到的是 G04P3000,不是复制瞬间的 G04P1250。
插入或删除还会改变记录位置。因此,需要中间增加一条时,先插入,再重新选择来源、复制、选择目标、粘贴。不要复制后再在来源之前插入一项,并假定原下标会跟着记录移动。新建或打开另一份程序后,也应重新选择有效来源并按“复制”。
现在删除刚复制出来的第2项:保持它被选中,按“删除”,确认后,原第3项向前移到第2项。
点击截图可查看原图。
env/teach/delnode 的完整内容是:
IF#1551>=#1551.itemnumGOTO1
IFwidgetFunc["messageBox1",#1107.itemtitle[40],#1107.itemtitle[23],"null.nc"]==0GOTO1
#1500.channel=0
widgetFunc["removeSystemParamItem",1551,#1551,1]
widgetFunc["SysFunc","0","parser","/env/teach/parsenode"]
N1
没有选中有效记录时直接结束;确认框返回0时也直接结束。确认删除后,代码及配套资料一起移除,后面的记录向前补位,再按当前位置恢复参数。
这里的 messageBox1 返回确认结果,脚本据此决定是否继续。不要与其他同名相近的提示函数混用。
删除最后一项时,当前位置会成为末尾空位置。脚本没有自动退回上一项;如果要继续编辑前一条,应重新选择它。插入、删除、复制和粘贴都只改变当前教导资料,不会自动把更改保存到文件。
当前又是两条原记录,可以保存供以后继续编辑。
delay.program,完成保存。delay.formula。点击截图可查看原图。
配方区有自己的文件按钮和复制、粘贴按钮:
点击截图可查看原图。
建议用相同的基本文件名配对保存,例如 delay.program 与 delay.formula;这是便于管理的命名方法,软件不会仅凭同名就自动把两份文件一起打开。
| 文件 | 由哪个按钮生成 | 包含什么 | 用哪个按钮读取 |
|---|---|---|---|
.program |
程序区“保存” | 参数1551,包括代码、显示文字、类别、编辑资料和记录位置等 | 程序区“打开” |
.formula |
配方区“保存配方” | 参数1550,包括配方名称、数值等 | “载入配方” |
program.nc |
程序区“加载代码” | 已记录的NC代码文字 | 随该操作显示在程序页面 |
.program 与 .formula 是软件自己的参数文件,不是可以直接编辑的G代码文本。不要用文本编辑器修改,也不要通过改扩展名将它们互相替代。保存时不只写出几行文字,而是写出对应参数的整份资料。
原“保存”每次都会弹出文件选择窗口;有过保存记录,也不能省略本次路径和文件名确认。另存到新名称可保留上一版资料。
下面故意改变配方,再重新打开两份文件,以看清它们的关系。
先在配方表把第1项改成9,按回车,不保存配方。回到“程序”,按“新建”,确认清空记录。
点击截图可查看原图。
“新建”的原脚本 env/teach/newfile 为:
IFwidgetFunc["messageBox1",#1107.itemtitle[41],#1107.itemtitle[23],"null.nc"]==0GOTO1
#1551.itemnum=0
#1551=0
#1551.channel=0
N1
它清空记录,并把当前下标、页号设为0;不会删除已保存的文件,也不清空 #1550 的配方。右侧指令工作参数也不由这三句清空,所以不能只凭右侧还显示某个数值就认为记录仍在。
按“打开”,选刚才保存的 delay.program:
点击截图可查看原图。
右侧恢复“配方参数索引”和“延时时间”,因为第2条记录保存了数据源和配方下标:
点击截图可查看原图。
切到“配方参数表”,第1项仍是9:
点击截图可查看原图。
再按“载入配方”,选择 delay.formula,第1项才恢复为2.5,第2项仍为0.75:
点击截图可查看原图。
由此可见,配套使用时应分别打开程序、载入配方,再检查被引用项的位置、用途、单位和值。即使名称相同,只要位置或用途改变,#1550.item[0] 就可能读到不合适的数据。
“保存”运行 env/teach/savefile:
widgetFunc["saveFileName","*.program","",100]
IF#100==""GOTO1
#1551.description=#100
N2
widgetFunc["SysFunc",#1551.description,"saveParamItemAs1",1551]
widgetFunc["messageBox",#1107.itemtitle[42],"",""]
N1
saveFileName 弹出保存窗口,*.program 是文件筛选条件,100指定临时路径参数 #100。选择路径后,将其放到 #1551.description,再由 saveParamItemAs1 把参数1551整份写入文件。这里的N2没有被其他语句跳转,不代表自动运行第二个保存过程。
“打开”运行 env/teach/openfile:
widgetFunc["openFileName","*.program","",100]
IF#100==""GOTO1
#1551.description=#100
widgetFunc["SysFunc",#1551.description,"readParamItemFrom1",1551]
N1
widgetFunc["SysFunc","0","parser","/env/teach/parsenode"]
readParamItemFrom1 用文件资料替换参数1551,不是把新记录追加到末尾。随后 parsenode 按恢复的当前记录重新填写右侧参数。保存前只修改右侧输入、没有按“生成代码行”的内容,不属于该条已保存记录。
配方使用同一组文件命令,只把目标换成1550。env/teach/saveformula 的关键写入句为:
widgetFunc["SysFunc",#1550.description,"saveParamItemAs1",1550]
env/teach/openformula 的完整内容是:
widgetFunc["openFileName","*.formula","",100]
IF#100==""GOTO1
#1550.description=#100
widgetFunc["SysFunc",#1550.description,"readParamItemFrom1",1550]
#1550.version=#1550.itemnum
N1
最后一条赋值让“配方表参数数量”显示读入后的实际项数。它不调用 parsenode,也不改写 #1551 的教导记录。
这些脚本没有在打开前另外询问是否保存当前修改。因此,想保留当前内容,应先保存,再打开另一份文件。目标参数号由调用脚本决定,不能依靠换扩展名把一种参数文件变成另一种。
当前标准脚本把 #100 当作文件选择结果,但两个选择函数对取消的处理不同:
| 操作 | 取消后对 #100 的处理 |
对原脚本的影响 |
|---|---|---|
saveFileName |
写入空字符串 | 保存脚本跳过写文件 |
openFileName |
保留原值;本次函数返回空字符串 | 若 #100 仍是旧路径,打开脚本可能继续读取该路径 |
例如,先打开 delay.program,再把第1条改成4秒并生成,然后再次按“打开”却在窗口中取消:由于 #100 仍为 delay.program 的路径,原脚本会重新读取它,第1条恢复为文件中保存的 G04P1250。载入配方使用相同的选择函数和判断方式,也存在这个问题。
所以,不要把打开窗口里的“取消”当作保护未保存修改的方法;需要保留的资料,应在打开或载入前保存。如果取消后发现内容回到原值,应先核对是否重新读入了先前的文件。
此外,openfile 的N1之后仍有 parsenode。即使没有读文件,也可能按当前记录重新填写右侧参数;尚未生成的输入不能仅靠取消打开窗口来保留。
阅读或定制类似脚本时,要分清“本次函数返回值”和“上次留下的路径参数”。判断是否取消,应依据本次选择结果,不能只看某个路径参数是否非空。
两份资料恢复后,切回“程序”,按“加载代码”。程序页面显示:
点击截图可查看原图。
env/teach/codeGenerate 中负责输出的是:
widgetFunc["systemParamToFile",1551,0,"/env/teach/doc/program.nc"]
它顺序写出 #1551.item[...] 中非空的代码文字。它不重新运行每条教导生成脚本,不包含 .itemtitle[...] 的编辑资料,也不会把当前配方值改写成固定数字。
因此,日常完整操作顺序应是:
.program;配方有改动时另行保存 .formula。如果加载以后又修改记录,应重新加载代码;保存 .program 不会自动更新已经显示的 program.nc。若只改变被引用的配方值而没有改变代码,引用行的文字可以保持不变,但仍要在加工前确认当前配方。
“加载代码”负责输出和显示文件,不等于启动加工。也不要指望从普通 .nc 文件自动恢复这里的全部教导编辑资料;要继续通过原教导页面编辑,应保留 .program,使用配方时同时保留相应 .formula。
配方表的两个按钮运行 env/teach/formulacopy 和 env/teach/formulapaste。
复制脚本为:
#1550.permission=#1550
这里用 .permission 暂存来源下标,是这个功能对字段的具体用法;不能仅看字段名称就把它解释成一次用户权限修改。
粘贴脚本为:
IF#1550.permission>=#1550.itemnumGOTO1
IF#1550>=#1550.itemnumGOTO1
#1550.item[#1550]=#1550.item[#1550.permission]
#1550.itemtitle[#1550]=#1550.itemtitle[#1550.permission]
N1
它只复制配方值和名称,不复制教导指令,也不会自动扩大配方数量。需要更多位置时,先通过数量输入准备好对应项。
例如,把第1项复制到第2项,会把第2项的名称和值一起改成“延时时间”和2.5,原“备用延时”和0.75被覆盖。程序中已有的 [1] 引用仍指向第2项,但读到的内容变了。因此不能把配方粘贴当作只复制名称的操作。
配方复制同样保存来源位置。来源修改后再粘贴,得到的是修改后的值;载入另一份配方后,应重新选择来源并复制。
教导功能让操作者先输入、再生成记录,最后决定保存资料还是输出NC。读懂这一层,就能理解为什么“右侧已经改了”“表里已经有了”“文件已经保存了”和“加工文件已经更新了”是不同的状态。
| 遇到的现象 | 应检查什么 |
|---|---|
| 插入后是空行 | 插入只腾出位置,还要生成或粘贴 |
| 粘贴覆盖了原指令 | 目标已有记录;需要保留原记录时应先插入 |
| 粘贴得到的不是刚才复制时的值 | 复制保存的是来源下标,来源内容或位置可能已改变 |
| 保存再打开,右侧修改没有回来 | 修改后是否先按“生成代码行” |
| 新建后配方仍然存在 | 新建只清空教导记录,配方单独管理 |
| 打开程序后延时数值不符合预期 | 是否另行载入了匹配配方,引用下标是否对应 |
| 取消打开后修改消失 | 检查旧路径被重新读取,或当前记录被重新回读的情况 |
| 保存了程序,程序页面仍显示旧代码 | 保存资料之后是否重新“加载代码” |
| 只有NC,无法恢复原来的参数选择 | NC只保留代码,应使用保存的program资料继续教导编辑 |
在自己的组态中组织类似功能时,可以沿用这几个思路:把正在输入的参数与已确认记录分开;为每条记录同时保留代码和回读资料;移动、删除和复制时让相关资料保持对应;把可编辑文件与供加工使用的代码文件分开管理。
对照文件集中在 env/teach/teach.ui、insnodeonly、copy、paste、delnode、newfile、savefile、openfile、saveformula、openformula、formulacopy、formulapaste、parsenode 和 codeGenerate。本章的原脚本用于解释现有功能,不需要另外建立同名文件。
到这里,教导的参数输入、记录、配方、文件保存与NC输出已经连在一起。输出后的执行过程可回看加工运行篇。下一课进入现有加工向导,学习怎样根据尺寸参数生成完整刀路。