ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

EPSON爱普生机器人SPEL+指令集实战:从运动指令到IO时序的产线控制逻辑

EPSON爱普生机器人SPEL+指令集实战:从运动指令到IO时序的产线控制逻辑

简介:EPSON爱普生机器人指令集是一份面向工业机器人编程初学者与自动化工程师的速查型参考资料,针对爱普生RC+控制器指令繁多、手册检索不便的痛点,将常用命令按功能归类整理,便于快速定位与理解。资源为单个PDF文件,压缩包约327KB,内容以简明列表形式呈现,涵盖系统管理、机器人控制与运动控制三大模块:系统管理部分包括Reset、SysConfig、SysErr、Date、Time、Hour、Stat、CtrlInfo等状态与配置指令;机器人控制部分涉及AtHome、Calib、CalPls、Hofs、MCal、Power、Motor、SFree、SLock等原点校准与电机控制命令;运动控制部分则详细列出Jump、Jump3、Go、Pass、Move、Arc、Curve、CVMove等PTP与CP动作指令,以及Speed、Accel、SpeedS、AccelS等速度参数设置函数。目前已有2108人学习下载,适合需要快速查阅指令含义、辅助程序编写与调试的读者作为案头参考。

1. EPSON爱普生机器人指令集:从一条SPEL+语句看懂整条产线的控制逻辑

很多人第一次接触EPSON爱普生机器人,注意力都放在机械臂本体和示教器上,真正决定产线节拍的却是跑在控制器里的那套SPEL+指令集。它不像通用PLC那样用梯形图堆逻辑,而是用接近BASIC语法的文本指令直接描述运动、IO、通信和异常处理。这意味着同样一条搬运任务,写十行指令和写三十行指令,循环周期可能差出几十毫秒,一天下来就是几千个节拍的差距。这套指令集适合三类人:刚接手EPSON机器人、需要把示教点位固化成可维护程序的一线调试人员;要把机器人接入视觉或上位机、需要理解通信指令边界的人;以及被现场偶发报警折腾过、想搞清指令执行顺序的工程师。下面按“先立概念、再跑最小程序、再调参数、最后避坑”的顺序拆开讲。

2. SPEL+指令集的四类指令与最小可运行程序

2.1 运动指令、IO指令、通信指令、流程控制指令的分工

EPSON爱普生机器人的指令集按功能大致分四类,理解这个分类比死记指令名重要得多。

运动指令负责让机械臂动起来,核心是Go、Jump、Move、Go的区别。Go是点到点的关节插补,速度快但路径不可控;Jump是带门型抬升的搬运专用指令,适合取放料;Move是直线插补,路径可控但速度受限于直线规划;Go和Jump在多数搬运场景里比Move快,因为不约束末端轨迹。选型时先问自己:路径中间有没有障碍物?没有就用Jump或Go,有就用Move。

IO指令负责和外部信号打交道,On、Off、Sw、Wait是高频词。Sw读输入状态,On/Off写输出,Wait做条件等待。这里有个容易翻车的点:Wait后面跟的条件如果永远不满足,程序会死等,必须配合超时或Till指令。

通信指令包括OpenNet、Print、Input这类,用于和上位机、PLC或视觉系统交换数据。EPSON支持TCP/IP、串口和现场总线,指令写法因通信方式不同而不同。

流程控制指令就是If、For、Do、Function这些,和通用编程语言类似,但要注意SPEL+的Function和GoSub在变量作用域上的差异。

2.2 用Go和Jump写一个取放料的最小程序

下面这段代码是一个最简取放料程序,假设机器人从待机点出发,去取料点抓取,再放到放料点。

Function Main Motor On ; 使能电机 Power High ; 设置功率模式为高 Speed 80 ; 全局速度80% Accel 70, 70 ; 加减速各70% Do ; 主循环 Jump PickPos ; 门型运动到取料点上方 On 1 ; 打开夹爪输出 Wait Sw(2) = On ; 等待夹爪到位信号 Jump PlacePos ; 门型运动到放料点上方 Off 1 ; 关闭夹爪 Wait Sw(3) = On ; 等待放料确认 Loop Fend

逻辑说明:Motor On和Power High是运动前的必要准备,缺一个机器人都不动。Speed和Accel设的是全局值,后面单条运动指令还可以覆盖。Jump指令自带门型轨迹,先抬升到安全高度再水平移动,最后下降到目标点,所以PickPos和PlacePos只需要示教目标点本身,不用额外示教抬升点。Wait Sw(2) = On是等待夹爪传感器确认,没有这一句,程序会在夹爪还没夹紧时就往下走,现场表现就是掉件。

参数说明:Speed 80里的80是百分比,范围1到100,实际速度还受Accel和负载影响。Accel 70, 70两个参数分别是加速和减速百分比,设太低节拍慢,设太高会抖。Jump的抬升高度由Jump指令的第三个参数或系统默认值决定,默认值在控制器参数里改。

2.3 用Move做直线插补的适用场景

当路径中间有障碍物,或者工艺要求末端走直线时,把Jump换成Move。

Function LinearMove Motor On Power High Speed 50 Accel 50, 50 Move StartPos ; 直线移动到起点 Move EndPos ; 直线移动到终点,路径可控 Move BackPos ; 直线退回 Fend

Move和Go的区别在于:Go只保证到达目标点,中间走什么路径由关节插补决定;Move保证末端沿直线走。代价是Move速度通常比Go慢,因为直线插补要实时解算逆运动学。如果工艺没有直线要求,优先用Go或Jump。

3. 运动参数与IO时序的调法:Speed、Accel、Jump和Wait怎么配

3.1 Speed和Accel的配合关系

Speed设的是目标速度百分比,Accel设的是加速和减速的百分比。两者不是独立的:Speed设100但Accel设20,机器人会花很长时间才到最高速,实际平均速度可能还不如Speed设70配Accel设70。现场调参的顺序一般是先把Accel设到60到80之间,再调Speed,最后微调Accel看抖动。

Speed 70 Accel 60, 60

如果负载接近额定值,Accel要往下调,否则启动和停止时机械臂会抖,长期下来减速机磨损加快。判断标准是看停止时末端有没有明显回弹,有就降Accel。

3.2 Jump指令的抬升高度和门型轨迹

Jump的完整写法是Jump 目标点, 抬升高度,不写抬升高度就用系统默认值。

Jump PickPos, 50 ; 抬升50mm Jump PlacePos, 30 ; 抬升30mm

抬升高度设多少取决于工件高度和夹具干涉。设太低会撞料,设太高节拍慢。常见做法是取工件高度的1.5到2倍,再根据现场实测微调。如果取放料点上方有障碍物,抬升高度还要加上障碍物高度。

3.3 Wait和Till在IO等待上的区别

Wait是死等,条件不满足就停在那里。Till是带超时的等待,超时后可以走异常分支。

Wait Sw(2) = On ; 死等,可能卡死 Till Sw(2) = On, 3.0 ; 等3秒,超时继续往下走

现场更推荐用Till,超时后置一个报警标志或走重试逻辑。用Wait的场合是确定信号一定会来,比如气缸到位信号。用Till的场合是信号可能不来,比如视觉拍照结果。

3.4 用Till做超时处理的完整片段

Function PickWithTimeout Motor On Power High Speed 80 Accel 70, 70 Jump PickPos On 1 Till Sw(2) = On, 2.0 ; 等夹爪到位,最多2秒 If Sw(2) = Off Then Print "夹爪超时" Off 1 Goto ErrorHandler EndIf Jump PlacePos Off 1 Till Sw(3) = On, 2.0 If Sw(3) = Off Then Print "放料超时" Goto ErrorHandler EndIf Exit Function ErrorHandler: Print "进入异常处理" Fend

逻辑说明:Till超时后程序继续往下走,所以后面必须跟If判断信号状态。如果超时后信号仍不满足,走异常分支。Goto在SPEL+里可以用,但大量使用会让程序难维护,建议只在异常处理里用。

4. 通信与多任务指令:OpenNet、Print、Input和并行任务

4.1 TCP通信的OpenNet和Print写法

EPSON机器人通过TCP和上位机通信时,用OpenNet建立连接,Print发送数据,Input接收数据。

Function CommTest OpenNet #201 As Client ; 以客户端方式打开端口201 Print #201, "READY" ; 发送READY Input #201, A$ ; 接收字符串到A$ CloseNet #201 ; 关闭连接 Fend

参数说明:#201是端口号,EPSON的端口号有固定分配规则,201通常用于TCP客户端。As Client表示机器人作为客户端主动连接上位机。Print发送字符串,Input接收字符串。如果上位机发的是数值,接收后要用Val转换。

4.2 用Input接收上位机数据的解析

Function ReceiveData OpenNet #201 As Client Input #201, B$ X = Val(B$) ; 字符串转数值 If X > 100 Then Print #201, "OK" Else Print #201, "NG" EndIf CloseNet #201 Fend

Val把字符串转成数值,如果字符串不是合法数字,Val返回0。所以接收前最好约定数据格式,比如固定长度或带校验位。

4.3 多任务并行时的资源冲突

SPEL+支持多任务,用Xqt启动并行任务。

Function Main Xqt Task1 ; 启动任务1 Xqt Task2 ; 启动任务2 Do Wait 0.1 Loop Fend Function Task1 Do On 1 Wait 0.5 Off 1 Wait 0.5 Loop Fend Function Task2 Do If Sw(5) = On Then Print "检测到信号" EndIf Wait 0.1 Loop Fend

多任务并行时,两个任务同时操作同一个IO或同一个全局变量会出问题。常见做法是给每个任务分配独立的IO和变量,或者用信号量机制。SPEL+没有内置信号量,通常用全局变量加If判断来模拟。

5. 避坑与排查:EPSON指令集现场最容易翻车的五个点

5.1 现象:程序跑着跑着突然停在Wait上不动

原因:Wait条件永远不满足,比如传感器坏了、信号线松了、或者IO编号写错了。解决:把关键Wait换成Till加超时,超时后打印报警信息。现场调试时先用示教器监控IO状态,确认信号能正常变化再跑程序。

5.2 现象:Jump运动时撞到夹具或料架

原因:抬升高度不够,或者Jump的目标点示教时没考虑夹具高度。解决:重新测量工件和夹具的总高度,抬升高度设为总高度的1.5倍以上。如果路径中间有障碍物,改用Move走直线绕开。

5.3 现象:Speed设100但实际节拍没变快

原因:Accel设太低,或者负载太重导致实际速度上不去。解决:先把Accel提到70到80,观察抖动情况。如果还不行,检查负载是否超过额定值,超了就降Speed。

5.4 现象:多任务运行时IO状态错乱

原因:两个任务同时操作同一个IO。解决:给每个任务分配独立IO,或者用全局变量做互锁。比如任务1要操作IO 1时,先检查全局变量Flag1是否为0,是就置1再操作,操作完置0。

5.5 现象:通信程序偶尔收不到数据

原因:Input是阻塞的,如果上位机没发数据,程序会一直等。解决:用Till配合Input的超时版本,或者在上位机侧加心跳机制。EPSON的Input指令本身不支持超时,常见做法是用OpenNet的Timeout参数设置超时时间。

6. 进阶技巧:用Function和Goto把指令集组织成可维护的程序

6.1 用Function封装重复逻辑

现场程序写多了会发现,取放料、等待、报警处理这些逻辑反复出现。用Function封装起来,主程序只调用。

Function PickAndPlace(PickPos As Point, PlacePos As Point) Jump PickPos On 1 Till Sw(2) = On, 2.0 If Sw(2) = Off Then Print "取料失败" Exit Function EndIf Jump PlacePos Off 1 Till Sw(3) = On, 2.0 If Sw(3) = Off Then Print "放料失败" EndIf Fend

主程序里直接写PickAndPlace(P1, P2),逻辑清晰,改一处就全改。

6.2 用Goto做异常集中处理

Goto不适合做正常流程控制,但适合做异常集中处理。所有异常都跳到同一个标签,统一打印报警、复位IO、等待人工确认。

Function Main Motor On Power High Speed 80 Accel 70, 70 Do Jump PickPos On 1 Till Sw(2) = On, 2.0 If Sw(2) = Off Then Goto ErrorHandler EndIf Jump PlacePos Off 1 Till Sw(3) = On, 2.0 If Sw(3) = Off Then Goto ErrorHandler EndIf Loop ErrorHandler: Print "异常,请检查" Off 1 Wait 1.0 Goto Main ; 复位后重新开始 Fend

6.3 用Print做现场调试日志

Print除了通信,还可以输出到示教器或日志文件。现场调试时在关键节点加Print,跑一遍就能看出程序走到哪一步。

Print "到达取料点" Print "夹爪已打开" Print "到达放料点"

日志不要太多,否则影响节拍。一般只在分支和异常处加。

6.4 指令执行顺序的验证方法

SPEL+是顺序执行,但运动指令是异步的:Jump发出后程序继续往下走,不会等运动完成。如果下一句是On 1,实际执行时机器人可能还没到位置。验证方法是看Jump后面有没有Wait或Till等待到位信号。如果没有,加一个Wait Sw(到位信号) = On。

我自己的习惯是:每条运动指令后面都跟一个到位判断,宁可多等几十毫秒,也不让程序在机器人没到位时就执行下一步。这个习惯帮我省掉了至少三次撞机事故。希望帮到你。

本文还有配套的精品资源,点击获取

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进