下载中英双语离线手册(ZIP,8.7 MB,含原始分辨率截图)
同一段教导程序,有时需要换一组数值继续使用。例如,第一种工件需要等待1.25秒,第二种工件需要等待2.5秒。可以把等待时间放在配方表中,让生成的程序引用这一项。
这一课使用原有“延时指令”,分别生成一条固定延时和一条配方延时。先看操作结果,再解释表格、参数和原脚本怎样配合。页面、按钮和生成脚本都沿用标准工程。
打开主界面的“教导”,在左侧选择“配方参数表”,在右侧选择“延时指令”。左边管理可重复使用的配方数据,右边决定本条指令怎样使用这些数据。
点击截图可放大查看,原始分辨率图片见离线包。
本课只使用“单行延时”,不混入“设置时间戳”和“段落延时”。“程序行号”前的“选取”保持未勾选,生成的代码不带N行号。
以下步骤会在练习副本中调整配方并生成两条新记录。开始前保存原有教导程序和配方,使用空白程序进行练习;如果配方里已有其他用途的数据,不要直接将它的数量缩小。
在“配方表参数数量”中输入 2,按回车。将两行名称和值依次填写为下表内容,每个输入框填写后按回车确认。
| 画面序号 | 参数名称 | 参数值 | 程序中的位置 |
|---|---|---|---|
| 1 | 延时时间 | 1.25 | #1550.item[0] |
| 2 | 备用延时 | 0.75 | #1550.item[1] |
点击截图可放大查看,原始分辨率图片见离线包。
这里先分清三个量:
#1550.itemtitle[0],供操作者识别。#1550.item[0],本例约定单位是秒。配方表本身不把所有数值规定成秒。换成进给、位置或其他用途时,单位由使用它的指令决定,应在名称或配套说明中写清。
右侧设置如下:
| 项目 | 选择或输入 |
|---|---|
| 延时策略 | 单行延时 |
| 延时时间(秒) | 1.25,按回车确认 |
| 数据源 | 数值 |
| 程序行号 | 不勾选“选取” |
点击截图可放大查看,原始分辨率图片见离线包。
左侧切回“程序”,按“生成代码行”,得到:
G04P1250
这一条的1250在生成时已经确定。原脚本将1.25秒乘1000并转为整数,写成G04的P值。以后修改配方表,不会改变这一行中的1250。
生成第一条后,当前记录位置会移到下一条。保留“单行延时”,把延时时间这一行的“数据源”改成“配方参数索引”。原先填写秒数的输入框会变成名称下拉框,在其中选择“延时时间”。
点击截图可放大查看,原始分辨率图片见离线包。
此时下拉框显示的是名称,但保存到指令工作参数中的数是 0。它表示“使用配方第1项”,不是“延时0秒”。切换数据源后要明确选择所需项,不要把之前填写的秒数继续当作有效下标。
再按“生成代码行”,左侧出现两条记录:
G04P1250
G04PINT[#1550.item[0]*1000]
点击截图可放大查看,原始分辨率图片见离线包。
第二条没有把1.25直接写进代码。它把“读取配方第1项,再乘1000转为整数”这件事留给NC解释器。
| 数据源 | 指令工作参数保存什么 | 生成什么 | 何时确定延时P值 |
|---|---|---|---|
| 数值 | 秒数1.25 | G04P1250 |
生成代码时 |
| 配方参数索引 | 下标0 | G04PINT[#1550.item[0]*1000] |
NC解释这条表达式时 |
在 env/teach/teach.ui 中,点击“延时指令”将 #1500 设为6,再由 env/teach/codeselect 装入 env/teach/ui/teach_7.ui。
标准工程的 #1500.item[6] 为1513,所以这个页面使用两组参数:#1513 存放正在编辑的内容,#1514 存放配套选择标记等设置。不要把类别下标6、页面文件号7和参数号1513混为同一个编号。
本例要读懂的字段如下:
| 字段 | 用途 | 固定数值时 | 引用第1项配方时 |
|---|---|---|---|
#1513.item[0] |
延时策略 | 0,单行延时 | 0,单行延时 |
#1513.itemversion[1] |
数据源 | 0,数值 | 1,配方参数索引 |
#1513.item[1] |
本行输入内容 | 1.25秒 | 下标0 |
#1550.item[0] |
第1项配方的实际数值 | 不被这条固定代码引用 | 1.25秒 |
#1514.item[2] |
是否生成N行号 | 未选 | 未选 |
右侧表格的数据源列使用这条原属性。对延时时间行而言,%% 为1:
-T4(#[#1500.item[#1500]].itemversion%%<<#1104itemtitle25<<#1104itemtitle26)
前一段指定写入位置,后两段是“数值”和“配方参数索引”的文字。选择第一个选项写0,选择第二个选项写1。
参数值列的配方候选使用:
-T4(#[#1500.item[#1500]].item%%<<#1550)
第一段是保存选择结果的位置,即本例的 #1513.item[1];第二段 #1550 提供名称列表。下拉框从 #1550.itemtitle[...] 取名称,将所选项的下标写入第一段,不会自动把该项的数值复制过来。
数据源改变后,原属性继续调用:
-A:(comboBoxChanged:/env/teach/ui/refresh7[0])
refresh7 的完整内容是:
widgetFunc["QTableWidget","codeParamTable7","refresh",""]
它让表格重新按条件建立输入格,所以画面能从数字输入切换到名称选择。表格候选和条件的完整写法见教导表格篇。
“生成代码行”运行 env/teach/addcode。它先设置两个间接参数号:
#11=#1500.item[#1500]
#12=#1500.item[#1500]+1
本例中,#11=1513、#12=1514。所以脚本里的 ^11.item[1] 访问的是 #1513.item[1],^12.item[2] 访问的是 #1514.item[2]。
随后 addcode 的N7分支调用 env/teach/pause。下面是该原脚本的完整内容,便于对照;它已由标准入口调用,无需另建或替换文件:
#1551.itemversion[#1551]=7
#1551.itemtitle[#1551]="A"+^11.item[0]
#1551.itemtitle[#1551]=#1551.itemtitle[#1551]+"B"+^11.itemversion[1]
#1551.itemtitle[#1551]=#1551.itemtitle[#1551]+"C"+^11.item[1]
#1551.itemtitle[#1551]=#1551.itemtitle[#1551]+"D"+^12.item[2]
#1551.itemtitle[#1551]=#1551.itemtitle[#1551]+"E"+^11.item[2]
#1558.item[0]=""
#1558.item[2]=""
IF^12.item[2]==1THEN#1558.item[0]="N"+^11.item[2]
IF^11.item[0]==1GOTO1
IF^11.itemversion[1]==1THEN#1558.item[2]="P"+"INT[#1550.item["+INT[^11.item[1]]+"]*1000]"
IF^11.itemversion[1]==0THEN#1558.item[2]="P"+INT[^11.item[1]*1000]
N1
IF^11.item[0]==0THEN#1558.item[1]="G04"
IF^11.item[0]==1THEN#1558.item[1]="#1513=#9990.channel"
IF^11.item[0]==2THEN#1558.item[1]="G104"
#1551.item[#1551]=#1558.item[0]+#1558.item[1]+#1558.item[2]
#1551.itemdesc[#1551]=#1551.item[#1551]
#1551=#1551+1
#1551.channel=FIX[#1551/10]
widgetFunc["SysFunc","0","parser","/env/teach/parsenode"]
先看最重要的两句:
INT[^11.item[1]*1000] 在组态脚本中计算,结果拼接成 P1250。INT[#1550.item[ 和 ]*1000] 是要写入NC的文字;中间只把所选下标转成整数文字。下标0最终拼成 PINT[#1550.item[0]*1000]。这里的引号决定了现在计算,还是先把表达式写进程序。如果定制时把引用分支改成先读取配方值再拼数字,就会把它变成生成时确定的固定值。
#1558 暂存拼好的行号、指令和参数三段;#1551.item[当前下标] 保存最终代码,.itemdesc[...] 提供程序表里的显示文字。
脚本还保留了时间戳和段落延时分支。它们的生成方式不同;不能把本课的秒数引用说明直接套到“设置时间戳”上。
生成代码时,脚本除了保存可执行文字,还将编辑资料写进 #1551.itemtitle[...]。本例的两条记录分别为:
A0B0C1.250DfalseE1
A0B1C0.000DfalseE1
| 标记后的内容 | 含义 |
|---|---|
| A | 延时策略;0为单行延时 |
| B | 数据源;0为数值,1为配方参数索引 |
| C | 输入内容;可能是秒数,也可能是下标 |
| D | 是否启用程序行号;本例未选,保存为false |
| E | 程序行号的输入值;未勾选时不输出N字 |
因此,B和C必须一起理解。同样一个C字段,B0C1.250 表示1.25秒,B1C0.000 表示使用配方下标0。
选中程序表中的记录后,env/teach/parsenode 的N7分支恢复这些资料,其中两句为:
^11.itemversion[1]=#1551.itemtitle[#1551]/"B"*"C"
^11.item[1]=#1551.itemtitle[#1551]/"C"*"D"
第一句恢复数据源,第二句恢复输入内容。随后原页面根据数据源显示正确的输入方式。它不会把生成代码时的整张配方表恢复回来。
切到“配方参数表”,把“延时时间”从1.25改为2.5,按回车;“备用延时”仍为0.75。
点击截图可放大查看,原始分辨率图片见离线包。
切回“程序”,先选第1条,再选第2条。右侧仍显示“配方参数索引”和“延时时间”,因为记录保存的是下标0。
点击截图可放大查看,原始分辨率图片见离线包。
这一步不再按“生成代码行”。查看左侧,原来的两条代码仍然保持不变:
点击截图可放大查看,原始分辨率图片见离线包。
| 重新解释前的第1项配方值 | 固定行 G04P1250 |
引用行的P表达式结果 |
|---|---|---|
| 1.25 | 1250 | 1250 |
| 2.5 | 1250 | 2500 |
这就是配方引用的用途:保留相同的程序结构,在加工前准备不同的数值。只有保留引用的行才读取新配方;固定数字行不会跟着变化。
如果改的是“选用哪一项”,例如从“延时时间”改成“备用延时”,则修改了指令工作参数,必须对当前记录重新按“生成代码行”。生成结果才会从 [0] 变成 [1]。此后还要重新“加载代码”,让加工文件包含修改后的记录。
配方应在启动前确认。NC解释与实际执行有先后关系,不要在加工过程中修改配方并假定它一定从眼前这一行立即生效。
按“加载代码”,标准 env/teach/codeGenerate 将已记录代码输出到 env/teach/doc/program.nc,并在程序页面显示:
点击截图可放大查看,原始分辨率图片见离线包。
负责输出的原命令是:
widgetFunc["systemParamToFile",1551,0,"/env/teach/doc/program.nc"]
它按顺序写出 #1551.item[...] 中的代码文字,不重新运行每条教导生成脚本,也不会自动在文件前面添加 #1550 的配方赋值。
因此,这两行就是本例完整的NC输出:
G04P1250
G04PINT[#1550.item[0]*1000]
引用行要在具有对应 #1550 配方数据的本系统中解释。只把这个 .nc 文件复制到另一套运行环境,并不能同时带走“延时时间=2.5”。
三种保存内容应分开理解:
| 操作与文件 | 保存的内容 | 本例中没有自动包含的内容 |
|---|---|---|
保存配方,.formula |
#1550 的配方名称、数值等参数资料 |
教导程序记录 |
保存,.program |
#1551 的代码记录和可回读编辑资料 |
当前整张配方表 |
加载代码,program.nc |
已记录的NC代码文字 | 配方表、名称和教导编辑资料 |
“载入配方”运行 env/teach/openformula,将所选文件读回 #1550;“保存配方”运行 env/teach/saveformula,将 #1550 写入所选文件。打开或保存 .program 使用另一组参数1551。
交付或切换配方时,程序与配方的下标约定必须一致。不要只核对名称:当前代码引用的是 [0],它不会在配方里搜索“延时时间”这个名字。配方的完整文件操作见下一课教导记录与文件。
本例只有两项配方,所以右侧提供名称下拉框。标准表格在配方数量不大于20时使用这种方式;超过20项时改成输入整数下标,具体条件已在教导表格篇展开。
使用时抓住以下关系:
| 改了什么 | 对原引用的影响 | 需要做什么 |
|---|---|---|
| 同一项的数值 | [0]仍指向该项,下次解释读取新值 |
启动前确认新值,需长期保留时保存配方 |
| 同一项的名称 | 代码仍引用原下标 | 名称便于识别,不代替下标约定 |
| 指令选择的配方项 | 工作参数中的下标改变 | 重新生成当前记录,再加载代码 |
| 配方中各项的用途或排列 | 同一下标可能代表其他含义 | 核对所有引用该位置的程序 |
| 缩小配方数量 | 可能删掉仍被引用的项 | 先查引用并备份,不能仅看下拉框还能显示什么 |
| 载入另一份配方 | 原代码仍使用相同下标 | 核对数量、位置、单位和数值 |
整数输入中的0仍表示第1项。只有两项时,有效下标是0和1;不能把画面序号2直接当作第2项的下标,也不能用负数表示“未选择”。
这个原功能把操作者容易理解的名称与程序需要的下标连接起来,又由数据源选择决定代码写固定值还是写参数引用。阅读其他指令时,可以依次找:
#1550.item[...],名称在 .itemtitle[...]。.item[...],也要看决定它含义的 .itemversion[...]。-T、-C 与数据源改变后的刷新脚本。常见现象可这样排查:
| 现象 | 检查位置 |
|---|---|
| 改了配方,延时仍是固定值 | 记录是否仍为 G04P1250,生成时是否选择了“数值” |
| 选了配方名称,工作参数却是0 | 这是第1项的下标;实际值在 #1550.item[0] |
| 换了配方项,程序文字没有变化 | 是否重新生成当前记录并重新加载代码 |
| 选回记录后看不到秒数输入框 | 该记录恢复了配方数据源,应显示名称或整数下标 |
| 同名配方在另一台软件中结果不同 | 检查下标对应、当前数值、单位及是否载入正确配方 |
| 只交付NC后数值不符合预期 | NC中的引用不会自动携带配方表,需要配套准备配方数据 |
对照文件集中在 env/teach/teach.ui、ui/teach_7.ui、ui/refresh7、codeselect、refreshFormulaParamTable、addcode、pause、parsenode、codeGenerate、saveformula、openformula。先沿本例读懂它们怎样配合,再将相同方法用于其他已经支持配方数据源的指令。
下一篇:教导记录怎样编辑、保存和重新打开