该projet是对一个工作站进行编程,完成托盘的装配。该项目涉及四个部分的编程:ABB机器人,气动抓取机器人,柔性传输带,操作面板。项目中运用了FIFO来解决多个订单的配置问题。
这个项目是去年秋季课的两个项目之一。大体来说,项目有些难,但它不难在编程上,而是难在如何利用现有的软硬件完成整套装配流程。至于编程方面,本人几乎独揽SFC部分的编程,甚至还有富余去解决控制面板和ABB部分的编程。
Cahier de charge
Cahier de charge 的中文翻译就是规格表,也就是指需求报告一样的东西。简单的说明下装配流程。
装配流程:
- ABB机器人抓取棋盘上的销钉(piges),将其安装在托盘(palettes)上。
- ABB机器人将托盘运输至传输带入口(Entrée convoyeur)
- 传输带运输托盘到达气动抓取机器人处(Robot chargeur)
- 气动机器人根据操作面板指令将托盘送到指定站点进行处理(Poste#1-4)
- 处理完毕后气动机器人将托盘送至结束位置
- 传输带运输托盘到达传输带出口(Entrée convoyeur)
- ABB机器人将处理好的托盘送出工作站(Résevoir#3)
其它要求:
- 操作面板可以一次性输入多个托盘指令,且每个托盘可以分别自定义其经过的站点(Poste)
- ABB机器人存在操作优先级,始终首先将传输带出口处的托盘送出工作站。
- 控制面板,传输带与其余站点要求分别编程,使用I/O信号交换信息。
下图为工作站的模型,上文中的法语与图中法语对应。
总体解决方案
编写语言:
ABB机器人:RAPID
其余部分:SFC
相对于仅使用LADDER编程,SFC的加入大大增加了程序的易读性(也从而减少了bug)
各站点间通信结构:
控制面板 与 传输带 (PanelView&Convoyeur)为主体程序,将会使用FIFO语句FFL储存订单在N_pige与N_poste列表中。
N_pige与N_poste两个list用于储存每个订单中要求拿取的销钉序列号与站点序号
ABB机器人:读取列表N_pige的第一个值(1-6号,有6个销钉),从而抓取指定销钉。
气动抓取机器人:读取列表 N_poste的第一个值(1-5,有四个站点,5号代表结束)。
FIFO语句FFU会确保每个值只被读取一次。
各个工作站之间的一般通信使用I/O信号即可。(signal I/O)
下图为演示时所画的示意图:
装配流程解决方案说明
Partie ABB robot:
这玩意儿暑期回国实习的时候摸过,不过仅仅是摸了摸,勉强掌握了控制器的基本操作。(单轴运动,线性运动和重定位运动)至于编程部分,看了不少,但是基本没实际操作过。这个项目的ABB编程和暑期HYVA实习时见到的直接在控制器上进行编程不同,是在robotstudio上编程的。课程提供robotstudio上的工作站模型,精确复制了实际工作站ABB机器人部分的全部内容。(其实我觉得是怕我们把机器人玩坏,毕竟就这学期夹具就断了挺多次的…)
更换夹具
至于夹具是怎么断的,那就得说说我们遇到的第一个问题了——更换夹具。
由于机器人有两套夹具,分别用于夹销钉(piges)和托盘(palettes),因此需要频繁的更换夹具。可以看到图中摆放夹具的支架。正确的卸下夹具的方式为:机器人到达1号位置,将夹具卡入支架,随后向上提起机械臂分离夹具。安装夹具的放式与之相反。光这学期夹具坏了几次,看管实验室那个佬用万能胶修夹具的样子熟练的让人心疼!
总的来说ABB机器人的操作部分的难度相对较低,因为可以在robotstudio进行编程,且提供了用于学习的Tutorial。 RAPID编程我是首次接触,但该项目RAPID用的并不多,因为可以robotstudio上通过位置与轨迹点进行编程,仿真成功后再转译成RAPID语句。我们所需要做的只是在后期微调机器人的轨迹,以及码几行代码从而实现与仪表盘的信号交流(例如N_pige)这部分真正的难点在于与工作站的其它成员的信息交流的处理。
我们暂时离开ABB机器人,看看传输带:
1. 传输带入口处的信息交流
传输带的入口处只有个气动钳子…所以如何让ABB机器人正确放置托盘呢?
- 当ABB机器人将托盘送达气动钳子后,发送信号。(ABB_IRB140 :I.Data[2]=1)
- 传输带收到信号,关闭气动钳子,发送完成信号,延时2s。(timer1)
- ABB机器人收到信号后在两秒内松开夹具并且离开。
- 随后气动钳子松开,托盘进入传输带。Nice job!
SFC图如下:
阻止器部分
托盘继续前进,去往气动抓取机器人处。为了防止多个托盘同时到达抓取机器人下方(阻止器att3前)。苦逼的学生需要妥善利用可怜的两个阻止器(气动阻止杆,Att)和仅仅一个光学传感器(位于第一个阻止器前)来解决托盘的堆积问题。
以下是解决方案,我们甚至只用了两个阻止器就完成了需求:
杆#3处并没有传感器,因此需要与气动机器配合以确定托盘存在与否。
Palette_att1 传输带程序(convoyeur)内的变量,气动抓取机器人程序可以读取它。
Palette_att0 气动抓取机器人内的变量,传输带程序(convoyeur)程序可以读取它。
两个程序互相读取,从而实现了托盘是否存在这个信息的传递。
- 初始化,杆#1升起,杆#2恒定放下,杆#3恒定升起。
- 若not(absence_b1) 杆#1前有托盘 且 Palette_att1=0 杆#3前无托盘, 降下杆#1 2秒
- 将Palette_att1值转换成1
- 若Palette_att0=1(此为气动抓取机器人取走托盘后发送的信号)将Palette_att1值置0
SFC图如下:
气动抓取机器人部分
这部分的编程体验非常好,完成之后甚至没有出现bug。当然,编程中有一些需要注意的地方:
1. 与输送带部分的信号传递。
上文已经提到了,在机器人取走托盘后,palette_att0置1,让输送带获得信号,允许下一个托盘前进。
Palette_att1 传输带程序(convoyeur)内的变量,气动抓取机器人程序可以读取它。
Palette_att0 气动抓取机器人内的变量,传输带程序(convoyeur)程序可以读取它。
两个程序互相读取,从而实现了托盘是否存在这个信息的传递。
使用word表格简单做一个流程图来重复下信号传递过程:
每行表示相同的时间段两个程序所处的状态。这玩意儿的原理我的队友们到期末结束都没看懂,笑。
传输带 |
机器人 |
杆#3处无托盘 Palette_att1=0 |
Palette_att0=0 |
杆#三处有托盘 Palette_att1=1 |
Palette_att0=0 |
Palette_att1=1 |
读取到Palette_att1=1 开始取走托盘动作 |
Palette_att1=1 |
完成取走托盘动作 Palette_att0=1 |
读取到Palette_att0=1 更改值为Palette_att1=0 |
进行处理托盘程序 Palette_att0=1 |
杆#3处无托盘 Palette_att1=0 |
进行处理托盘程序 Palette_att0=1 |
杆#3处无托盘 Palette_att1=0 |
进行处理托盘程序 Palette_att0=1 |
杆#3处无托盘 Palette_att1=0 |
完成处理托盘程序(准备好再取一个新的托盘了) Palette_att0=0 |
2. 站点位置的确定
各个站点处并没有传感器,我们需要使用一个计数器来确定机器人的位置。
如下图,站点1为计数器360的位置:
程序开始:
- 机器人转向面对站点。
- 比较器比较机器人所处位置在360之前还是在之后。
- 若计数器小于360,机器人前进,计数器增加,到达360位置。
若计数器大于360,机器人后退,计数器减小,到达360位置。
固定位置,计数器不归零,进行后续操作。
SFC图如下:
3. 气动抓取机器人整体程序
气动机器人部分的程序简单来说就是一个多分支的loop,在完成一项任务后,系统将会使用FFU提取N_poste列表内的下一个值并且执行其对应操作(该值将被放入寄存器Poste_I中)。其中1,2,3,4分别对应四个工作站,5为结束信号,机器人将会将托盘带至结束位置。
机器人操作部分的编程没有任何特别之处,真正值得关注的是系统间的通信。
为了确保机器人可以正确的接受指令,从而执行正确的操作,系统需要在正确的时间从列表N_poste中提取值。
一开始,我们尝试在Step007步骤进行提取,然而机器人只能正确的接受第一个指令,随后便会不停的重复它。分析原因后我们发现,由于这个步骤内的操作仅仅是判断值(1-5),因此其花费的时间非常小。当程序第一次运行至这个步骤时,由于寄存器Poste_I的初始值为0,而有效值为1-5,因此程序会停在这里,直到FFU操作将指令放入寄存器Poste_I为止。随后进行对应的操作。但是,一旦程序第二次运行到Step007位置时,因为寄存器Poste_I内已经有一个1-5范围内的值,程序会立刻进行选择,所以在这种情况下没有足够的时间进行FFU操作。
使用word表格简单做一个流程图来重现下过程:
步骤 |
寄存器值 |
FFU操作 |
Step007 |
Poste_I=0 |
开始 |
Step007 |
Poste_I=0 |
进行中 |
Step007 |
Poste_I=0 |
进行中 |
Step007 |
Poste_I=0 |
完成 |
Step007 |
Poste_I=1-5 |
已完成 |
结束Step007 |
Poste_I=1-5 |
已完成 |
第二次循环 |
||
Step007 |
Poste_I=1-5 |
开始 |
结束Step007 |
Poste_I=1-5 |
进行中 |
|
|
被打断 |
经过改进后我们增加了Ready_I.0 与Valide_O.0变量用于FFU操作:
Ready_I.0用于确认FFU操作开始的时机。
Valide_O.0连接计时器timer6用于提供2s的延时以保证FFU操作完成。
当程序到达Step_006(位于step007前)与Step_0066(结束poste操作后)这两个步骤时,Ready_I.0会变为1,FFU操作开始。与此同时,开始一个时间为2s的计时器TON timer6,当timer6.DN被触发时,Valide_O.0置1. 只有在Valide_O.0为1的情况下,程序才可以结束Step007步骤。
使用word表格简单做一个流程图来重现下过程:
步骤 |
寄存器值 |
FFU操作 |
第一次循环 |
||
Step005 |
Ready_I.0=0 Valide_O.0=0 Poste_I=0 |
|
Step006 |
Ready_I.0=1 Valide_O.0=0 Poste_I=0 |
开始 |
Step006 |
Ready_I.0=1 Valide_O.0=0 Poste_I=0 |
进行中 |
Step006 |
Ready_I.0=1 Valide_O.0=0 Poste_I=1-5 |
已完成 |
Step006 |
Ready_I.0=1 Valide_O.0=1 Poste_I=1-5 |
已完成 |
结束Step006 |
|
|
Step007选择 |
|
|
第二次循环 |
||
Step0066 |
Ready_I.0=0 Valide_O.0=0 Poste_I=1-5 |
开始 |
Step0066 |
Ready_I.0=1 Valide_O.0=0 Poste_I=0 |
进行中 |
Step0066 |
Ready_I.0=1 Valide_O.0=0 Poste_I=1-5new |
已完成 |
Step0066 |
Ready_I.0=1 Valide_O.0=1 Poste_I=1-5new |
已完成 |
结束Step006 |
|
|
Step007选择 |
|
|
LADDER图
4. 传输带出口处的信息交流
根据要求ABB机器人将会在结束位置(Poste sortie)取回托盘,然而该位置不存在传感器,因此需要利用阻止器Att#4位置的传感器验证托盘是否到达。
当托盘到达Att#4后,放下阻止器,延时3s后向ABB机器人传输托盘到达结束位置信号(ABB_IRB140 :I.Data[3]=1)
以上就是projet内值得注意的部分。