项目背景

先说一下项目背景,项目要求潮湿的工业环境,在保证机器人末端跟流水线保持相对静止的情况下,控制末端执行器沿XZXZXZ平面内的点进行移动。

功能要求:
  1. 机器人末端执行器实现对工厂流水线的随动,其中流水线沿下图YYY轴方向运动;
  2. 传感器实时获取目标点在XZXZXZ平面内的信息;
  3. 在随动的同时,使用传感器获取的目标点信息指导末端执行器运动。

已知条件:
  1. 传感器获取的点只有XXX、ZZZ二维坐标,即P(x,z)P(x,z)P(x,z);
  2. 运动起点的坐标可以设定,如P0(x0,y0,z0)P_0(x_0,y_0,z_0)P0​(x0​,y0​,z0​);
  3. 沿Z轴的运动速度可以给定,如vzv_zvz​;

思路

面对这种工况,一般有两种思路:完全采用离线编程来实现、采用示教编程+离线编程结合实现,接下来分别进行介绍。

思路1:完全采用离线编程

完全采用离线编程来实现上述功能,具体实现流程如下:

  • 编码器获取流水线的速度vyv_yvy​;
  • 传感器获取运动点的坐标P(x,zP(x,zP(x,z);
  • 实现随动:计算从点P0P_0P0​运动到点P(x,z)P(x,z)P(x,z)的时间差:t=(z−z0)/vzt = (z-z_0)/v_zt=(z−z0​)/vz​,由此计算出该点的YYY坐标:y=y0+t∗vyy=y_0+t*v_yy=y0​+t∗vy​;
  • 工控机通过离线编程,控制机器人末端执行器按照补全后的点P(x,y,z)P(x,y,z)P(x,y,z)进行运动,完成功能;
思路2:示教编程+离线编程

该思路使用了机器人的示教点偏移功能(SHIFTON)和补偿随动功能(AMENDON),考虑到待加工的对象结构、尺寸等都差不多,所以示教一套具有普适性的轨迹点作为标准点,机器人沿这些标准点进行运动;如果传感器获取的工件尺寸与标准尺寸的有偏差,则使用示教点偏移功能在原来的轨迹点上进行一定的偏移,补全偏差即可。而补偿随动功能只需要给定随动的速度,则机器人在运动时,会自动将随动速度补偿到相应的轨迹点上,实现随动功能。

示教点偏移功能

具体流程如下:

  • 依次示教NNN个点的坐标,作为标准点,写进示教作业里;
  • 编码器获取流水线速度vyv_yvy​;
  • 传感器获取运动点的坐标P(x,zP(x,zP(x,z);
  • 计算传感器获取的点与示教的标准点之间的坐标差值;
  • 工控机通过离线编程将编码器获取的速度vyv_yvy​以及NNN个点的XXX、ZZZ坐标差写入到示教盒内(通过修改“位置变量”的方式);
  • PLC通过操作系统IO的方式,实现执行主作业,完成功能;
对比
  • 思路1:完全依赖软件进行运动规划、控制,工控机作为控制核心、PLC作为功能模块,自己“造轮子”,不可控因素较多;
  • 思路2:运动控制写在示教作业里,提高了运行的稳定性;同时PLC作为控制核心,工控机则作为了一个功能模块,不参与系统的运动控制;采用了工业上现有的、成熟的机器人补偿和随动功能,简化了系统流程、降低了风险。

实现

示教作业:
  1. 子作业1:BACK
/*
功能:回原位
*/
NOP
MOVL P100 VL=200 CP=1 ACC 100 // P100:原位
RET
END
  1. 子作业2:PROCESS
/*
功能:设置轨迹点的位置变量Px为相应的用户变量Rx;并按位置变量指定的点进行运动
*/
NOP
// 设置轨迹点的x/y/z坐标(其实只需要x、z就够了,y可赋值为R2)
AMEND SET P99               //  将位置变量赋值给amend规划
AMENDON F#1 M=1                // 实时补偿,#F1:机器人基坐标系M1:绝对补偿
MOVL P1 VL=200 CP=1 ACC 100   // 1代表连续,ACC:最大加速度百分比
MOVL P2 VL=200 CP=1 ACC 100
MOVL P3 VL=200 CP=1 ACC 100
MOVL P4 VL=200 CP=1 ACC 100
AMENDOFF
RET
END
  1. 作业名:MAIN
/*
功能:主作业,根据条件选择执行作业
*/
NOP
CALL IN#1=ON   BACK     // 回原位
CALL IN#3=ON   PROCESS  // 运动
DELAY T=0.2        // 延时0.2s(0.1-999.0s)
END
离线编程:
#include <iostream>
#include "stdafx.h"
#include "RobotSDK.h"  #define VARIABLESIZE 6using namespace std;int main()
{// 接口初始化操作:操作成功返回0,操作失败返回-1.int ErrorCode = RobotInit();if (ErrorCode == 0){std::cout << "Robot Initilize success" << std::endl;}else{std::cout << "Robot Initilize failed, return code is " << ErrorCode << std::endl;}//机器人UDP连接,IP为192.168.3.150,端口号为9999.char* cIP = "192.168.3.150";short port = 9999;int connectID = ConnectUDP(cIP, port);if (connectID>0){std::cout << "Robot connect success" << std::endl;}else{std::cout << "Robot connect failed, return code is " << connectID << std::endl;}
/*// 关闭安全门(必需操作)。ErrorCode = Send_SafeDoorOFF(connectID);if (ErrorCode == 0){std::cout << "close safe door success" << std::endl;}else{std::cout << "failed" << connectID << std::endl;} // 打开作业char *jobName = "VARIABLE";ErrorCode = OpenJob(jobName, connectID);if (ErrorCode == 0){cout << "成功打开作业" << endl;}else{cout << "打开作业失败" << endl;}// 报警复位ErrorCode = Send_Reset(connectID);if (!ErrorCode){cout << "报警复位成功" << endl;}else {cout << "报警复位失败" << endl;}//清除缓存ErrorCode = ClearBuffer(connectID);  //ClearBuffer()函数用于清空机器人控制器中的缓存。if (ErrorCode == 0){std::cout << "Clear buffer successful!" << std::endl;}else{std::cout << "Clear buffer failed, return code is " << ErrorCode << std::endl;}//伺服上电ErrorCode = Send_PowerOn(connectID);Sleep(2000);  // 延迟2s,等待上电完成if (ErrorCode == 0){std::cout << "Servo on power" << std::endl;}else{std::cout << "Servo power failed, return code is " << ErrorCode << std::endl;}
*/// 设置位置变量int poseID[VARIABLESIZE] = { 100,99,1,2,3,4 };  // 待修改位置变量的IDRPY poseRPY[VARIABLESIZE]; // 位置变量数组,存储相应点的位姿float exAxis[3] = { 0,0,0 }; //外部轴关节值int coordinate = 1; //坐标系选择,1:世界坐标系;2:用户坐标系;3:工具坐标系int TOOLNUM = 1; //工件坐标系选择int USERNUM = 1; //用户坐标系选择/*此处对poseRPY[i]进行操作,修改各点的位姿*/for (int i = 0; i < VARIABLESIZE; i++){ErrorCode  = WriteUserVarRPYS(poseID[i], poseRPY[i], exAxis, coordinate, TOOLNUM,USERNUM, connectID);}if (ErrorCode == 0){std::cout << "成功设置浮点型用户变量" << std::endl;}else{std::cout << "设置浮点型用户变量失败" << std::endl;}
/*// 外部启动ErrorCode = Send_Start(connectID);if (ErrorCode == 0){std::cout << "Main operation is opened" << std::endl;}else{std::cout << "Main operation failed, return code is " << ErrorCode << std::endl;}
*/// 断开与机器人的连接ErrorCode = Disconnect(connectID);if (ErrorCode == 0){std::cout << "Disconnect success" << std::endl;}else{std::cout << "Disconnect failed, return code is " << ErrorCode << std::endl;}system("pause");return 0;
}
备注
  1. 上述代码实现,并没有使用SHIFTON进行示教点偏移,因为SHIFTON一般只能把所有点作为一个整体进行偏移,对于每个点的每个坐标偏移量都不相同的场景不太适用。这里是直接把目标点的坐标直接赋值到位置变量里,并没有进行偏移。
  2. 离线编程代码部分不用打开作业也可修改用户变量,而且当机器人在作业MAIN中循环等待时,也无法对作业进行操作,否则会报错:“执行中无法操作作业”;
  3. AMENDON功能默认没有被添加进机器人RC系统中,需要联系新松工作人员添加。
  4. 注意时序问题,需要在离线编程修改完位置变量以后,才能执行PROCESS子作业;否则PROCESS子作业中的P点是上一次修改后的P点,而不是本次的P点。

新松机器人:【示教编程】+【PC离线编程】+【PLC远程IO】相结合相关推荐

  1. 机器人示教编程与离线编程的选择

    随着科学技术日新月异的进步,工业机器人已成为当今工业生产上重要的组成部分,它可以很精确的完成形形色色的任务和操作.相比于人类的局限性而言它们有更为广泛的应用空间.1959年美国英格伯格和德沃尔(Dev ...

  2. 机器人示教编程与离线编程的优缺点对比

    机器人的智能化发展是一个大的趋势,那么对于它是如何完成既定工作的话我们就要谈到机器人的编程方式了.通常的机器人编程方式有以下两种:示教编程与离线编程.一段时间以来,似乎存在这样的争论,有人认为示教编程 ...

  3. 工业机器人在线示教编程和离线编程

    工业机器人的应用极大地提高了工厂的生产效率,在帮助企业应对人工成本上涨.劳动力供给不足等方面提供了可供选择的方式,赢得了企业的广泛关注.目前,机器人广泛应用于焊接.装配.搬运.喷漆.打磨等领域. 目前 ...

  4. 示教编程技术,离线编程技术,自主编程技术,你精通哪种?

    一.概述 当前机器人广泛应用于焊接.装配.搬运.喷漆及打磨等领域,任务的复杂程度不断增加,而用户对产品的质量.效率的追求越来越高.在这种形式下,机器人的编程方式.编程效率和质量显得越来越重要.降低编程 ...

  5. 安川机器人怎样与变位器编程_基于CAM Function的安川机器人弧焊焊接离线编程与离线仿真...

    概述 CAM Function是MotoSim EG-VRC软件实现安川机器人离线编程的核心功能,该功能通过在加工零件CAD模型上选取加工路径轨迹特征自动生成机器人加工工艺路径程序. CAM Func ...

  6. RobotStudio 机器人工作环境设计与离线编程

    配置机器人的工作环境 安装机器人本体,且将其工作台和工件模块进行配合

  7. 机器人离线编程画圆误差解决方案_工业机器人离线编程-误差分析和解决方案...

    编:张山 发:03/03/2019 按:为便于更多读者朋友了解工业机器人离线编程/仿真,本文中尽量规避专业名词和深入的专业讲解. ---------------------------------- ...

  8. abb机器人离线编程软件解密_一文看懂最新机器人离线编程软件【详细】

    今天小萌无意间看到了数控老武写的一篇关于国内外离线编程软件对比的文章,看了之后感觉有些方面写的不错,比如大家有所耳闻的离线编程软件都做了介绍,而且还发表了一些个人的观点,小萌就对数控老武的一些个人观点 ...

  9. 埃夫特机器人离线编程软件_埃夫特ER-Factory数字化工厂软件重磅升级

    ER_RobotStudio正式升级为ER_Factory,支撑更多机器人品牌离线编程.出产工艺进程仿真.物流仿真(AGV.输送体系.Buffer等).CAM功用(喷涂.切开.打磨等).外部传感器功用 ...

最新文章

  1. 学习Modern UI for WPF
  2. 百万并发中间件系统的内核设计看Java并发性能优化
  3. HTML lt strong gt 标签,HTML lt;legendgt; 标签
  4. Latex 调整表格大小 表格过大 表格过小
  5. 数据库周刊第十七期来啦!
  6. php自动跳转函数,迅睿CMS 重写控制网站自动跳转函数
  7. java考试系统_Java在线考试系统(含源码)
  8. 编写递归算法,计算二叉树叶子结点的数目。
  9. 笔记本拆机后无法开机是什么原因
  10. markdown 语法大全
  11. 读应届生论坛的“职业生涯步步高:一位资深经理人的职业生涯感悟”之一
  12. C1041: 无法打开程序数据库“xxx.pdb”;如果要将多个 CL.EXE 写入同一个 .PDB 文件,请使用 /FS
  13. 搜索插件像百度那样的智能感知效果
  14. USB core(一) - rh_queue_status与rh_call_control
  15. 小红书笔记如何发布内容
  16. codevs 1218 疫情控制
  17. READ-2203 FLDetector: Defending Federated Learning Against Model Poisoning Attacks via Detecting Mal
  18. php分页教程,php实现分页的原理及步骤
  19. 苹果iOS app上架流程
  20. 桌面图标有蓝色阴影终极解决方法

热门文章

  1. 深信服2008校园招聘笔试题
  2. tf.greater()
  3. python提取word中的表格写入excel
  4. 灵魂书籍 | 《记忆力心理学 | 赫尔曼·艾宾浩斯》
  5. 夜神模拟器没有开发者选项怎么办?
  6. [3DsMAX]建模软件的分享
  7. 出生年(组成年份的数字种类)
  8. 从中序和前序遍历序列构造二叉树
  9. 《Linear Graph Convolutional Model for Diagnosing Brain Disorders Zarina》阅读笔记
  10. Unity基于YooAssets资源管理1