赛科(天津)智能科技有限公司
二次开发手册

首页>支持与服务>二次开发手册

二次开发手册

参数窗口里的输入行,是怎样做出来的

发布时间:2026-10-16 点击次数:1004

下载中英双语离线手册(ZIP,8.7 MB,含原始分辨率截图)

阅读目录 · English

上一篇解释了页面怎样显示参数。这一篇再往前走一步:操作者在窗口里输入一个数,软件怎样知道它属于哪个参数,又怎样把它交给后面的宏程序使用。

我们用已有的“内孔心探测参数配置”窗口来读设计。它已经有名称、输入值、说明、单位和下拉选项,本篇不增加按钮、参数或新的探测功能,也不要求执行探测动作。

1.先看这个现成窗口

图1:标准内孔心探测参数窗口,显示原有的11行参数及操作说明

点击截图可放大查看,原始分辨率图片见离线包。

图 1 原生 env/macroParam.ui 读取内孔心探测的参数后形成的窗口。图中的端口为 0,表示未分配;其他数值用于讲解现有设计,不是机床调试推荐值。底部按钮实际显示 OK 和 Cancel,下文分别称为确认和取消。

先观察四处:

  • 顶部是“内孔心探测参数配置”,底部是一段操作说明。
  • 中间有“参数名称”“参数值 value”“参数描述 description”“单位 unit”等列。
  • “精探次数”显示 3,“X正向预置距离”显示 3.000,两种输入使用不同的参数类型。
  • 左边的编号是 0、1、3、4……11,没有 2。这不是漏画了一行,后面会解释原因。

从哪里进入? 标准功能库已有“内孔心/探测”,对应功能定义 #911.itemdesc[50],调用 customprobe/centerprobing.nc。如果客户面板已经配置了这个功能键,就从该键进入。当前核对的 setting-env 没有把 50 号功能放入右侧面板的 36 个位置,所以不能把它写成所有用户都有的固定按钮,也不能把“自动测量”按钮当作同一入口。如何把已有功能放到面板上,留到下一篇功能键区讲解。

本课可以对照文件和图片学习参数窗口的设计。实际使用探测功能前,应先完成对应功能键和机台参数的配置。

2.先找到四份文件

下面的路径都相对于软件运行目录。

文件 本例中看什么
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 面向功能使用者,主要填写已经定义好的参数值。两个文件名相近,打开的用途不同。

3.打开前,宏程序先选中哪一组参数

centerprobing.nc 开头到请求打开窗口为止,原文如下。这是完整的开窗前段,后面还有探测动作,不能把整份 NC 当作普通界面练习来运行。

#2500=2050

^2500.item[0]=#902.item[42]
^2500.item[1]=#902.itemmax[42]

MarcoDialog "/env/macroParam.ui"

按执行顺序读这四条语句:

  1. #2500=2050:本次窗口使用第 2050 号参数。
  2. ^2500.item[0]=#902.item[42]:把系统配置的 3D 探测信号端口复制到本次输入的第 0 项。
  3. ^2500.item[1]=#902.itemmax[42]:把相应有效状态复制到第 1 项。这里 .itemmax[42] 被标准组态用于存有效状态,不能只按字段名字把它解释成“端口最大值”。
  4. 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 是共享参数,不是每个窗口各有一份。这个窗口仍在使用它时,另一个脚本如果把它改成其他编号,读写目标就可能改变。应结束当前编辑过程,再选择下一组参数并建立窗口。

4.把一项参数定义完整地读下来

历史部署脚本 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 下拉选择框 探针有效状态;未显示的探测类型

这是本窗口如何使用类型的规则。类型还影响数值转换和显示,不能只为改变外观就随意改动已有参数类型。

5.UI 怎样把这些定义变成表格

用 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。这也解释了为什么换一组参数后,同一个窗口可以换标题、换说明、换输入行。

6.为什么有12个子项,窗口只显示11行

第 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 明确写出的条件;不能据此认定所有页面都用它控制可见性。

7.输入以后,写回哪里

下面以参数输入为例,观察填写内容怎样写入参数。填写与提交参数本身不等于启动探测。

  1. 在“精探次数”的值列输入 4,然后离开该输入框。
  2. 在“X正向预置距离”的值列输入 4.5,再离开该输入框。
  3. 将“探针有效状态”选择为“断开”。这一步仅用于核对选项编号,机床上的选择应按实际接线确定。

图2:原生表格输入后,精探次数为4、X正向预置距离为4.500、有效状态为断开

点击截图可放大查看,原始分辨率图片见离线包。

图 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。

8.取消、再次打开、再次进入功能,有什么区别

图 1 的 Cancel 会关闭窗口,但这个通用窗口没有“自动恢复打开前所有值”的处理。上述输入提交后再取消,内存中的次数 4、距离 4.5 和状态编号 1 仍保留。

还要区分两种“再打开”:

动作 探针有效状态 精探次数、X正向预置距离
取消后,仅重新建立窗口,仍读取当前 #2050 仍为“断开” 仍为 4、4.500
重新经过 centerprobing.nc 的开头准备,再建立窗口 从 #902.itemmax[42] 重新复制;本次又显示“接通” 开头没有重写这两项,仍为 4、4.500

第二种情况看起来像“取消恢复了某个值”,实际是下一次入口又给它赋值了。判断某项是否保留,要同时看输入是否提交、入口是否重新赋值,不能只看按钮名称。

这里说的是本次程序中的内存。把数据保存到文件、退出软件、下次启动后再读回,是另一个过程;不能把 OK 自动理解为保存到磁盘。

如果今后某个客户功能要求“取消必须撤销全部输入”,就需要另外安排临时输入数据,确认后检查并写入正式数据。当前标准窗口不自带这一行为,本篇也没有新增它。

9.窗口填好后,NC 怎样使用参数

窗口并不执行内孔心探测。后面的 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”正是业务程序自己的处理,也不代表全部距离和速度都已校验。

实际探测还涉及信号、防撞、位置和运动时序。本章没有执行这些动作,不能据窗口输入核对推断机床探测已经通过验证。

10.中英文窗口为什么有些文字不一样

中文包和英文包改变的是同一组参数的文字。例如英文包中有:

#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 只能帮助追溯最初的定义;它后续不再执行,所以只改这个历史文件中的名称不会影响当前页面。若在当前参数中改了名称,而语言包随后又给同一字段赋值,页面则会显示后一次赋的文字。

11.怎样自己把整个设计读通

先完成这五个核对动作,不需要启动探测:

  1. 在 centerprobing.nc 找到 #2500=2050,说明本次选中哪组参数。
  2. 在历史部署脚本 center-install 找到第 6、7、1 项,分别解释整数、实数和选项当初如何定义,并与当前参数对照。
  3. 在 macroParam.ui 找到 tableWidget,把五列与名称、值、说明、单位一一对应。
  4. 找到第 2 项的 itemversion 和 UI 过滤条件,解释为什么屏幕缺少编号 2。
  5. 对照图 2,指出三处输入各自写回哪里,再解释重新进入时为什么只有有效状态重新从系统配置取得。

遇到问题,可按现象查:

现象 先查哪里
找不到“内孔心/探测”按钮 该功能是否已分配到当前面板;功能定义存在不等于按钮已摆出来
窗口标题和输入项属于另一个功能 开窗前的 #2500,以及窗口使用期间有没有别处改写它
定义了子项却不显示 itemnum 是否包括它;它的 itemversion 是否符合本表过滤条件
隐藏一项后,自己写的程序读到了别的值 是否错误地按可见行重新编号;应保持原始子项编号
选项变成普通数值框 itemtype 是否为 4,itemunit 是否包含正确的 << 选项串
取消后数值仍变了 输入是否已提交;当前窗口不会自动撤销已提交值
再次进入时只有部分数值变化 查开窗前的赋值,本例第 0、1 项每次从系统配置复制
改了名称,下次又变回去 当前语言包或其他准备脚本是否又给该字段赋值
改了 center-install,重启后窗口没有变化 这是历史部署遗留文件,后续不再调用;修改它不会自动更新当前参数
填了上下限,仍能提交超出范围的值 检查真正使用数值前的校验,不能只依赖范围字段

下一篇继续看 标准功能键区:已有功能怎样成为面板上的按钮,开发者怎样选择它,按钮又怎样找到对应脚本。

上一课:文字、数值和状态 · 下一课:功能键配置 · 阅读目录

Copyright © 2018-2024 赛科(天津)智能科技有限公司 All Rights Reserved.

在线咨询