自定义界面菜单,用于切换页面,执行页面内特殊动作
|
表示换行提示,当一行显示不下时,在此换行enable="#100"
,则只有当#100不等于0时才可以操作。当action为 页面跳转或页面选择时,enable表达式为0此菜单不显示。示教相关菜单应与teach控件联合使用
当菜单里没有设置组时,示教当前光标所在控件的组 (v3.2新增) 示教菜单或示教按钮里设置single可以只示教当前光标所在单个控件 (v3.7新增)
单轴示教时在参数位置直接写入示教绝对
,当光标停留在示教坐标数据的teach控件上时,菜单显示深色(可以响应按键),按下菜单时执行示教绝对坐标的动作。
示教轴组时写入示教绝对(group=x)
,x为相应的轴组号。
teach("#530", "x", (4, 1), group=2)
teach("#531", "y", (4, 2), group=2)
teach("#532", "z", (4, 3), group=2)
teach("#503", "X", (6, 1), group=1)
teach("#504", "Y", (6, 2), group=1)
teach("#533", "Z", (8, 1))
menu("单轴示教", 示教绝对(single=True)) #仅示教光标所在的单个控件,无论控件是否在组中
menu("示教组2", 示教绝对(group=2)) #光标停留在4行的任意1~3列对应的控件上时,此菜单可以响应按键。键按下时同时将#530~#532赋值为X/Y/Z轴的绝对坐标值
menu("示教组1", 示教绝对(group=1)) # 示教组1内的所有控件
menu("示教", 示教绝对) #光标停留在以上任意一个控件上时,此菜单可以响应按键。键按下时执行相应控件的示教绝对坐标动作
menu("示教绝对", 示教绝对) #当光标在#530位置时示教组2的所有控件,当光标在#503位置时视教组1的所有控件
单轴示教时在参数位置直接写入示教机床
,当光标停留在示教坐标数据的teach控件上时,菜单显示深色(可以响应按键),按下菜单时执行示教机床坐标的动作。示教轴组时写入示教机床(group=x)
,x为相应的轴组号。
teach("#530", "X", (4, 1), group=2)
teach("#531", "Y", (4, 2))
teach("#533", "Z", (4, 3), group=2)
menu("示教组2", 示教机床(group=2)) #光标停留在1/3行对应的控件上时,此菜单可以响应按键。键按下时同时将#530和#533赋值为X/Z轴的机床坐标值
menu("示教", 示教机床) #光标停留在以上任意一个控件上时,此菜单可以响应按键。键按下时执行相应控件的示教机床坐标动作
示教单个表达式时直接写入示教表达式
,当光标停留在示教表达式的teach控件上时,菜单显示深色(可以响应按键),按下菜单时执行示教表达式的动作。示教表达式组时写入示教表达式(group=x)
,x为相应的表达式组号。
teach("#530", "F156[s16]/100", (4, 1), group=2)
teach("#531", "F1805[u32]/1000", (4, 2))
teach("#533", "P414", (4, 3), group=2)
menu("示教组2", 示教表达式(group=2)) #光标停留在1/3行对应的控件上时,此菜单可以响应按键。键按下时同时将#530和#533赋值为对应表达式的计算结果
menu("示教", 示教表达式) #光标停留在以上任意一个控件上时,此菜单可以响应按键。键按下时计算表达式的值赋给宏变量
在以下3个菜单中定义2个变量$m和$v。$v为当前捕获光标的示教控件的编辑值,$m与$v的关系由菜单的类型决定。$m要用在teach控件的第二个参数中组成表达式,以实现通过编辑值改变控件值的目的。由于需要使用编辑值所以菜单要在控件有编辑值时才能响应按键。下图中的左侧图片显示data控件捕获光标,teach控件未捕获光标时的状态,此时底部的"测量"菜单不可用;右侧图片显示teach控件捕获光标并手动输入编辑值10的状态,此时$v的值为编辑值10,底部的"测量"菜单可以响应按键操作。 3个菜单的典型用法是和形如teach("#530", “#530 + $m”, (4, 1))的teach控件一起使用,第二个参数的形式不仅限于此,下面以这种形式为例讲解菜单的用法。
光标在非示教位置 | 光标在示教位置 |
---|---|
![]() |
![]() |
在测量菜单中$m= -$v,对于上面的形式按下菜单键时将当前控件值减去控件的编辑值作为控件的新值,类似测量功能。该参数非字符串类型,直接写作测量
。
teach("#530", "#530 + $m", (4, 1))
menu("测量", 测量) #菜单名称为"测量",当光标停留在上面的teach控件上,并输入了编辑值10时此菜单可以响应按键。键按下时相当于执行#530=#530-10
在加输入菜单中$m= $v,对于上面的形式按下菜单键时将当前控件值加上控件的编辑值作为控件的新值,类似 “+输入” 功能。该参数非字符串类型,直接写作加输入
。
teach("#530", "#530 + $m", (4, 1))
menu("+输入", 加输入) #菜单名称为"+输入",当光标停留在上面的teach控件上,并输入了编辑值10时此菜单可以响应按键。键按下时相当于执行#530=#530+10
在部分表达式中$m和$v的关系由表达式决定,$m=“表达式”,对于上面的形式按下菜单键时将当前控件值加上表达式计算结果值作为控件的新值。该参数非字符串类型,写作部分表达式("xxx")
,括号内的表达式为字符串类型。
teach("#530", "#530 + $m", (4, 1))
menu("测试", 部分表达式("$v - 3")) #菜单名称为"测试",当光标停留在上面的teach控件上,并输入了编辑值10时此菜单可以响应按键。键按下时相当于执行#530=#530+10-3
参数形式为:表达式("xxx")
,“xxx"是一个赋值表达式,如”#500=#501+1"。
menu("表达式", 表达式("#500=#501+1")) #菜单名称为"表达式",键按下时执行赋值动作
直接写入要跳转到的页面id,按菜单时会跳转到相应页面。此参数可以为字符串类型或数字,写作 "page1"
或1
。
with page(5, 4, id="page1"):
# ······
with page(5, 4, id="page2"):
# ······
menu("切换page1", "page1") #菜单名称为"切换page1",键按下时切换到id="page1"的页面
可以根据某一PLC参数的值跳转到相应页面。语法举例:页面选择("K100",{2: "page1", 4: "page2", 5: 3})
。“页面选择"函数中第一个参数类型为字符串,第二个参数类型为字典,字典中以逗号分隔的被称为"键”-“值"对,冒号前面的为"键”,后面的为"值"。按此菜单时,将根据PLC参数的值跳转到以与之相等的"键"对应的值为id的页面。当K100(此处仅支持PLC参数)的值为2/4/5时分别跳转到id为 “page1”/“page2”/3 的页面。此时PLC参数类型为U8,页面最多不要超过256个。当PLC参数的值不对应任何id时将跳转到第一个id对应的页面。
with page(5, 4, id="page1"):
# ······
with page(5, 4, id=2):
# ······
with page(5, 4, id="page3"):
# ······
menu("页面选择", 页面选择("K100",{2: "page1", 4: 2}) #菜单名称为"页面选择",当K100(此处仅支持PLC参数)的值为2/4时分别跳转到id为 "page1"/2的页面
面板相关菜单需配合panel控件共同使用,示例详见panel章节。
语法格式:显示面板("xxx")
,当使用者按下该按键时,将打开对应ID号的窗口,需配合panel控件使用。(V3.0新增)
例如:显示面板(“面板ID”),将以局部窗口形式打开ID为"面板ID1"的自定义面板
语法格式:关闭面板
,当使用者按下该按键时,会关闭当前的局部窗口,需配合panel控件使用。(V3.0新增)
用于弹出报警页面显示报警信息,写作 Action.alm_dlg
或 显示报警
。(V3.0新增)
menu("报警", 显示报警) ##按下该按钮时,弹出报警页面
menu("使用期限",使用期限)
切换到相应的工件坐标系。写作 工件坐标("G55")
。
工件坐标支持通道号 (V3.5新增)
menu("切换G55", 工件坐标("G55")) #菜单名称为"切换G55",键按下时执行切换到工件坐标系G55的操作
menu("坐标切换", action=工件坐标("G55", path="D20")) #通道号为表达式"D20"
将相应地址的位信号翻转(在0/1之间转换),写作 信号翻转("F5231.1")
,括号内为相应位参数的字符串,支持的数据与switch控件相同。
menu("翻转", 信号翻转("F5231.1")) #菜单名称为"翻转",键按下时将F5231.1翻转
按下时将相应数据位置为1,弹起时置为0。(V2.1开始支持)
信号脉冲("K1.1")
括号内必须是位型参数的字符串,支持的参数有K/D/F区位型参数(F区为相应版本对应的F区可写范围)。menu("信号脉冲", 信号脉冲("K1.1")) ##按下该按钮时,K1.1设置为1,弹起该按钮时设置为0
按下时经过设置时间后将相应数据位置为1,弹起时置为0 (V3.6开始支持)
action=定时脉冲("K1.3",1000)
第一参数表示PLC的位信号,第二个参数ms表示定时时间,单位为微秒,默认为500msmenu("脉冲K1.2", action=定时脉冲("K1.2", 1000)) # 菜单设置定时脉冲任务
action取值可以为 运行脚本或运行脚本文件,此参数非字符串类型,直接写作 运行脚本('''xxx''')
或运行脚本文件("xxx.xx")
,
为"运行脚本"时将若干符合KUI脚本语法的语句写在三引号中,为"运行脚本文件"将若干符合KUI脚本语法的语句写在一个文件中,在括号中写入文件名。
手动写lua文件时,内部变量请采用local,防止去自定义变量中查找导致程序出错
menu("TU2操作", action=运行脚本('''IF RESULT_YES==MSGBOX["是否执行TU2操作,选择执行将会执行TU2操作\\n选择取消将不会执行TU2操作\\n有疑问请咨询KND", MB_YESNOCANCEL, "提示"]
THEN SVOPR["TU2", "4"]
ENDIF'''))
menu("执行文件", action=运行脚本文件("测试脚本文件.txt"))
menu("lua文件", action=运行脚本文件("lua脚本.lua"))
如下图所示,对话框的标题为"提示",中间的文字内容在\\n处换行,下方软按键处有三个选项为"是"、“否"和"取消”。按下"是"软按键时的返回值为 RESULT_YES,将执行TU2指令。
程序支持注释,注释单独一行或程序段后,不能放入程序号后 (V3.5开始支持)
语法为: action=程序段模板('''xxx''')
,括号中的字符串为一个程序模板段,当操作者按下menu时,将以其为模板生成程序段,插入当前光标之后。程序模
板段可以包含任意符合KUI脚本语法的语句和一些会生成程序的模板语句,模板语句中的字符在生成程序时不变,变量则用其值来替代。例如 ''' G01 X#500'‘‘在
生成程序时(假设#500值为100),会生成程序"G01 X100;"。(V2.2开始支持)
menu("程序段", action=程序段模板('''G01 X#500 F#503
G0 X#v1;
//这是注释2
#501 = 12
WHILE #501 != 0 DO
G01 X#501 F#503
#501 = #501 -1
ENDIF''')) #执行此段程序将生成很多G01语句
语法为: action=运行MDI('''xxx''')
,括号中的字符串为一个程序段,当操作者按下menu时,将以其为模板生成MDI程序。程序模板段可以包含任意符合
KUI脚本语法的语句和一些会生成程序的模板语句,模板语句中的字符在生成程序时不变,变量则用其值来替代。例如 '’’ G01 X#500'‘‘在生成程序时
(假设#500值为100),会生成程序"G01 X100;"。(V2.4开始支持)
写作 生成程序("圆周钻孔.txt", 1)
,第一个参数为程序模板文件名称字符串(同一路径下直接写名称,不在同一路径下需要写全路径),第二个参数为生成的程
序号;生成程序时要打开程序开关,否则生成程序失败;在点击"生成程序"时程序模板文件中使用到的变量要有值,否则会报错。可见下方应用分析与举例
语法为: action=运行程序('''xxx''')
,括号中的字符串为一个程序模板段,当操作者按下menu时,将以其为模板生成程序并运行。程序模板段可以包含任意符合
KUI脚本语法的语句和一些会生成程序的模板语句,模板语句中的字符在生成程序时不变,变量则用其值来替代。例如 '’’ G01 X#500'''
在生成程序时(假设#500值为100),会生成程序"G01 X100;"。(V3.4开始支持)
程序号number支持表达式 (V3.5开始支持)
运行程序、运行MDI、生成程序支持通道号path;(V3.5开始支持)
运行程序和生成程序支持是否从文件中读取,通过is_file设置,格式见下方示例 (V3.5开始支持)
menu("运行程序", action=运行程序('''#v1=100
G0 X#v1;
G1 Y200 F1000;
#500=0
G0 X#500 Y#500
''', is_file=False, number="D10"))
menu("生成程序", action=生成程序("O001.txt", is_file=True, number=12))
menu("生成程序", action=生成程序("O1.txt", number="D26", path="D40")) #通道号为表达式"D40",程序号为表示式D26
menu("运行程序", action=运行程序("O1.txt", number=2, path=2)) #通道号为2
menu("运行MDI1", action=运行MDI('''G01X100F100;''', path=2)) #通道号为2
用于打开、删除程序 (V3.0新增)
程序操作("open")
程序操作("delete")
menu("打开程序",程序操作("open"))
menu("删除程序",程序操作("delete"))
用于U盘文件导入到系统里,写作 U盘输入
(V3.0新增)
用于将系统打包文件或系统软件输出到U盘里,写作 u盘输出
(V3.0新增)
menu("u盘输入",U盘输入)
menu("u盘输出",u盘输出("sys_dat")) # 输出系统打包文件
menu("u盘输出",u盘输出("sys_bin")) # 输出系统软件
焦点切换
动作,第一参数表示要切换的控件的ID, menu("焦点|切换", action=焦点切换(id="edl_grog_g71")) # 切换到edl_grog_g71控件
menu的一个特殊用法是定义一个根菜单。每一个自定义界面都由一个根菜单进入,需要定义一个根菜单。根菜单动作支持"页面跳转"和"页面选择"两种,不支持enable参数,且支持只写菜单名称一个参数,此时根菜单会自动捕捉第一个页面的id,按下根菜单 页面跳转到该页面。
定义在 with page():作用域之外的menu是根菜单。
如果省略根菜单的定义,将自动生成一个根菜单名称为"自定义",按下根菜单页面跳转到第一个定义的页面。
建议将根菜单定义在所有页面定义之前
根菜单支持“运行脚本” (v3.3新增)
为了排版方便,加入一种"占位符菜单",这种菜单没有名称,不响应按键,表现为一个空菜单。
写作 place_holder(n)
,n为正整数,定义n个连续的占位符菜单,n可以省略,默认值为1。 (V2.5新增)
将此函数和menu菜单函数放在一起使用,调用的先后顺序,决定了菜单的位置。
with page(9, 4, id="holder", text=(绿色, f32x16, 居中)):
msg_label((1, 1, 2, 4), 左对齐, 紫色, count=3)
place_holder(2) #定义两个连续的占位符菜单
menu("led", "led")
place_holder(3) #定义三个连续的占位符菜单
menu("AA", "AA")
为了排版方便,加入一种"弹簧菜单",这种菜单没有名称,不响应按键,表现为若干个空菜单。
写作 spring()
(V2.5新增)
将此函数和menu菜单函数放在一起使用,调用的先后顺序,决定了菜单的位置。使用弹簧菜单的页面,菜单个数(包括占位符菜单、弹簧菜单)不能超过8个 。1个弹簧菜单表示1个空菜单
个数原理: 弹簧在所有菜单之前,则所有菜单右对齐;菜单两边各有一个弹簧,则菜单居中对齐;一页中有多个弹簧菜单,则弹簧菜单均分页面中的空菜单,如果有余数,则将余数分给第一个弹簧菜单。
例:以8+2系统为例,系统共有8个菜单,其中有3个menu,8-3=5,5/3=1,5%3=2;所以第一个spring菜单表现为3个空菜单,后面两个spring菜单表现为1个空菜单。
with page(9, 4, id="holder", text=(绿色, f32x16, 居中)):
msg_label((1, 1, 2, 4), 左对齐, 紫色, count=3)
spring()
menu("led", "led")
spring()
menu("AA", "AA")
menu("BB", "BB")
spring()
占位菜单效果显示 | 弹簧菜单效果展示 |
---|---|
![]() |
![]() |
为了排版方便,加入一种菜单翻页,这种菜单没有名称,输入此函数后,该函数后的第一个菜单为下一页的第一项。当需要菜单翻页可以写作pagebreak()
。(V3.1新增)
当没有制定pagebreak时弹簧菜单仅在最后一页伸缩,否则依次绘制实际菜单。若想在特定处伸缩请使用pagebreak指定该菜单为页结尾
menu("设置PA5", action=运行脚本('''#["PA5-4"]=50'''))
menu("信号翻转", action=信号翻转("k1.1"), enable='#500+2')
menu("加输入", action=加输入, enable='#500+2')
pagebreak() #若为8+2补足5个,若为10+2补足7个
menu("赋值", 表达式("D207=2+D20*2+1"), enable="#100") #第二行的第一个
menu("设置PA5", action=运行脚本('''#["PA5-4"]=50'''))
menu("信号翻转", action=信号翻转("k1.1"), enable='#500+2')
spring()
menu("加输入", action=加输入, enable='#500+2') #若为8+2位于第8个,若为10+2位于第10个
pagebreak()
menu("赋值", 表达式("D207=2+D20*2+1"), enable="#100") #第二行的第一个
生成程序菜单可根据程序模板一键生成程序。适用于要实现某一特定功能,但是程序中的某些参数需要频繁更改或在操作时才能确定的情况。 例如,要实现在一个圆周上钻孔的特定功能,同时使操作者可以设定圆心位置、圆周半径、圆的数量、钻孔深度、主轴转速、加工方式等参数。 首先将这些可变的参数设定为KUI脚本的变量;然后将这些变量设定为data控件或teach控件的数据显示在页面上,使操作者可以编辑;最后根据这些变量和要实现的功能写一个符合KUI脚本语法的程序模板文件。下图展示了实现上述功能的自定义界面。
界面效果显示 | 生成的程序效果展示 |
---|---|
![]() |
![]() |
#此处仅写出必要的代码
with page(510, 792, id="主页面"):
picture("圆周钻孔.bmp", (1, 1, 510, 792))
teach("{v500}", "x", (50, 654, 30, 96), f20x10, group=1)#圆心点X轴坐标
teach("{v501}", "y", (90, 654, 30, 96), f20x10, group=1)#圆心点Y轴坐标
data("{v502}", (130, 654, 30, 96), 确认) #圆周半径
data("{v503}", (170, 654, 30, 96), f20x10, 确认) #圆周上孔的数量
data("{v504}", (210, 654, 30, 96), 确认) #第一个孔的角度
data("{v505}", (250, 654, 30, 96), 确认) #深度
data("{v506}", (290, 654, 30, 96), choices={81: "G81", 82: "G82", 83: "G83"}) #G81-82-83
data("{v507}", (330, 654, 30, 96), 确认) #主轴转速
data("{v508}", (370, 654, 30, 96), 确认) #R点距离
data("{v509}", (410, 654, 30, 96), 确认) #钻孔速度
data("{v510}", (450, 654, 30, 96), 确认) #孔间断Q值
menu("生成程序", 生成程序("圆周钻孔.txt", 1))#菜单名称为"生成程序",程序模板"圆周钻孔.txt"在当前目录下。在系统端按下此菜单时将执行程序模板生成程序"O0001.PRG"
menu("示教坐标", 示教绝对(group=1)) #此处用了示教组功能,将X/Y轴的绝对坐标同时读入v500和v501中
// 以下为程序模板"圆周钻孔.txt"的内容:
G17 G90 G49 G80 G40
G91 G28 Z0
G90 M03 S#v507
M08
#v521 = #v503 - 1
FOR #i=0 TO #v521 DO; //FOR循环
#v10 = #v500 + #v502 * COS[[#v504 + #i * 360.0 / #v503]*PI/180]
#v20 = #v501 + #v502 * SIN[[#v504 + #i * 360.0 / #v503]*PI/180]
IF #v506 == 81 THEN; //IF语句
G81 K0 X#v10 Y#v20 Z#v505 R#v508 F#v509;
ELSEIF #v506 == 82 THEN;
G82 K0 X#v10 Y#v20 Z#v505 R#v508 Q#v510 F#v509;
ELSEIF #v506 == 83 THEN;
G83 K0 X#v10 Y#v20 Z#v505 R#v508 Q#v510 F#v509;
ENDIF
ENDFOR
M05
M09
M30