下载中英双语离线手册(ZIP,8.7 MB,含原始分辨率截图)
上一课已经走通了程序启动、暂停、恢复和停止。本课回到主界面上方的长条显示区,解释这些状态怎样决定显示内容:有时是文件名和G代码,有时是过程提示,有时则显示闪烁的报警;点击后还可以清除信息或打开相关文件。
这些内容都放在同一个原生控件 progressBar_3 中。读懂它,就能学会:为一个显示区准备多种内容,按重要程度选择内容,同时配上颜色和点击动作。 本篇沿用现有UI与脚本。图中的文件名、行数、缓冲区数值和带“示例”的信息用于说明显示规则。
点击截图可放大查看,原始分辨率图片见离线包。
在 env/maininterface/maininterface.ui 中,这个控件的类型是 QProgressBar,名称是 progressBar_3。
先把它的四件事分开看:
| 看见或操作什么 | 由什么决定 |
|---|---|
| 长条填充多少 | 当前选中的 -T(...) 中,数值与上限的关系 |
| 长条里显示什么字 | 同一条 -T(...) 提供的文字 |
| 什么时候换内容、换颜色 | -C...(...) 的条件及排列顺序 |
| 点击、双击后做什么 | -A: 指定的脚本 |
因此,长条接近填满,不一定表示加工快结束。它也可能正在显示一条提示。
下面是该控件 accessibleDescription 中的原有规则。UI文件中的 <、& 等是XML保存形式;在属性编辑器中对应下面的 <、& 等字符。
-C1,2(#9997!=" "&✆==0)
-C3,2(#9997!=" "&✆==1)
-C2,4(#9997unit!=""&Ŀitem3==1)
-C0,3(#945item0==1)
-C0,0((#319.item3==1&Ŀ.item10==0)||(#319.item3==0&Ŀ.item7==1))
-C0,1(1)
-T(#9048.permission-#9048.channel<<#9048.permission<<" "<<" ["+#9047/"/"/":"+"] "+#324.item0)
-T(#[#337_item2].item19<<100<<" "<<" ["+#9047/"/"/":"+"] ")
-T(99<<100<<" "<<#9997)
-T(0<<100<<" "<<" ["+#9047/"/"/":"+"] ")
-T(99<<100<<" "<<#9997unit)
-A: (clickedEvent:/env/browseFile3[1])
-A: (dblClickedEvent:/env/browseFile5[1])
-D
先不急着逐字阅读。这里一共有五条 -T,从上到下编号为 0、1、2、3、4。六条 -C 决定选哪一条内容,-D 使显示持续更新,最后两种鼠标操作分别调用两个现成脚本。
原文中的 #9997unit 与 #9997.unit、#319item3 与 #319.item[3],分别是在读取同一处参数。后文解释时会采用容易辨认的带点写法,原代码保持原样。
-T 怎样同时给出长度和文字本控件的五条 -T 都用四段形式:
-T(当前值<<上限<<" "<<显示文字)
<< 在这里用于分隔各段,不能当成数值比较。
| 位置 | 本控件怎样使用 | 例子 |
|---|---|---|
| 第1段 | 进度条当前值 | 99 |
| 第2段 | 进度条上限;下限为0 | 100 |
| 第3段 | 本四段写法中的保留位置 | " " |
| 第4段 | 画在条形上的文字 | #9997 |
第三段在这个四段式进度条处理中不作为显示文字使用。保留原来的 " " 即可,不要删掉它再套用本表:段数不同,软件采用的处理方式也不同。
例如:
-T(99<<100<<" "<<#9997)
意思是将长条画到接近满格,并显示 #9997 中的文字。这里的99不是“已加工99%”。 文字里也不会自动增加“99%”,因为第四段已经指定了实际显示内容。
UI设计器中保存的 value=24 只是控件的初始属性。页面运行后的值由选中的 -T 规则更新,不能靠改这个24来改变加工进度的计算。
-T(#9048.permission-#9048.channel<<#9048.permission<<" "<<" ["+#9047/"/"/":"+"] "+#324.item0)
拆开以后就是:
| 内容 | 本例中的来源 |
|---|---|
| 当前值 | #9048.permission-#9048.channel |
| 上限 | #9048.permission |
| 方括号内的文件名 | 从 #9047 的路径文字中取出文件名 |
| 文件名后面的G代码 | #324.item[0] |
这里借用了 #9048 的两个属性保存显示资料:.permission 用作总行数,.channel 用作显示行的下标。在这条规则中,它们不表示操作者权限或通信通道。 要按当前功能的实际用法读变量,不能只看英文属性名称。
例如总行数是100、.channel 是30,条形当前值就是70,上限是100。该下标按零开始记录,对应行号31。
点击截图可放大查看,原始分辨率图片见离线包。
随着显示行向后推进,这个差值通常变小,所以这里采用的是逐渐缩短的表示方法。它依据程序行号,不考虑每行运动距离、进给速度或等待时间,不能用来估算还需加工多少分钟。
界面的文件名、行号和G代码由加工过程更新,并不是 progressBar_3 自己去执行或逐行读取程序。单段、子程序和不同加工方式也会影响这些资料的更新,不能把条形长度理解为所有加工任务的统一完成率。
这一种内容主要用于MDI执行期间:普通程序运行时看程序行进度,MDI执行时看插补缓冲区占用。 两者都使用这条长条,但所显示的数值含义不同。
先把决定这种区别的两条原规则放在一起看:
-C0,0((#319.item3==1&Ŀ.item10==0)||(#319.item3==0&Ŀ.item7==1))
-C0,1(1)
MDI启动时,#319.item[3]=1,#319.item[10]=1。第一行中的“启动且非MDI”不成立,“未启动且暂停”也不成立。因此,若前面没有报警、过程提示或RTCP手轮条件抢先选中,便由第二行选择内容1:
-T(#[#337_item2].item19<<100<<" "<<" ["+#9047/"/"/":"+"] ")
#337.item[2] 保存运动状态参数表的编号。假定其值为1021,表达式 #[#337_item2].item19 就是在读取 #1021.item[19]。这种“先取编号,再取该编号里的数据”的写法,避免把状态表编号固定写在UI中。
当前控制卡状态接收处理将FIFO中的数量换算成整数百分数:数量×100÷2048,再放入该字段。FIFO可以理解为等待后续处理的运动数据缓冲区。
点击截图可放大查看,原始分辨率图片见离线包。
缓冲区25表示这张状态表里的占用值,不表示MDI指令完成25%。条形随缓冲区中的数据量变化,不要求从0一直增加到100。
| 当前执行方式 | 启动状态 #319.item[3] |
MDI方式 #319.item[10] |
没有更优先信息时显示什么 |
|---|---|---|---|
| 普通程序运行 | 1 | 0 | 内容0:程序行进度及G代码 |
| MDI执行 | 1 | 1 | 内容1:插补缓冲区占用及文件名 |
这里的MDI也包括组态调用的NC动作。例如坐标输入篇中的 env/edit_x_end 指定 #404="edit_x.nc" 后,将MDI方式和启动状态都设为1。它执行的是坐标设置,不能因为条形没有明显填充,就认定这次MDI没有执行。
标准界面把缓冲区显示放在最后的固定条件 -C0,1(1) 中,因此它并不限于MDI:空闲、未暂停且没有其他更优先内容时,也会选中这一条。MDI是它的主要执行场景,兜底条件是它在UI中的实现方式。 条内文件名仍取自 #9047,不是直接读取MDI所用的 #404;例如执行 edit_x.nc 时,不能据此要求这里一定显示 edit_x.nc。
-T(99<<100<<" "<<#9997)
#9997 存放要显示的信息。控制器错误、程序解释错误和标准组态中的IO告警等,都可能向这里写入文字。它属于系统共用的信息位置,不能把它当作随意使用的计算结果变量。
-T(0<<100<<" "<<" ["+#9047/"/"/":"+"] ")
当 #945.item[0]==1,且没有更优先的信息时,显示值固定为0,上限为100,条内保留文件名。
点击截图可放大查看,原始分辨率图片见离线包。
这是为了在该方式下选择另一种显示内容。它并不表示RTCP计算失败,也不表示当前加工进度归零。本课只讲显示选择,RTCP手轮动作本身另见相应功能说明。
-T(99<<100<<" "<<#9997unit)
这里读的是 #9997.unit,不是 #9997 的主值。标准组态用同一个参数的不同位置,分别存放报警信息和过程提示。
点击截图可放大查看,原始分辨率图片见离线包。
unit 在此被用来存放提示文字,并不是毫米、度等物理单位。下一节先看它什么时候能显示出来,再追踪这些字由谁写入。
-C样式号,内容号(条件) 同时选择外观和内容。例如:
-C2,4(#9997unit!=""&Ŀitem3==1)
条件成立时,选样式2和内容4。这里的4是第五条 -T 的下标,不能误写成第四条。
对这个控件,要从上向下找第一条成立的条件。 后面的条件即使也成立,也不会取代前面已经选中的结果。
| 顺序 | 成立条件 | 样式 / 内容 | 操作者看见什么 |
|---|---|---|---|
| 1 | #9997!=" ",且 #9990==0 |
1 / 2 | 报警或调试文字,闪烁的第一种颜色 |
| 2 | #9997!=" ",且 #9990==1 |
3 / 2 | 同一条文字,闪烁的另一种颜色 |
| 3 | #9997.unit!="",且启动状态为1 |
2 / 4 | 过程提示 |
| 4 | #945.item[0]==1 |
0 / 3 | RTCP手轮方式的文件名显示 |
| 5 | 正在运行普通程序,或者启动状态为0而暂停状态为1 | 0 / 0 | 程序行进度及G代码 |
| 6 | 固定条件 1 |
0 / 1 | MDI执行时的缓冲区占用及文件名;空闲等未命中前项的状态也采用此内容 |
表中用到的三个加工状态为:
#319.item[3] 启动状态
#319.item[7] 暂停状态
#319.item[10] MDI方式
第5条的前半段要求“启动状态为1,且MDI方式为0”;后半段要求“启动状态为0,且暂停状态为1”。因此,普通程序暂停后,在没有更优先信息时,仍可选中程序行进度这条内容。MDI执行期间,启动状态和MDI方式都为1,第5条不成立,便由第6条显示缓冲区占用。若MDI过程中写入了过程提示,仍优先采用第3条;出现报警时则优先采用第1、2条。
最后的 -C0,1(1) 是兜底规则,必须放在这些条件后面。如果将它放在最前面,固定成立的 1 就会始终抢先选中内容1。
以标准 env/slib-6003.nc 中的这句为例:
#9997.unit=#1105.itemtitle[141]
它把一条已有的语言文字送进过程提示位置。同一个编号在两份语言包里分别定义为:
| 语言包 | #1105.itemtitle[141] |
|---|---|
env/i18n/translatPack-0 |
主轴停止检测... |
env/i18n/translatPack-1 |
Spindle stop detection... |
从程序到显示,按下面顺序理解:
#9997.unit。#319.item[3]==1。#9997.unit 清成 "",显示重新由后面的条件决定。原宏库中也有“写提示 → 处理过程 → 清提示”的配套用法。例如 env/slib-m.nc 的主轴相关代码中包含:
#9997.unit=#1107.itemtitle[60]
G04P#338.item[3]*1000
#9997.unit=""
这三行是原主轴流程中的一段,前后还有方式判断与其他动作。这里用它说明提示的设置和清除位置,不把它当作完整的主轴控制程序。一句提示只说明程序写入了这句话,不能替代实际到位、转速或信号判断。 提示文字的更新也不等于后面的设备动作已经完成。
另外,env/timer 在启动状态为0时会清除 #9997.unit。要区分两件事:控件的条件决定这句话当前能不能显示;流程中的清除语句决定这句话还保不保留。即使一句旧提示仍留在参数中,启动状态为0时,第3条显示条件也不成立。
很快写入又清除的文字,可能来不及被人看见。设计过程提示时,应让它对应一个有明确开始和结束的过程,而不是为了让文字停留就随意给加工动作增加延时。
前两条条件都选择内容2,却分别选择样式1和样式3:
-C1,2(#9997!=" "&✆==0)
-C3,2(#9997!=" "&✆==1)
#9990 的主值由软件周期性地在0、1之间切换。正常计时下约每0.3秒换一次,控件便交替采用两种颜色。
原控件样式中的关键设置如下;chunk 表示已经填充的那一段:
QProgressBar::chunk[style="1"] { background: #FFFF00; }
QProgressBar::chunk[style="3"] { background: #FFFF00; }
QProgressBar[style="0"] {
background: #FFFFFF; color: #000000;
text-align: left; font-weight: bold;
}
QProgressBar[style="1"] {
background: #FFFF00; color: #FF0000;
text-align: left; font-weight: bold;
}
QProgressBar[style="2"] {
background: #FFFFFF; color: #FFFF3B;
text-align: left; font-weight: bold;
}
QProgressBar[style="3"] {
background: #FFFFFF; color: #FFFF00;
text-align: left; font-weight: bold;
}
点击截图可放大查看,原始分辨率图片见离线包。
点击截图可放大查看,原始分辨率图片见离线包。
图7不是把信息清除了:参数中仍有原来的文字,只是文字与其下面的填充颜色相同。下一次切回样式1,就又能看到红字。
样式2使用黄色提示文字;它没有在这段样式中另行指定黄色填充,所以图5仍是原界面默认的蓝色条形。不要把文字颜色、控件背景和填充颜色混为一谈。
还有一个非常容易漏看的规则:
| 位置 | 原设计用什么表示“没有内容” |
|---|---|
报警主值 #9997 |
" ",引号中有一个空格 |
过程提示 #9997.unit |
"",引号中没有字符 |
若把报警主值清成 "",它仍然不等于 " ",前面的报警条件会继续成立,可能出现“没有字却还在闪”的现象。阅读或修改这类判断时,空格也是数据的一部分。
原事件配置是:
-A: (clickedEvent:/env/browseFile3[1])
它调用的 env/browseFile3 完整内容为:
IF#9997==" "GOTO1
IF#9997.item[1]==-1GOTO1
system[#418,9997,0]
N1
#9997=" "
#9997.item[0]=" "
按宏程序的顺序读即可:
| 语句 | 做什么 |
|---|---|
| 第一行 | 没有信息时,跳过打开编辑器 |
| 第二行 | 行号为-1时,也跳过打开编辑器 |
system[...] |
启动 #418 指定的外部文本编辑器,将参数9997中的相关项作为命令行参数 |
N1后两行 |
清除显示信息,并清除所记录的文件名 |
错误信息不仅可以有一句话,还可以同时保留定位资料:
#9997 显示的信息
#9997.item[0] 关联文件名
#9997.item[1] 关联行号;-1表示不按行号打开
发生程序解释错误时,软件会把文件和行号写到相应位置。这样,显示区既告诉操作者出了什么问题,又给开发人员保留了检查文件的入口。
system[#418,9997,0] 的第二个参数是数字9997,表示从参数表取调用资料;并不是把 #9997 中那句报警文字直接传给编辑器。它选取 itemversion 为0的项,将每项的 itemdesc 与值拼接后逐项传入。标准保存配置中,行号前缀为 -n,因此文件 bracket.nc、行号12可形成 bracket.nc 和 -n12 两个参数。具体前缀必须与所选外部编辑器一致。
外部程序启动是异步的。这段脚本发出启动请求后就继续清文字,不等待编辑器关闭,也不会等到文件已经修好才返回。因此,文字消失不能证明编辑器已成功打开,更不能证明错误已修复。
点击截图可放大查看,原始分辨率图片见离线包。
这也解释了为什么单击后不一定回到文件名:如果过程提示仍满足显示条件,就会先显示过程提示;否则继续向后选择。
需要注意,browseFile3 没有把 #9997.item[1] 清成-1。标准的 env/clearwaring 则另外包含这一句:
#9997=" "
#9997.item[0]=" "
#9997.item[1]=-1
两段脚本用途相近,但清除范围不同。按原设计解释即可,不能把它们说成完全相同。
清除显示文字不等于复位,也不等于消除实际故障。 例如IO异常仍存在时,标准监视脚本可能再次写入告警;标准 env/start 也会检查 #9997 是否为空格。处理错误时仍应查明产生信息的原因。
原配置及其脚本是:
-A: (dblClickedEvent:/env/browseFile5[1])
system[#418,#405+"input/in"+[#1031+1]+".nc",0]
这里使用的是另一个现成入口 env/browseFile5。它用 #405 提供的环境目录,再结合当前 #1031 的值,构成输入IO脚本的路径。
标准 env/param/iofunc.ui 中也会调用它,并在点击某一行时通过 #1031=%% 告诉它当前选的是哪一项。主界面的这个双击规则没有附带这句选行赋值,所以不能把它解释成“自动找到当前报警对应的输入”,更不能说它必然打开 #9047 中的加工文件。
文件名还有一个需要仔细看的地方:原脚本直接拼接 [#1031+1],没有用 INT[...] 转成整数文字。按当前解释器的数值拼接规则,#1031=2 时,这段可形成 input/in3.000.nc;而标准 env/timer 生成输入脚本名称时用了 INT[#1031.channel+1],生成的是 input/in3.nc 这一形式。使用该维护入口前,要核对实际生成的文件名和目录中的文件,不能只凭“第3项”就认为名称必然一致。
另一个细节是鼠标时序:这个进度条在鼠标按下时调用 clickedEvent;双击过程中,前面的第一次按下也会发生。因此,双击前若存在可定位的错误信息,可能先执行 browseFile3,再执行 browseFile5,产生两次外部程序启动请求。不要把单击和双击理解为必然互相排斥的两条操作。
假定正在运行普通程序,又先后出现过程提示和一条告警,显示选择可以这样理解:
| 先后发生的事情 | 控件选择 | 为什么 |
|---|---|---|
| 普通程序运行,报警与提示均为空 | 内容0 | 普通程序运行条件成立 |
宏程序写入 #9997.unit |
内容4 | 过程提示排在程序行进度前面 |
监视脚本又向 #9997 写入告警 |
内容2 | 报警条件排在过程提示前面 |
单击后,browseFile3 清除报警主值 |
内容4 | 启动状态和过程提示仍然满足条件 |
流程将 #9997.unit 清空 |
内容0 | 重新显示普通程序行进度 |
| 程序结束,启动和暂停状态均为0 | 内容1 | 若无其他更优先条件,采用兜底显示 |
这里没有“先把进度条隐藏,再显示另一个报警控件”的操作。始终是同一个控件,只是当前选用的内容和颜色发生了变化。
以后阅读或维护类似的显示区,可以按下面的顺序进行:
-T 从0开始编号,写清每条读哪个参数、显示什么文字、数值表示什么。这些技巧不要求重新画一套界面。原有参数、几条条件、一组内容和两个脚本,就完成了一个用途丰富的显示区。进行定制时,仍应沿用系统状态参数的原职责,不要为了改变显示效果直接修改启动、暂停、复位等状态。
常见现象可以沿下面的线索检查:
| 现象 | 先检查什么 |
|---|---|
| 总是显示文件名,不显示过程提示 | 提示是否写进 .unit;启动状态是否为1;前面是否还有报警 |
| 文字为空,但长条还在闪 | #9997 是否被清成了 "",而不是单空格 " " |
| 显示条接近满格,但加工刚开始 | 是否选中了99/100的提示内容,而不是程序行进度 |
| MDI执行时没有显示程序行进度 | 这是两种执行方式的显示区别;MDI通常显示缓冲区占用,有过程提示或报警时又会优先显示相应文字 |
| 越加工,条形越短 | 原公式使用“总行数减当前下标”,这是这套显示的方向 |
| 单击后又出现告警 | 写入告警的条件是否仍存在;清文字不会解除该条件 |
| 单击未打开文件 | 有没有有效行号,#418及命令行前缀是否适合当前编辑器 |
| 双击打开了意料外的文件 | 查看 browseFile5、#1031 当前值、数值拼接后的文件名及先前的单击动作 |
| 文件 | 在本设计中的作用 |
|---|---|
env/maininterface/maininterface.ui |
progressBar_3 的内容、条件、样式和事件 |
env/browseFile3 |
点击后按错误定位资料打开编辑器,并清除信息 |
env/browseFile5 |
根据输入IO下标构造外部编辑器的文件参数 |
env/clearwaring |
清除信息、文件名和行号 |
env/timer |
监视条件、产生部分告警,并在未启动时清除过程提示 |
env/slib-6003.nc、env/slib-m.nc |
加工宏写入过程提示的现成例子 |
env/i18n/translatPack-0、translatPack-1 |
中文和英文的提示文字 |
env/param/iofunc.ui |
输入IO页面怎样把选中下标交给 browseFile5 |
本课关注“显示什么、为什么换内容、点击后做什么”。启动、暂停、恢复和复位的操作流程可回看加工运行篇;system 的参数规则见外部程序扩展。接下来进入教导页面,学习怎样从输入参数生成程序。