下载中英双语离线手册(ZIP,8.7 MB,含原始分辨率截图)
上一篇解释了页面怎样显示参数。这一篇再往前走一步:操作者在窗口里输入一个数,软件怎样知道它属于哪个参数,又怎样把它交给后面的宏程序使用。
我们用已有的“内孔心探测参数配置”窗口来读设计。它已经有名称、输入值、说明、单位和下拉选项,本篇不增加按钮、参数或新的探测功能,也不要求执行探测动作。
点击截图可放大查看,原始分辨率图片见离线包。
图 1 原生 env/macroParam.ui 读取内孔心探测的参数后形成的窗口。图中的端口为 0,表示未分配;其他数值用于讲解现有设计,不是机床调试推荐值。底部按钮实际显示 OK 和 Cancel,下文分别称为确认和取消。
先观察四处:
3,“X正向预置距离”显示 3.000,两种输入使用不同的参数类型。0、1、3、4……11,没有 2。这不是漏画了一行,后面会解释原因。从哪里进入? 标准功能库已有“内孔心/探测”,对应功能定义 #911.itemdesc[50],调用 customprobe/centerprobing.nc。如果客户面板已经配置了这个功能键,就从该键进入。当前核对的 setting-env 没有把 50 号功能放入右侧面板的 36 个位置,所以不能把它写成所有用户都有的固定按钮,也不能把“自动测量”按钮当作同一入口。如何把已有功能放到面板上,留到下一篇功能键区讲解。
本课可以对照文件和图片学习参数窗口的设计。实际使用探测功能前,应先完成对应功能键和机台参数的配置。
下面的路径都相对于软件运行目录。
| 文件 | 本例中看什么 |
|---|---|
env/center/center-install |
历史组件部署留下的定义参考:当时怎样写入标题、子项数量、名称、类型、初始值和单位 |
env/customprobe/centerprobing.nc |
打开窗口前选择哪组参数、准备哪些值;窗口结束后怎样使用这些值 |
env/macroParam.ui |
一个通用窗口怎样按所选参数生成标题、表格和说明 |
env/i18n/translatPack-0、translatPack-1 |
中文和英文名称、说明、选项及单位文字 |
center-install 是以前组件部署留下的脚本,只在当时部署时调用过,后续不会再被调用。软件启动、打开参数窗口、执行探测,都不再依靠它重新定义这组参数。本篇保留它,是因为文件完整展示了相关宏变量当时的定义过程,适合用来学习。
日常运行使用的是已经保存在系统配置中的参数定义和数值。软件装载这些参数,语言包设置对应文字,centerprobing.nc 在开窗前准备本次要用的值,macroParam.ui 再读取它们生成窗口。要分清:历史部署脚本说明“这些参数当初怎样定义”,当前配置和实际执行的脚本说明“现在使用什么”。
因此,只修改磁盘上的 center-install 不会改变当前窗口,也不会在下次启动时自动生效。本课只把它当作定义过程的参考,不把它作为当前功能的运行步骤或修改入口。
env/interfaceconf/macrodialog.ui 是另一个窗口,用于开发者编辑参数定义。本篇的 macroParam.ui 面向功能使用者,主要填写已经定义好的参数值。两个文件名相近,打开的用途不同。
centerprobing.nc 开头到请求打开窗口为止,原文如下。这是完整的开窗前段,后面还有探测动作,不能把整份 NC 当作普通界面练习来运行。
#2500=2050
^2500.item[0]=#902.item[42]
^2500.item[1]=#902.itemmax[42]
MarcoDialog "/env/macroParam.ui"
按执行顺序读这四条语句:
#2500=2050:本次窗口使用第 2050 号参数。^2500.item[0]=#902.item[42]:把系统配置的 3D 探测信号端口复制到本次输入的第 0 项。^2500.item[1]=#902.itemmax[42]:把相应有效状态复制到第 1 项。这里 .itemmax[42] 被标准组态用于存有效状态,不能只按字段名字把它解释成“端口最大值”。MarcoDialog:请求打开原有的通用参数窗口。命令拼写就是 MarcoDialog。这里用的是 #902 的第 42 项,不能和另一套普通探测信号配置混用。信号和防撞动作的详细内容见 两种探测信号,本课继续看参数窗口。
#2500 和 ^2500 可以这样区分:
| 写法 | 在 #2500=2050 时读到什么 |
|---|---|
#2500 |
数字 2050 |
^2500.title |
第 2050 号参数的标题,相当于 #2050.title |
^2500.item[6] |
第 2050 号参数的第 6 项,相当于 #2050.item[6] |
所以,窗口不必把 2050 写死在每个控件中。先把要编辑的参数号放到 #2500,窗口再通过 ^2500 找到它。其他功能可以选择自己的参数号,复用同一个 UI 文件。
#2500 是共享参数,不是每个窗口各有一份。这个窗口仍在使用它时,另一个脚本如果把它改成其他编号,读写目标就可能改变。应结束当前编辑过程,再选择下一组参数并建立窗口。
历史部署脚本 center-install 当时用 #2050.itemnum=12 定义了 12 个子项,编号是 0~11。当前配置中也保留了这 12 个子项。下面借原文件读懂“精探次数”的完整定义:
#2050.itemtitle[6]="精探次数"
#2050.itemdesc[6]=""
#2050.item[6]=3
#2050.itemunit[6]=""
#2050.itemtype[6]=3
| 字段 | 这一行告诉软件什么 |
|---|---|
itemtitle[6] |
名称显示“精探次数” |
itemdesc[6] |
这项没有另写说明 |
item[6] |
初始值为 3,操作者提交的新值也写回这里 |
itemunit[6] |
单位列留空 |
itemtype[6] |
类型编号 3,本表使用整数输入框 |
再看一个带小数和单位的输入:
#2050.itemtitle[7]="X正向预置距离"
#2050.itemdesc[7]="X正向探测开始前,正向移动此距离后再开始探测"
#2050.item[7]=3
#2050.itemunit[7]="mm"
#2050.itemtype[7]=2
它的值同样从 3 开始,但类型是 2,按实数显示,所以图 1 中为 3.000。单位文字放在另一列,输入框内仍是数值。
这些赋值说明当时怎样建立参数。图中的当前值来自本次装载的配置;客户后来如果修改并保存了参数,应以自己的当前配置为准,不能拿历史脚本里的初始值代替当前值。
下拉选项则这样定义:
#2050.itemtitle[1]="探针有效状态"
#2050.itemdesc[1]="常开型探针选择接通 常闭型探针选择断开"
#2050.item[1]=0
#2050.itemunit[1]="接通<<断开"
#2050.itemtype[1]=4
类型 4 使本表创建下拉框;此时 itemunit 存放选项文字,用 << 分隔。第一项“接通”对应数值 0,第二项“断开”对应数值 1。程序保存的是编号,不是这两个汉字。
“探针有效状态”设置的是把哪种电平当作有效,不能把框里显示“接通”理解为探针此刻已触发。 上一篇的控制卡连接状态也不是这里的字段。
本例用到的三种类型就可以整理为:
itemtype |
本窗口提供什么 | 本例 |
|---|---|---|
2 |
可输入小数的数值框 | X/Y 预置距离、探测回退距离 |
3 |
整数数值框 | 端口、速度、精探次数 |
4 |
下拉选择框 | 探针有效状态;未显示的探测类型 |
这是本窗口如何使用类型的规则。类型还影响数值转换和显示,不能只为改变外观就随意改动已有参数类型。
用 Qt Designer 打开 env/macroParam.ui,找到 tableWidget,查看 accessibleDescription。这个属性存放本表的组态写法,完整内容如下:
{
-标题:(#9500_itemtitle0),0
-标题:(#9500_itemtitle1),300,6
-标题:(#9500_itemtitle7),200,6
-标题:(#9500_itemtitle3)
-标题:(#9500_itemtitle8),120
-属性:-D
}
{
-过滤器:^2500.itemversion%%==0
-rows:^2500.itemnum
-serial:0
-列:-T(%%)
-列:-T(^2500.itemtitle%0)
-列:-T(^2500.item%0) -D
-列:
-T(^2500.itemdesc%0)
-列:
-T(^2500.itemunit%0)
-参数("")
-条件,1(^2500_itemtype%0==4)
-条件,0(^2500_itemtype%0!=4)
}
先分两段读。第一段规定五列的标题和列设置,标题文字来自 #9500。本次保持原设置,不需要先记住所有列布局选项。
第二段告诉软件:遍历所选参数的子项,为符合条件的每一项建立一行。五列依次是:
| 列 | 读取什么 | 第 7 项的例子 |
|---|---|---|
| 参数编号 | %% |
7 |
| 参数名称 | ^2500.itemtitle%0 |
X正向预置距离 |
| 参数值 value | ^2500.item%0 |
3.000,可输入 |
| 参数描述 description | ^2500.itemdesc%0 |
这项距离的说明 |
| 单位 unit | ^2500.itemunit%0,另有类型条件 |
mm |
这里的 %% 表示当前生成到哪个原始子项。%0 表示相对当前行对应子项偏移 0;本表按默认间隔 1 遍历,所以第 7 项这一行就读取第 7 项的名称、值、说明和单位。它们是这张表的 UI 写法,普通脚本仍用 .item[7] 这样的写法。
值这一列没有分别指定“次数画输入框、状态画下拉框”。软件读到参数后,根据它的 itemtype 选择控件。因此定义参数类型也是设计输入界面的一部分。
单位列最后三行处理一个例外:类型 4 时显示空字符串,其他类型显示单位。这样,“接通<<断开”已经进入下拉框,不会再作为单位整串显示一次。-D 使相关显示继续更新,它不表示禁止输入。
标题和下方操作说明则是另外两个标签的设置:
-T(^2500_title) -D
-T(^2500_description) -D
前一个在 label_2,读取 #2050.title;后一个在 label,读取 #2050.description。这也解释了为什么换一组参数后,同一个窗口可以换标题、换说明、换输入行。
第 2 项在原定义中是:
#2050.itemtitle[2]="探测类型"
#2050.itemdesc[2]=""
#2050.item[2]=0
#2050.itemunit[2]="内轮廓<<外轮廓"
#2050.itemtype[2]=4
#2050.itemversion[2]=1
表格的条件是 ^2500.itemversion%%==0。第 2 项的标记为 1,不符合条件,所以不建立显示行;第 3 项仍然是第 3 项。
本例完整对应关系如下,读代码时可以用它对照图 1:
| 原始子项 | 名称 | 显示情况 |
|---|---|---|
| 0 | 探针端口 | 显示 |
| 1 | 探针有效状态 | 显示 |
| 2 | 探测类型 | 隐藏,数据仍保留 |
| 3 | 粗探速度 | 显示 |
| 4 | 精探速度 | 显示 |
| 5 | 移动速度 | 显示 |
| 6 | 精探次数 | 显示 |
| 7 | X正向预置距离 | 显示 |
| 8 | X负向预置距离 | 显示 |
| 9 | Y正向预置距离 | 显示 |
| 10 | Y负向预置距离 | 显示 |
| 11 | 探测回退距离 | 显示 |
“精探次数”虽然是屏幕上从上往下数的第 6 行,它仍对应 #2050.item[6];不要改成 #2050.item[5]。隐藏是本表选择不显示这一项,既没有删除数据,也没有给后面的子项重新编号。
itemversion 在这里用来决定显示,是这份 UI 明确写出的条件;不能据此认定所有页面都用它控制可见性。
下面以参数输入为例,观察填写内容怎样写入参数。填写与提交参数本身不等于启动探测。
4,然后离开该输入框。4.5,再离开该输入框。点击截图可放大查看,原始分辨率图片见离线包。
图 2 同一个窗口提交输入后的标题与表格区域,直接从原生窗口截取。
| 输入位置 | 图 2 显示 | 已写入的字段和值 |
|---|---|---|
| 精探次数 | 4 |
#2050.item[6]=4 |
| X正向预置距离 | 4.500 |
#2050.item[7]=4.5 |
| 探针有效状态 | 断开 | #2050.item[1]=1 |
本表的文本输入框在离开输入框时提交,选项框在选择改变时写回。不必等到点击确认,这些值就可能已经进入参数。 不要把鼠标仍停在编辑框内的未提交文字当作已保存数据。
此时第 2 项仍保持原值,第 5 项“移动速度”也仍为 1500。这说明隐藏项没有造成写错位置。输入 4.5 后显示为 4.500 则是实数显示格式,参数值没有乘以 1000。
图 1 的 Cancel 会关闭窗口,但这个通用窗口没有“自动恢复打开前所有值”的处理。上述输入提交后再取消,内存中的次数 4、距离 4.5 和状态编号 1 仍保留。
还要区分两种“再打开”:
| 动作 | 探针有效状态 | 精探次数、X正向预置距离 |
|---|---|---|
取消后,仅重新建立窗口,仍读取当前 #2050 |
仍为“断开” | 仍为 4、4.500 |
重新经过 centerprobing.nc 的开头准备,再建立窗口 |
从 #902.itemmax[42] 重新复制;本次又显示“接通” |
开头没有重写这两项,仍为 4、4.500 |
第二种情况看起来像“取消恢复了某个值”,实际是下一次入口又给它赋值了。判断某项是否保留,要同时看输入是否提交、入口是否重新赋值,不能只看按钮名称。
这里说的是本次程序中的内存。把数据保存到文件、退出软件、下次启动后再读回,是另一个过程;不能把 OK 自动理解为保存到磁盘。
如果今后某个客户功能要求“取消必须撤销全部输入”,就需要另外安排临时输入数据,确认后检查并写入正式数据。当前标准窗口不自带这一行为,本篇也没有新增它。
窗口并不执行内孔心探测。后面的 centerprobing.nc 继续读取同一组数据。例如原文件中的这一句:
IF^2500.item[6]<=0THEN^2500.item[6]=1
它把不大于 0 的精探次数改为 1。后面的重复探测使用第 6 项控制次数,预置移动使用第 7~10 项,速度则读取第 3~5 项。读者由此可以把“窗口填写”和“宏程序使用”接起来:填写的不是另一套界面专用数值,而是后面程序将要读取的参数。
开窗前段与后续动作之间,还要守住一个规则:本例是 NC 中的 MarcoDialog。 当前 NC 规划执行会等窗口处理结束,并根据确认或取消结果处理后续流程;取消的具体暂停/复位处理与构建分支有关,不能理解为无条件带着新参数继续探测。
如果把同名命令写进普通 Qt 组态脚本,它发出开窗请求后就返回。不能照搬为“开窗下一行立刻计算”,并认为那时用户已经填好。Qt 页面中需要把后续计算安排到用户完成输入之后的操作中。详细依据见 两种开窗方式。
另一个容易误解的地方是范围检查。类型决定输入方式,不等于工艺参数已经检查合格。 当前通用表格数值框没有自动启用基于 itemmin/itemmax 的数值校验,不能只填写最小值、最大值就认为所有越界输入都会被拦住。例子中“次数不大于 0 就改为 1”正是业务程序自己的处理,也不代表全部距离和速度都已校验。
实际探测还涉及信号、防撞、位置和运动时序。本章没有执行这些动作,不能据窗口输入核对推断机床探测已经通过验证。
中文包和英文包改变的是同一组参数的文字。例如英文包中有:
#2050.itemtitle[6]="Fine Detection Count"
#2050.itemtitle[7]="X+ Distance"
因此英文窗口仍读写第 6 项和第 7 项,名称换成了 Fine Detection Count 和 X+ Distance。英文版标题为 Inner Hole Detection Settings,有效状态选项为 Connected、Disconnected;英文教程按这些实际文字讲解。
当前语言包还有一个需要如实保留的差别:中文距离单位显示 mm,英文显示 unit;速度分别显示 mm/min 和 unit/min。这是语言包里的文字,不能据此认定切换语言已经换算了长度或速度。本次两种语言的底层数值相同。
查当前名称时,应看已经装载的参数和实际执行的语言包。center-install 只能帮助追溯最初的定义;它后续不再执行,所以只改这个历史文件中的名称不会影响当前页面。若在当前参数中改了名称,而语言包随后又给同一字段赋值,页面则会显示后一次赋的文字。
先完成这五个核对动作,不需要启动探测:
centerprobing.nc 找到 #2500=2050,说明本次选中哪组参数。center-install 找到第 6、7、1 项,分别解释整数、实数和选项当初如何定义,并与当前参数对照。macroParam.ui 找到 tableWidget,把五列与名称、值、说明、单位一一对应。itemversion 和 UI 过滤条件,解释为什么屏幕缺少编号 2。遇到问题,可按现象查:
| 现象 | 先查哪里 |
|---|---|
| 找不到“内孔心/探测”按钮 | 该功能是否已分配到当前面板;功能定义存在不等于按钮已摆出来 |
| 窗口标题和输入项属于另一个功能 | 开窗前的 #2500,以及窗口使用期间有没有别处改写它 |
| 定义了子项却不显示 | itemnum 是否包括它;它的 itemversion 是否符合本表过滤条件 |
| 隐藏一项后,自己写的程序读到了别的值 | 是否错误地按可见行重新编号;应保持原始子项编号 |
| 选项变成普通数值框 | itemtype 是否为 4,itemunit 是否包含正确的 << 选项串 |
| 取消后数值仍变了 | 输入是否已提交;当前窗口不会自动撤销已提交值 |
| 再次进入时只有部分数值变化 | 查开窗前的赋值,本例第 0、1 项每次从系统配置复制 |
| 改了名称,下次又变回去 | 当前语言包或其他准备脚本是否又给该字段赋值 |
改了 center-install,重启后窗口没有变化 |
这是历史部署遗留文件,后续不再调用;修改它不会自动更新当前参数 |
| 填了上下限,仍能提交超出范围的值 | 检查真正使用数值前的校验,不能只依赖范围字段 |
下一篇继续看 标准功能键区:已有功能怎样成为面板上的按钮,开发者怎样选择它,按钮又怎样找到对应脚本。