Epson 机械手 SPEL+ 条件判断(If/Select Case)语法教程
面向初学者的条件判断语法入门:
If的各种写法、比较/逻辑运算符、多分支Select Case,最后给一个可直接复制到 RC+ 运行的学习 Demo 和几个机械手实战示例。
一、条件判断是什么?打个比方
程序默认从上往下一条条执行,但现实里需要"看情况办事":有料才去取、真空建立才抬升、左工位放左边……条件判断就是让程序会"动脑子"。
是 料盘空? ──▶ 去取料 │ 否 │ ▼ 等下一盘SPEL+ 里做判断有两大工具:If(灵活)和Select Case(多分支)。
二、If 的基础写法
1. 单条件:If ... Then ... EndIf
Ifi>3ThenPrint"条件成立" EndIf2. 二选一:If ... Then ... Else ... EndIf
IfiMod2=0ThenPrint"偶数"ElsePrint"奇数" EndIf3. 多分支:ElseIf
Ifscore>=90ThenPrint"优秀"ElseIfscore>=80ThenPrint"良好"ElseIfscore>=60ThenPrint"及格"ElsePrint"不及格" EndIf从上往下找,第一个成立的分支执行,其他全部跳过。
4. 单行 If:一句话搞定(不用 EndIf)
Ifi>5ThenPrint"i 大于5"一行里做多件事,用冒号:分隔:
Ifi>5ThenPrint"大了" : Print "注意!"项目真实用法:
If Abs(CU(putpos1) - CU(downst1)) > 0.002 Then Print "角度不一致" : Quit All——条件不满足直接打印并退出整个程序。
三、比较运算符与逻辑运算符
比较运算符(结果是 True/False)
| 运算符 | 含义 | 示例 |
|---|---|---|
= | 等于 | If i = 5 Then(字符串也能比:If CMD$ = "gok1") |
<> | 不等于(不是!=) | If i <> 8 Then |
<> | 小于 / 大于 | If i < 10 Then |
<=>= | 小于等于 / 大于等于 | If i >= 7 Then |
逻辑运算符(组合多个条件)
| 运算符 | 含义 | 示例 |
|---|---|---|
And | 并且(都成立才行) | If i > 0 And i < 10 Then |
Or | 或者(有一个就行) | If i = 5 Or i = 6 Then |
Not | 取反 | If Not (i = 5) Then |
Xor | 异或(恰有一个成立) | If a = 1 Xor b = 1 Then |
' 判断:真空建立 且 气缸到位,才继续IfSw(CheckXiQi1)=OnAndSw(CheckQiGangUp1)=OnThenPrint"条件全满足,继续" EndIf注意区分:逻辑
And(组合条件)和位运算And(掩码,如In(0) And &B1111)——都是And,一个管"判断",一个管"按位算",看操作数类型。
四、嵌套 If
If 里面再套 If,注意每个 If 都要配一个 EndIf:
Ifi>10ThenIfi<20ThenPrint"10 < i < 20"EndIf EndIf嵌套越深越难读,超过两层建议拆开或用And合并。
五、Select Case:多分支神器(项目最爱)
当判断的对象是"同一个变量的多个取值"时,用Select Case比一长串ElseIf清爽得多。
语法(注意结束符是Send,不是 EndSelect!):
Select变量Case值1语句Case值2,值3' 多个值用逗号Case值4To值6' 范围CaseElse' 兜底 语句 Send项目真实用法——遍历 6 个吸头切换工具:
ForIndex=1To6SelectIndexCase1:Tool1Case2:Tool2Case3:Tool3Case4:Tool4Case5:Tool5Case6:Tool6Send Jump downcamacq1/RNextCase后面单行用冒号写语句,多行直接换行写,两种都行。
六、学习 Demo(可直接运行)
复制到 RC+ 新建.prg,编译后运行main,对照终端输出理解每种写法:
'============================================================' SPEL+条件判断语法学习 Demo ' 运行方式:RC+打开 → Compile →Runmain '============================================================FunctionmainIntegeri,scoreStringcmd$Print"=====If语法 Demo 开始=====" '----1)基础If...Then...EndIf----i=5Ifi>3ThenPrint"1)5大于3,条件成立" EndIf '----2)If...Then...Else:二选一----i=4IfiMod2=0ThenPrint"2)4是偶数"ElsePrint"2)4是奇数" EndIf '----3)ElseIf多分支----score=85Ifscore>=90ThenPrint"3)优秀"ElseIfscore>=80ThenPrint"3)良好"ElseIfscore>=60ThenPrint"3)及格"ElsePrint"3)不及格" EndIf '----4)单行If(不需要 EndIf)----i=10Ifi>5ThenPrint"4)单行If:i 大于5"Ifi>5ThenPrint"4)冒号连写第一句" : Print "4)冒号连写第二句" '----5)比较运算符----i=7Ifi<>8ThenPrint"5)7不等于8(<>)"Ifi<=7ThenPrint"5)7小于等于7(<=)"Ifi>=7ThenPrint"5)7大于等于7(>=)" '----6)逻辑运算符----i=6Ifi>0Andi<10ThenPrint"6)6在0~10之间(And)"Ifi=5Ori=6ThenPrint"6)i 是5或6(Or)"IfNot(i=5)ThenPrint"6)i 不是5(Not)" '----7)字符串比较----cmd$="gok1"Ifcmd$="gok1"ThenPrint"7)收到有效坐标命令 gok1" EndIf '----8)嵌套If----i=15Ifi>10ThenIfi<20ThenPrint"8)10<i<20(嵌套)" EndIf EndIf '----9)Select Case多分支----Fori=1To4SelectiCase1Print"9)一号吸头"Case2,3Print"9)二号或三号吸头"CaseElsePrint"9)其他吸头" SendNextPrint"=====Demo 结束=====" Fend预期终端输出:
===== If 语法 Demo 开始 ===== 1) 5 大于 3,条件成立 2) 4 是偶数 3) 良好 4) 单行 If:i 大于 5 4) 冒号连写第一句 4) 冒号连写第二句 5) 7 不等于 8(<>) 5) 7 小于等于 7(<=) 5) 7 大于等于 7(>=) 6) 6 在 0~10 之间(And) 6) i 是 5 或 6(Or) 6) i 不是 5(Not) 7) 收到有效坐标命令 gok1 8) 10 < i < 20(嵌套) 9) 一号吸头 9) 二号或三号吸头 9) 二号或三号吸头 9) 其他吸头 ===== Demo 结束 =====七、机械手实战:项目里的条件判断长这样
实战 1:真空检测判断(传感器输入 → 决定动作)
' 吸完料,判断真空是否建立IfSw(CheckXiQi1)=OnThenPrint"真空 OK,抬升" Jump Here:Z(0)' 建立真空就抬走ElsePrint"真空 NG,重新取料" Jump PUT1/R ' 没吸到,去抛料位重来 EndIf实战 2:左右工位判断(项目 Main.prg 真实逻辑)
' 根据工位选择放料矩阵IfStage=0ThenPrint"当前左工位" Jump XY(Nut1_X(coordY,coordX),Nut1_Y(coordY,coordX),-5,0)/RElsePrint"当前右工位" Jump XY(Nut2_X(coordY,coordX),Nut2_Y(coordY,coordX),-5,0)/R EndIf实战 3:命令字判断(通信协议解析,项目真实)
Input#201,CMD$,X$,Y$,A$IfCMD$="gok1"ThenPrint"有料,坐标:",X$,Y$,A$ExitDo' 跳出等待循环ElsePrint"无料,重新要" Jump homeposWait1EndIf实战 4:安全校验 + 退出(单行 If + 冒号,项目真实)
' 示教角度不一致直接退出,防止撞机IfAbs(CU(putpos1)-CU(downst1))>0.002ThenPrint"示教点1角度不一致,请重新示教" Quit All EndIf八、常见错误与排错
| 错误 | 原因 | 解决 |
|---|---|---|
| 编译报"缺 EndIf" | 块状 If 没写全 | 每个If...Then都要有EndIf;单行 If 则不要写 EndIf |
用了!= | SPEL+ 不等于不是!= | 用<> |
| Select 报错 | 结束符写成了EndSelect | SPEL+ 的 Select 用Send结束 |
Else If拼错 | 应该是ElseIf | 连写,不加空格 |
| 条件恒真/恒假 | 把=当赋值用了 | 条件里=是比较:If i = 5 |
| 嵌套 EndIf 配不上 | 多套了一层少写了一个 | 缩进对齐,数一数每个 If 的 EndIf |
| And/Or 用错 | 逻辑 And 和位 And 混了 | 组合条件用逻辑 And;掩码用In(n) And &B... |
调试技巧:条件分支里放Print,看走了哪条路;不确定条件真假,直接Print Sw(8)或Print i把值打出来。
九、总结
| 需求 | 用什么 |
|---|---|
| 一个条件判断 | If 条件 Then ... EndIf |
| 两种情况二选一 | If ... Then ... Else ... EndIf |
| 多种情况依次判断 | If ... ElseIf ... Else ... EndIf |
| 同一变量的多个取值 | Select Case ... Send(最清爽) |
| 一句话快速判断 | 单行If 条件 Then 语句 |
| 多个条件同时满足 | And组合 |
| 任一条件满足 | Or组合 |
一句话:二选一用 If/Else,多分支用 Select Case,简单判断用单行 If,条件组合用 And/Or。