欢迎关注Jungle的Motoman机器人离线编程专栏系列文章:
Motoman机器人离线编程——Motocom32开发简介
Motoman机器人离线编程——Visio Studio环境配置
Motoman机器人离线编程——Motocom32库函数的使用与封装
Motoman机器人离线编程——Motocom32参考文献及注意事项
Motoman机器人离线编程——MotocomES介绍
在上一篇文章中(Motoman机器人离线编程——Motocom32参考文献及注意事项),Jungle在文末提到,涉及到单台计算机控制多个机器人时,Motocom32的库函数是不能实现的,而需要采用MOTOCOMES系列库函数。并且,在之前提到的所有功能,MOTOCOMES都能够实现,且实现起来更加简洁。
如下图,在安装Motocom32时,MOTOCOMES组件也已经自动安装上了,包含Host Control ES软件和一个手册。
MOTOCOMES版本的Host Control ES与之前介绍的Host Control 32类似(如下图),用户同样可以结合该软件来配合开发测试应用程序。
手册与Motocom32版本的手册类似,介绍软件的安装、示例程序和各个库函数的使用方法说明:
MOTOCOMES版本的库函数既然能够同时控制多个机器人运动当然也能够控制单个机器人运动。对比起来,MOTOCOMES版本的库函数自身已经完成了一次封装了,设计了诸多数据结构对“底层”进行封装,下面举个例子。
函数ESCartMove,查看手册,其功能是“Moves the robot to specified positions. (Type Cartesian Coordinates)”,即“在笛卡尔坐标系(直角坐标系)下,控制机器人运动到指定位置”。
函数声明为:
LONG ESCartMove(HANDLE handle, LONG moveType, ESCartMoveData moveData);
需要说明的是:
typedef long LONG
因此,根据手册中的讲解,Jungle设计了如下的函数,对该功能函数进行封装:
/**
* @function-命令机器人移动到指定位置
* @param iMoveData-指定机器人运动信息
* double position[8]:指定机器人移动的目标位置
double moveSpeed:指定机器人的移动速度(单位:%-MOVJ;mm/s-MOVL,IMOV;°/s-MOVL,IMOV)
long moveType:指定机器人的运动类型:1-MOVJ;2-MOVL;3-IMOV增量
* @return
* @author-Jungle
* @date-2019.1.23
*/
void Robot::moveToAppointedPoint(MoveDataInfo iMoveData)
{
ESCartMoveData moveData;
memset(&moveData, 0, sizeof(ESCartMoveData));
long moveType = iMoveData.moveType;
///机器人序号
moveData.moveData.robotNo = 1;
moveData.moveData.stationNo = 0;
///速度分类:0-%(MOVJ);1-V(MOVL,IMOV);2-VR(MOVL,IMOV)
moveData.moveData.speedType = 1;
moveData.moveData.speed = iMoveData.moveSpeed;
///数据类型:16-基坐标系;17-机器人坐标系;18-工具坐标系;19-用户坐标系
moveData.robotPos.dataType = 16;
moveData.robotPos.fig = 0;
///工具号
moveData.robotPos.toolNo = 0;
///用户坐标系号
moveData.robotPos.userFrameNo = 0;
moveData.robotPos.exFig = 0;
for(int i=0;i
其中,MoveDataInfo是Jungle自己设计的一个结构体:
///轨迹点结构体
struct MoveDataInfo
{
//机器人移动的目标位置
double position[8];
//指定机器人的移动速度
double moveSpeed;
//机器人的运动类型:1-MOVJ;2-MOVL;3-IMOV增量
long moveType;
};
在查阅手册的时候可以发现,MOTOCOMES版本的函数基本都会用到一些“官方内建的结构体”。这样使用起来就相对更方便了,用户在进行二次封装的时候接口可以更加简洁清晰。
可以说官方在开发MOTOCOMES版本库函数的时候就考虑到了控制多机器人的场景,所以函数里也留有这样的接口。比如说上面那个ESCartMove函数的入口参数ESCartMoveData的成员里面,结构体ESMoveData有一个成员是robotNo,即机器人编号,范围可以是0,1~8. 通过编辑这个robotNo的值,可以控制不同机器人运动。
另一方面,可以采用其他方式控制多个机器人,除了上述方法外,还可以采用多线程控制(一个线程负责一个机器人)。采用多线程控制以外,除了关心机器人控制程序的逻辑以外,还需要考虑多线程相关的cases。
欢迎关注知乎专栏:Jungle是一个用Qt的工业Robot
欢迎关注Jungle的微信公众号:Jungle笔记