教导中的配方参数怎样被程序引用

阅读目录 · English

同一段教导程序,有时需要换一组数值继续使用。例如,第一种工件需要等待1.25秒,第二种工件需要等待2.5秒。可以把等待时间放在配方表中,让生成的程序引用这一项。

这一课使用原有“延时指令”,分别生成一条固定延时和一条配方延时。先看操作结果,再解释表格、参数和原脚本怎样配合。页面、按钮和生成脚本都沿用标准工程。

1.先找到配方表和指令参数

打开主界面的“教导”,在左侧选择“配方参数表”,在右侧选择“延时指令”。左边管理可重复使用的配方数据,右边决定本条指令怎样使用这些数据。

图1:教导页面中的配方参数表和延时指令,左侧可载入、保存配方,右侧生成代码行

点击截图可查看原图。

本课只使用“单行延时”,不混入“设置时间戳”和“段落延时”。“程序行号”前的“选取”保持未勾选,生成的代码不带N行号。

以下步骤会在练习副本中调整配方并生成两条新记录。开始前保存原有教导程序和配方,使用空白程序进行练习;如果配方里已有其他用途的数据,不要直接将它的数量缩小。

2.准备两个有名称的配方值

在“配方表参数数量”中输入 2,按回车。将两行名称和值依次填写为下表内容,每个输入框填写后按回车确认。

画面序号 参数名称 参数值 程序中的位置
1 延时时间 1.25 #1550.item[0]
2 备用延时 0.75 #1550.item[1]

图2:两个已有配方输入行分别填写名称和值,实数以三位小数显示

点击截图可查看原图。

这里先分清三个量:

配方表本身不把所有数值规定成秒。换成进给、位置或其他用途时,单位由使用它的指令决定,应在名称或配套说明中写清。

3.先生成一条固定数值的延时

右侧设置如下:

项目 选择或输入
延时策略 单行延时
延时时间(秒) 1.25,按回车确认
数据源 数值
程序行号 不勾选“选取”

图3:数据源选择数值时,参数值直接填写秒数

点击截图可查看原图。

左侧切回“程序”,按“生成代码行”,得到:

G04P1250

这一条的1250在生成时已经确定。原脚本将1.25秒乘1000并转为整数,写成G04的P值。以后修改配方表,不会改变这一行中的1250。

4.再生成一条引用配方的延时

生成第一条后,当前记录位置会移到下一条。保留“单行延时”,把延时时间这一行的“数据源”改成“配方参数索引”。原先填写秒数的输入框会变成名称下拉框,在其中选择“延时时间”。

图4:数据源选择配方参数索引后,从名称列表中选延时时间

点击截图可查看原图。

此时下拉框显示的是名称,但保存到指令工作参数中的数是 0。它表示“使用配方第1项”,不是“延时0秒”。切换数据源后要明确选择所需项,不要把之前填写的秒数继续当作有效下标。

再按“生成代码行”,左侧出现两条记录:

G04P1250
G04PINT[#1550.item[0]*1000]

图5:第1条写入固定数值,第2条保留配方引用和换算表达式

点击截图可查看原图。

第二条没有把1.25直接写进代码。它把“读取配方第1项,再乘1000转为整数”这件事留给NC解释器。

数据源 指令工作参数保存什么 生成什么 何时确定延时P值
数值 秒数1.25 G04P1250 生成代码时
配方参数索引 下标0 G04PINT[#1550.item[0]*1000] NC解释这条表达式时

5.同一行输入为什么能有两种含义

在 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",""]

它让表格重新按条件建立输入格,所以画面能从数字输入切换到名称选择。表格候选和条件的完整写法见教导表格篇。

6.原脚本怎样生成这两种代码

“生成代码行”运行 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"]

先看最重要的两句:

这里的引号决定了现在计算,还是先把表达式写进程序。如果定制时把引用分支改成先读取配方值再拼数字,就会把它变成生成时确定的固定值。

#1558 暂存拼好的行号、指令和参数三段;#1551.item[当前下标] 保存最终代码,.itemdesc[...] 提供程序表里的显示文字。

脚本还保留了时间戳和段落延时分支。它们的生成方式不同;不能把本课的秒数引用说明直接套到“设置时间戳”上。

7.选回原记录时,恢复的是下标

生成代码时,脚本除了保存可执行文字,还将编辑资料写进 #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"

第一句恢复数据源,第二句恢复输入内容。随后原页面根据数据源显示正确的输入方式。它不会把生成代码时的整张配方表恢复回来。

8.只改配方值,已有代码会怎样

切到“配方参数表”,把“延时时间”从1.25改为2.5,按回车;“备用延时”仍为0.75。

图6:只修改配方第1项的数值,保留名称和位置

点击截图可查看原图。

切回“程序”,先选第1条,再选第2条。右侧仍显示“配方参数索引”和“延时时间”,因为记录保存的是下标0。

图7:选回第2条记录后,恢复配方数据源和名称选择,不把2.5复制到指令工作参数

点击截图可查看原图。

这一步不再按“生成代码行”。查看左侧,原来的两条代码仍然保持不变:

图8:修改配方后,两条程序记录的文字都没有变化

点击截图可查看原图。

重新解释前的第1项配方值 固定行 G04P1250 引用行的P表达式结果
1.25 1250 1250
2.5 1250 2500

这就是配方引用的用途:保留相同的程序结构,在加工前准备不同的数值。只有保留引用的行才读取新配方;固定数字行不会跟着变化。

如果改的是“选用哪一项”,例如从“延时时间”改成“备用延时”,则修改了指令工作参数,必须对当前记录重新按“生成代码行”。生成结果才会从 [0] 变成 [1]。此后还要重新“加载代码”,让加工文件包含修改后的记录。

配方应在启动前确认。NC解释与实际执行有先后关系,不要在加工过程中修改配方并假定它一定从眼前这一行立即生效。

9.加载代码为什么没有带入配方数值

按“加载代码”,标准 env/teach/codeGenerate 将已记录代码输出到 env/teach/doc/program.nc,并在程序页面显示:

图9:加载后的program.nc仍保留第2行的配方引用

点击截图可查看原图。

负责输出的原命令是:

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],它不会在配方里搜索“延时时间”这个名字。配方的完整文件操作见下一课教导记录与文件。

10.数量、名称和下标改变时怎样处理

本例只有两项配方,所以右侧提供名称下拉框。标准表格在配方数量不大于20时使用这种方式;超过20项时改成输入整数下标,具体条件已在教导表格篇展开。

使用时抓住以下关系:

改了什么 对原引用的影响 需要做什么
同一项的数值 [0]仍指向该项,下次解释读取新值 启动前确认新值,需长期保留时保存配方
同一项的名称 代码仍引用原下标 名称便于识别,不代替下标约定
指令选择的配方项 工作参数中的下标改变 重新生成当前记录,再加载代码
配方中各项的用途或排列 同一下标可能代表其他含义 核对所有引用该位置的程序
缩小配方数量 可能删掉仍被引用的项 先查引用并备份,不能仅看下拉框还能显示什么
载入另一份配方 原代码仍使用相同下标 核对数量、位置、单位和数值

整数输入中的0仍表示第1项。只有两项时,有效下标是0和1;不能把画面序号2直接当作第2项的下标,也不能用负数表示“未选择”。

11.从这个设计学到的组态方法

这个原功能把操作者容易理解的名称与程序需要的下标连接起来,又由数据源选择决定代码写固定值还是写参数引用。阅读其他指令时,可以依次找:

  1. 数值存放在哪里。 本例在 #1550.item[...],名称在 .itemtitle[...]。
  2. 指令工作参数保存什么。 既要看 .item[...],也要看决定它含义的 .itemversion[...]。
  3. 输入格怎样变化。 看 -T、-C 与数据源改变后的刷新脚本。
  4. 生成脚本写了什么。 引号内的表达式是留给NC解释的文字;引号外的计算在当前脚本中完成。
  5. 记录怎样恢复、文件保存什么。 指令记录、配方数据、NC输出各有职责,不能认为保存其中一份就保存了全部。

常见现象可这样排查:

现象 检查位置
改了配方,延时仍是固定值 记录是否仍为 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。先沿本例读懂它们怎样配合,再将相同方法用于其他已经支持配方数据源的指令。

上一课:直线与空间圆弧 · 下一课:编辑、保存和重新打开 · 阅读目录