码垛工艺相关
码垛设置
INEXBOT 函数库提供的接口可以实现完整码垛和简易码垛两种类型的码垛。需要注意的是简易码垛和完整码垛共用码垛号,使用前需要设置正确的类型。
在使用码垛工艺编写程序之前,需要先设置好码垛相关参数。码垛的相关参数设置顺序如下:抓手设置,托盘设置,位置设置,工件参数,接近参数,重叠模式,平面模式。
设置和获取码垛类型
调用函数NRC_Pallet_SetUsePalletType(int id, int type)
设置使用简易码垛还是完整码垛。 参数 id 是码垛工艺的工艺号,参数范围:1 <= id <= 9, 参数 type 是使用的码垛类型,0 简易码垛,1 完整码垛。
通过调用函数NRC_Pallet_GetUsePalletType(int id)
获取使用的是使用简易码垛还是完整码垛, 参数 id 是码垛工艺的工艺号,参数范围:1 <= id <= 9。返回值是使用的码垛类型,retval =0 简易码垛,retval =1 完整码垛。
设置和获取简易码垛位置数据
(1) 设置简易码垛位置数据是通过函数NRC_Pallet_SetSimplePosParm(int id, int posType, NRC_Position pos)
实现。
- 参数 id 是码垛工艺的工艺号,参数范围:1 <= id <= 9。
- 参数 posType 是简易码垛的位置类型,0 表示 起始工件点,1 表示 列末端,2 表示行末端,3 表示高末端, 4 表示起始辅助点,5 表示 起始入口点。
- 参数 pos 是简易码垛的位置数据,参见 NRC_Position。
(2)获取简易码垛位置数据是通过调用函数NRC_Pallet_GetSimplePosParm(int id, int posType, NRC_Position& pos)
实现的。
- 参数 id 是 码垛工艺的工艺号,参数范围:1 <= id <= 9。
- 参数 posType 简易码垛的位置类型,0 是起始工件点,1 是列末端,其托盘 X 方向(对应用户坐标的 X 方向),2 是行末端,其托盘 Y 方向(对应用户坐标的 Y 方向),3 是 高末端,4 是 起始辅助点,5 是起始入口点。
- 参数 pos 是简易码垛的位置数据,参见 NRC_Position。
设置和获取简易码垛个数数据
(1)设置简易码垛个数数据是通过函数NRC_Pallet_SetSimpleNumParm(int id, int numX, int numY, int numZ)
实现的。
- 参数 id 是码垛工艺的工艺号,参数范围:1 <= id <= 9。
- 参数 numX 表示简易码垛在其托盘 X 方向(对应用户坐标的 X 方向)上的工件数目,即行数。
- 参数 numY 表示简易码垛在其托盘 Y 方向(对应用户坐标的 Y 方向)上的工件数目,即列数 。
- 参数 numZ 表示简易码垛在其托盘 Z 方向(对应用户坐标的 Z 方向)上的工件数目,即层数。
(2)同样获取简易码垛个数数据通过调用函数NRC_Pallet_GetSimpleNumParm(int id, int& numX, int& numY, int& numZ)
来实现。
- 参数 id 是码垛工艺的工艺号,参数范围:1 <= id <= 9。
- 参数 numX 表示简易码垛在其托盘 X 方向(对应用户坐标的 X 方向)上的工件数目,即行数。
- 参数 numY 表示简易码垛在其托盘 Y 方向(对应用户坐标的 Y 方向)上的工件数目,即列数 。
- 参数 numZ 表示简易码垛在其托盘 Z 方向(对应用户坐标的 Z 方向)上的工件数目,即层数。
清除码垛当前状态
需要清除码垛当前状态需要调用函数 NRC_Pallet_ClearCurrentStatus(int id)
实现,其中参数 id 表示码垛工艺的工艺号,此参数的范围是:1 <= id <= 9。
设置和获取码垛已码个数
(1)当码垛因为某种缘故中断,或者码垛相关数据发生改变时,可以通过设置码垛已码个数,使码垛正常运行。使用函数NRC_Pallet_SetPalletedWpNum(int id, unsigned int layerNum, unsigned int layerPalletedWpNum)
实现此功能。
- 参数 id 表示码垛工艺号。
- layerNum 表示要修改的已码垛层数。
- 参数 layerPalletdWpNum 表示要修改的层已码工件数。
(2)获取码垛已码个数可以通过调用函数NRC_Pallet_GetPalletedWpNum(int id, int& curPalletedWpSum, int& curLayerNum, int& curLayerPalletedWpNum, int& totalWpNum, int& totalLayerNum, int& curLayerWpSum)
实现。
- 参数 id 表示 码垛工艺的工艺号,参数范围:1 <= id <= 9。
- 参数 curPalletedWpSum 表示当前已码工件数。
- 参数 curLayerNum 表示当前已码层数。
- 参数 curLayerPalletedWpNum 表示当前层的已码工件数。
- 参数 totalWpNum 表示垛堆工件总数。
- 参数 totalLayerNum 表示垛堆总层数。
- 参数 curLayerWpSum 表示当前层的工件总数。 需要注意的是 对于用作返回值的 6 个参数,当其值为-1 时,表示个数未知
设置和获取码垛抓手数据
(1)设置码垛抓手数据通过调用函数NRC_Pallet_SetGripperParm(int id, int gripperSum, int gripper[4])
实现。
- 其中参数 id 表示码垛工艺的工艺号,参数范围:1 <= id <= 9。
- 参数 gripperSum 表示可用抓手总数,参数范围:1 <= gripperSum <= 4。
- 参数 gripper[4] 表示每个抓手所绑定的工具坐标号,1 <= gripper[i] <= 9。
(2)获取码垛抓手数据通过调用函数
NRC_Pallet_GetGripperParm(int id, int& gripperSum, int gripper[4])
实现。 - 参数 id 表示 码垛工艺的工艺号,参数范围:1 <= id <= 9。
- 参数 gripperSum 表示获取到的可用抓手总数。
- 参数 gripper[4] 表示获取到的每个抓手所绑定的工具坐标号。
作业文件实现码垛
插入下列指令时,请先调用NRC_CreateJobfile(std::string jobname)
或NRC_OpenJobfile (std::string jobname)
创建或打开一个作业文件。
插入 PALON
该函数的功能是码垛开始判断。通过调用函数NRC_JobfileInsertPALON(int line, int id, int type, int var1=0, int var2=0, int var3=0)
实现作业文件插入 PALON 指令。函数需要和NRC_RunqueueInsertPALOFF(int id, int var)
配合使用,否则会出现错误。
- 参数 line 是将指令插入到第 line 行,参数范围:0 < line < (NRC_GetJobfileLineSum()+1)。
- 参数 id 表示码垛工艺的工艺号,参数范围:1 <= id <=9
- 参数 type 表示码垛类型。0 表示码垛,1 表示 卸跺。
- 参数 var1 表示存放当前已码工件总数,0 表示不存放,1-100 表示变量 GI001-GI100,参数范围:0 <= var1 <= 100。
- 参数 var2 表示 存放当前已码层数,0 表示不存放,1-100 表示变量 GI001-GI100,参数范围:0 <= var2 <= 100。
- 参数 var3 表示存放当前层已码工件数,0 表示不存放,1-100 表示变量 GI001-GI100,参数范围:0 <= var3 <= 100。
插入 PALOFF
该函数的功能是码垛结束判断。通过调用函数NRC_JobfileInsertPALOFF(int line, int id, int var=0)
实现作业文件插入 PALOFF 指令。函数需要和 NRC_JobfileInsertPALON(int line, int id, int type, int var1, int var2, int var3)
配合使用。
- 参数 line 将指令插入到第 line 行,参数范围:0 < line < (NRC_GetJobfileLineSum()+1)。
- 参数 id 表示码垛工艺的工艺号,参数范围:1 <= id <= 9。
- 参数 var 表示存放码垛是否结束判断,0 表示不存放,1-100 表示变量 GA001-GA100。
- 参数范围:0 <= var <= 100。
插入 PALGRIPPER
该函数实现选取抓手的功能。通过调用函数 NRC_JobfileInsertPALGRIPPER(int line, int id, int tool)
实现作业文件插入 PALGRIPPER 指令。
- 参数 line 表示将指令插入到第 line 行,参数范围:0 < line < (NRC_GetJobfileLineSum()+1)。
- 参数 id 表示码垛工艺的工艺号,参数范围:1 <= id <= 9。
- 参数 tool 是要更换的抓手编号,参数范围:1 <= id <= 4。
插入 PALCLEAR
该函数的功能是码垛复位,码垛状态清空。通过调用函数NRC_JobfileInsertPALCLEAR(int line, int id)
实现作业文件插入 PALCLEAR 指令。
- 参数 line 表示将指令插入到第 line 行,参数范围:0 < line < (NRC_GetJobfileLineSum()+1)。
- 参数 id 表示码垛工艺的工艺号,参数范围:1 <= id <= 9。
插入 PALENTER
对码垛入口点相关的设置。通过调用函数NRC_JobfileInsertPALENTER(int line, int id, int moveType, int acc, int dec, int vel, int pl=0)
实现作业文件插入 PALENTER 指令。
- 参数 line 表示 将指令插入到第 line 行,参数范围:0 < line < (NRC_GetJobfileLineSum()+1),
- 参数 id 表示码垛工艺的工艺号。
- 参数范围:1 <= id <= 9, 参数 moveType 表示该条指令所使用的插补方式,1 表示 关节插补,2 表示直线插补,3 表示 圆弧插补。插补方式为关节时为机器人最大速度的百分比,参数范围:0 < vel <= 100,插补方式为直线或圆弧时 为机器人末端位置点绝对运行速度,单位为 毫米每秒(mm/s),参数范围:vel > 1。
- 参数 acc 机器人运行加速度,参数范围:0 < vel <= 100 插补方式为关节时为机器人各关节最大加速度的百分比插补方式为直线或圆弧时为机器人笛卡尔最大加速度的百分比。
- 参数 dec 机器人运行减速度,参数范围:0 < vel <= 100 插补方式为关节时为机器人各关节最大减速度的百分比 插补方式为直线或圆弧时为机器人笛卡尔最大减速度的百分比。
- 参数 pl 表示平滑度,将和后面一条移动指令进行平滑过渡,数值越大,越平滑,轨迹偏差也越大,参数范围:0 <= pl <= 5。
插入 PALSHIFT
对码垛辅助点的相关设置。通过调用函数NRC_JobfileInsertPALSHIFT(int line, int id, int moveType, int acc, int dec, int vel, int pl=0)
实现作业文件插入 PALSHIFT 指令。
- 参数 line 表示 将指令插入到第 line 行,参数范围:0 < line < (NRC_GetJobfileLineSum()+1)。
- 参数 id 表示码垛工艺的工艺号,参数范围:1 <= id <= 9。
- 参数 moveType 表示 该条指令所使用的插补方式,1 表示关节插补,2 表示直线插补,3 表示 圆弧插补。参数 vel 表示 机器人的运行速度。插补方式为关节时 为机器人最大速度的百分比,参数范围:0 < vel <= 100,插补方式为直线或圆弧时 为机器人末端位置点绝对运行速度,单位为 毫米每秒(mm/s),参数范围:vel > 1。
- 参数 acc 机器人运行加速度,参数范围:0 < vel <= 100 插补方式为关节时 为机器人各关节最大加速度的百分比插补方式为直线或圆弧时为机器人笛卡尔最大加速度的百分比。
- 参数 dec 机器人运行减速度,参数范围:0 < vel <= 100 插补方式为关节时 为机器人各关节最大减速度的百分比 插补方式为直线或圆弧时为机器人笛卡尔最大减速度的百分比。
- 参数 pl 表示 平滑度,将和后面一条移动指令进行平滑过渡,数值越大,越平滑,轨迹偏差也越大,参数范围:0 <= pl <= 5。
插入 PALREAL
对码垛工件点的相关设置。通过调用函数NRC_JobfileInsertPALREAL(int line, int id, int moveType, int acc, int dec, int vel, int pl=0)
实现作业文件插入 PALREAL 指令。
- 参数 line 表示 将指令插入到第 line 行,参数范围:0 < line < (NRC_GetJobfileLineSum()+1)。
- 参数 id 表示码垛工艺的工艺号,参数范围:1 <= id <= 9。
- 参数 moveType 表示 该条指令所使用的插补方式,1 表示关节插补,2 表示直线插补,3 表示 圆弧插补。
- 参数 vel 表示 机器人的运行速度。插补方式为关节时 为机器人最大速度的百分比,参数范围:0 < vel <= 100,插补方式为直线或圆弧时为机器人末端位置点绝对运行速度,单位为 毫米每秒(mm/s),参数范围:vel > 1。
- 参数 acc 机器人运行加速度,参数范围:0 < vel <= 100 插补方式为关节时 为机器人各关节最大加速度的百分比插补方式为直线或圆弧时为机器人笛卡尔最大加速度的百分比。
- 参数 dec 机器人运行减速度,参数范围:0 < vel <= 100 插补方式为关节时 为机器人各关节最大减速度的百分比 插补方式为直线或圆弧时为机器人笛卡尔最大减速度的百分比。
- 参数 pl 表示平滑度,将和后面一条移动指令进行平滑过渡,数值越大,越平滑,轨迹偏差也越大,参数范围:0 <= pl <= 5。
用作业文件实现码垛工艺的 demo 程序
int main()
{
SystemStartup();//系统启动,详见3.3节
SetServoMap();//设置伺服映射关系,见3.5节
SettingofRobotRelatedParameters();//机器人相关参数设置,详见3.6节
//////以上调用函数可见附录一/////
NRC_SetServoReadyStatus(1);//设置伺服允许,详见3.8节
NRC_SetInterpolationMethod(1);//设置为S形插补方式,详见3.12节
NRC_SetOperationMode(NRC_RUN_);//设置操作模式为运行模式,详见3.11节
NRC_SetAutoRunSpeedPer(80);//设置自动速度为80,详见3.11节
NRC_Delayms(1000);//延时1000ms
//设置四个点(采用新版本定义方式)
double pos1[7] = { 296.71, -66.12, 606.38, 3.06, 0.15, -0.18,0.00 };
double pos2[7] = { 303.3191, 20.0862, 606.3863, 3.1038, 0.1630, -0.4658,0.0000 };
double pos3[7] = { 315.4386, 21.1369, 595.0522, 3.1006, 0.1196, -0.4678,0.0000 };
double pos4[7] = { 315.6836, -16.5291, 595.0751, 3.0866, 0.1140, -0.3479,0.0000 };
NRC_Position inexbot1 = { NRC_MCS,0,0,0,pos1 };
NRC_Position inexbot2 = { NRC_MCS,0,0,0,pos2 };
NRC_Position inexbot3 = { NRC_MCS,0,0,0,pos3 };
NRC_Position inexbot4 = { NRC_MCS,0,0,0,pos4 };
double devPos1[7] = { 10, 20, -10, 10, 0, 0 };
double devPos2[7] = { -50, 50, 10, 0, 0, 0.1 };
NRC_Position dev1 = { NRC_ACS,0,0,0,devPos1 }; //设置dev1的偏差
NRC_Position dev2 = { NRC_MCS,0,0,0,devPos2 }; //设置dev2的偏差
NRC_Position inexbot9;//定义机器人位置结构体对象inexbot6
NRC_GetCurrentPos(NRC_MCS, inexbot9);//将当前机器人的直角坐标系赋值给inexbot6
printf("inexbot9.pos=%f,%f,%f,,%f,%f,%f,%f,\n", inexbot9.pos[0], inexbot9.pos[1], inexbot9.pos[2], inexbot9.pos[3], inexbot9.pos[4], inexbot9.pos[5], inexbot9.pos[6]);//将当前直角坐标位置输出,
int id = 1;
NRC_Pallet_SetUsePalletType(id, 0);//设置为简易玛垛,且工艺号为1
cout << "NRC_Pallet_GetUsePalletType : " << NRC_Pallet_GetUsePalletType(1) << endl;
NRC_Position pos[] =
{
{NRC_MCS, {401, 301, 201, 3.14159, 0, 0,0}},
{NRC_MCS, {401, -299, 201, 3.14159, 0, 0,0}},
{NRC_MCS, {201, 301, 201, 3.14159, 0, 0,0}},
{NRC_MCS, {401, 301, 301, 3.14159, 0, 0,0}},
{NRC_MCS, {401, 301, 211, 3.14159, 0, 0,0}},
{NRC_MCS, {401, 301, 221, 3.14159, 0, 0,0}},
};
for (int i = 0; i < 6; i++)
NRC_Pallet_SetSimplePosParm(id, i, pos[i]);//设置简易码垛位置数据
for (int i = 0; i < 6; i++)
{
NRC_Position pos;
NRC_Pallet_GetSimplePosParm(id, i, pos);
}
NRC_Pallet_SetSimpleNumParm(id, 3, 2, 3);
int x = 0, y = 0, z = 0;
NRC_Pallet_GetSimpleNumParm(id, x, y, z);
cout << "x=" << x << ", y=" << y << ",z=" << z << endl;
NRC_Delayms(2000);
//作业文件中实现码垛工艺
if (NRC_JudgeJobIsExist("INEXBOT1") == 0)
{
cout << "作业文件不存在" << endl;
NRC_CreateJobfile("INEXBOT1");//创建作业文件INEXBOT1
NRC_OpenJobfile("INEXBOT1");
}
else
NRC_OpenJobfile("INEXBOT1");//打开作业文件INEXBOT1
NRC_JobfileInsertPALCLEAR(1, 1);//清空之前的码垛数据
NRC_JobfileInsertMOVJ(2, 50, 50, 50, inexbot1, 4);//点到点运动到inexbot1(取料入口点)
NRC_JobfileInsertMOVL(3, 50, 50, 50, inexbot2, 1);//直线运动到inexbot2,(取料辅助点)
NRC_JobfileInsertMOVJ(4, 50, 50, 50, inexbot3, 1);//点到点运动到inexbot3,(取料工件点)
NRC_JobfileInsertDOUT(5, 4, 1);//数字输出端口4输出高电平
NRC_JobfileInsertWAIT(6, 5, 1, 3.3);//等待数字输入端口4输入高电平,若3.3秒后仍然未满足条件,本指令结束
NRC_JobfileInsertPALON(7, 1, 0, 0, 0);// 码垛工艺号1.码垛类型是码垛,当前已码总数变量 1,当前码垛层数变量 2,当前层跺数变量 3 (玛垛开始判断)
NRC_JobfileInsertPALENTER(8, 1, 1, 100,80,80, 5);//码垛工艺号1,采用关节插补方式,运行速度100mm/s,平滑度设置为5(码垛入口点)
NRC_JobfileInsertPALSHIFT(9, 1, 1, 50, 80,80,5);//码垛工艺号1,采用关节插补方式,运行速度50mm/s,平滑度设置为5(码垛辅助点 )
NRC_JobfileInsertPALREAL(10, 1, 1, 50, 80,80,5);//码垛工艺号1,采用关节插补方式,运行速度50mm/s,平滑度设置为5(码垛工件点 )
NRC_JobfileInsertDOUT(11, 3, 1);//数字输出端口3输出高电平
NRC_JobfileInsertWAIT(12, 3, 1, 3.3);//等待数字输入端口3输入高电平,若3.3秒后仍然未满足条件,本指令结束
NRC_JobfileInsertPALOFF(13, 1, 1);//存放码垛是否结束判断
cout << "file line sum is " << NRC_GetJobfileLineSum() << endl;
NRC_ServoEnable(); //伺服上电
NRC_StartRunJobfile("INEXBOT1");//开始运行作业文件
NRC_SetCycleIndex(3);//循环运行3次
while (NRC_GetProgramRunStatus() != 0) //等待运行结束
{
NRC_Delayms(500); //延时100ms
printf("line=%d,time=%d\n", NRC_GetJobfileCurrentRunLine(), NRC_GetCycleTimeSec());
}
NRC_ServoDisable(); //伺服下电
NRC_Position inexbot7;//定义机器人位置结构体对象inexbot7
NRC_GetCurrentPos(NRC_MCS, inexbot7);//将当前机器人的直角坐标系赋值给inexbot7
printf("inexbot7.pos=%f,%f,%f,,%f,%f,%f,%f,\n", inexbot7.pos[0], inexbot7.pos[1], inexbot7.pos[2], inexbot7.pos[3], inexbot7.pos[4], inexbot7.pos[5], inexbot7.pos[6]);//将当前直角坐标位置输出
while(1)//保持程序继续运行
{
NRC_Delayms(1000);
}
}
无文件运动队列实现码垛
调用下面函数前,请先调用NRC_CreateNoFlieRunqueue()
创建一个无文件运行队列,
插入 PALON
该函数的功能是码垛开始判断。通过调用函数NRC_RunqueueInsertPALON(int id, int type, int var1=0, int var2=0, int var3=0)
实现运行队列插入 PALON 指令。函数需要和NRC_RunqueueInsertPALOFF(int id, int var)
配合使用。
- 参数 id 表示码垛工艺的工艺号,参数范围:1 <= id <= 9。
- 参数 type 表示码垛类型。 0 表示码垛,1 表示 卸跺。
- 参数 var1 表示存放当前已码工件总数,0 表示不存放,1-100 表示变量 GI001-GI100,参数范围:0 <= var1 <= 100。
- 参数 var2 表示 存放当前已码层数,0 表示不存放,1-100 表示变量 GI001-GI100,参数范围:0 <= var2 <= 100。
- 参数 var3 表示存放当前层已码工件数,0 表示不存放,1-100 表示变量 GI001-GI100,参数范围:0 <= var3 <= 100。
插入 PALREAL
对码垛工件点的相关设置。通过调用函数NRC_RunqueueInsertPALREAL(int id, int moveType, int vel, int acc, int dec, int pl=0)
实现运行队列插入 PALREAL 指令。
- 参数 id 表示码垛工艺的工艺号,参数范围:1 <= id <= 9。
- 参数 moveType 表示该条指令所使用的插补方式,1 表示关节插补,2 表示直线插补,3 表示圆弧插补。
- 参数 vel 表示机器人的运行速度。插补方式为关节时 为机器人最大速度的百分比,参数范围:0 < vel <= 100,插补方式为直线或圆弧时为机器人末端位置点绝对运行速度,单位为 毫米每秒(mm/s),参数范围:vel > 1。
- 参数 acc 机器人运行加速度,参数范围:0 < vel <= 100 插补方式为关节时为机器人各关节最大加速度的百分比插补方式为直线或圆弧时为机器人笛卡尔最大加速度的百分比。
- 参数 dec 机器人运行减速度,参数范围:0 < vel <= 100 插补方式为关节时为机器人各关节最大减速度的百分比 插补方式为直线或圆弧时为机器人笛卡尔最大减速度的百分比。
- 参数 pl 表示 平滑度,将和后面一条移动指令进行平滑过渡,数值越大,越平滑,轨迹偏差也越大,参数范围:0 <= pl <= 5。
插入 PALOFF
该函数的功能是存放码垛是否结束判断。通过调用函数NRC_RunqueueInsertPALOFF(int id, int var=0)
实现运行队列插入 PALOFF 指令。 函数需要和 NRC_RunqueueInsertPALON(int id, int type, int var1, int var2, int var3)
配合使用。
- 参数 id 表示码垛工艺的工艺号,参数范围:1 <= id <= 9。
- 参数 var 为 0 表示不存放,1-100 表示变量 GA001-GA100,参数范围:0 <= var <= 100。
插入 PALGRIPPER
该函数实现选取抓手的功能。通过调用函数NRC_RunqueueInsertPALGRIPPER(int id, int tool)
实现运行队列插入 PALGRIPPER 指令。
- 参数 id 表示码垛工艺的工艺号,参数范围:1 <= id <= 9.
- 参数 tool 是要更换的抓手编号,参数范围:1 <= id <= 4。
插入 PALCLEAR
该函数的功能是码垛复位,码垛状态清空。通过调用函数 NRC_RunqueueInsertPALCLEAR(int id)实现运行队列插入 PALCLEAR 指令,参数 id 表示码垛工艺的工艺号,参数范围:1 <= id <= 9。
插入 PALENTER
对码垛入口点相关的设置。通过调用函数 NRC_RunqueueInsertPALENTER(int id, int moveType, int vel, int acc, int dec, int pl=0)实现运行队列插入 PALENTER 指令。
- 参数 id 表示码垛工艺的工艺号,参数范围:1 <= id <= 9。
- 参数 moveType 表示该条指令所使用的插补方式,1 表示 关节插补,2 表示直线插补,3 表示 圆弧插补。
- 参数 vel 表示 机器人的运行速度。插补方式为关节时 为机器人最大速度的百分比,参数范围:0 < vel <= 100,插补方式为直线或圆弧时为机器人末端位置点绝对运行速度,单位为毫米每秒(mm/s),参数范围:vel > 1。
- 参数 acc 机器人运行加速度,参数范围:0 < vel <= 100 插补方式为关节时为机器人各关节最大加速度的百分比插补方式为直线或圆弧时为机器人笛卡尔最大加速度的百分比。
- 参数 dec 机器人运行减速度,参数范围:0 < vel <= 100 插补方式为关节时为机器人各关节最大减速度的百分比 插补方式为直线或圆弧时为机器人笛卡尔最大减速度的百分比。
- 参数 pl 表示平滑度,将和后面一条移动指令进行平滑过渡,数值越大,越平滑,轨迹偏差也越大,参数范围:0 <= pl <= 5。
插入 PALSHIFT
对码垛辅助点的相关设置。通过调用函数NRC_RunqueueInsertPALSHIFT(int id, int moveType, int vel, int acc, int dec, int pl=0)
实现运行队列插入 PALSHIFT 指令。
- 参数 id 表示码垛工艺的工艺号,参数范围:1 <= id <= 9。
- 参数 moveType 表示 该条指令所使用的插补方式,1 表示 关节插补,2 表示直线插补,3 表示圆弧插补。
- 参数 vel 表示机器人的运行速度。插补方式为关节时 为机器人最大速度的百分比,参数范围:0 < vel <= 100,插补方式为直线或圆弧时 为机器人末端位置点绝对运行速度,单位为毫米每秒(mm/s),参数范围:vel > 1。
- 参数 acc 机器人运行加速度,参数范围:0 < vel <= 100 插补方式为关节时为机器人各关节最大加速度的百分比插补方式为直线或圆弧时为机器人笛卡尔最大加速度的百分比。
- 参数 dec 机器人运行减速度,参数范围:0 < vel <= 100 插补方式为关节时为机器人各关节最大减速度的百分比 插补方式为直线或圆弧时为机器人笛卡尔最大减速度的百分比。
- 参数 pl 表示平滑度,将和后面一条移动指令进行平滑过渡,数值越大,越平滑,轨迹偏差也越大,参数范围:0 <= pl <= 5。
运动队列实现码垛工艺的 demo 程序
#include <iostream>
#include "nrcAPI.h"
#include<stdio.h>
using namespace std;
int main()
{
SystemStartup();//系统启动,详见3.3节
RobotMsg();
SetServoMap();//设置伺服映射关系,见3.5节
SettingofRobotRelatedParameters();//机器人相关参数设置,详见3.6节
//////以上调用函数可见附录一/////
NRC_SetServoReadyStatus(1);//设置伺服允许,详见3.8节
NRC_SetInterpolationMethod(1);//设置为S形插补方式,详见3.12节
NRC_SetOperationMode(NRC_RUN_);//设置操作模式为运行模式,详见3.11节
NRC_SetAutoRunSpeedPer(80);//设置自动速度为80,详见3.11节
NRC_Delayms(1000);//延时1000ms
//设置四个点(采用新版本定义方式)
double pos1[7] = { 296.71, -66.12, 606.38, 3.06, 0.15, -0.18,0.00 };
double pos2[7] = { 303.3191, 20.0862, 606.3863, 3.1038, 0.1630, -0.4658,0.0000 };
double pos3[7] = { 315.4386, 21.1369, 595.0522, 3.1006, 0.1196, -0.4678,0.0000 };
double pos4[7] = { 315.6836, -16.5291, 595.0751, 3.0866, 0.1140, -0.3479,0.0000 };
NRC_Position inexbot1 = { NRC_MCS,0,0,0,pos1 };
NRC_Position inexbot2 = { NRC_MCS,0,0,0,pos2 };
NRC_Position inexbot3 = { NRC_MCS,0,0,0,pos3 };
NRC_Position inexbot4 = { NRC_MCS,0,0,0,pos4 };
NRC_Position dev1 = { NRC_ACS,0,0,0,devPos1 }; //设置dev1的偏差
NRC_Position dev2 = { NRC_MCS,0,0,0,devPos2 }; //设置dev2的偏差
NRC_Position inexbot9;//定义机器人位置结构体对象inexbot6
NRC_GetCurrentPos(NRC_MCS, inexbot9);//将当前机器人的直角坐标系赋值给inexbot6
printf("inexbot9.pos=%f,%f,%f,,%f,%f,%f,%f,\n", inexbot9.pos[0], inexbot9.pos[1], inexbot9.pos[2], inexbot9.pos[3], inexbot9.pos[4], inexbot9.pos[5], inexbot9.pos[6]);//将当前直角坐标位置输出,
int id = 1;
NRC_Pallet_SetUsePalletType(id, 0);//设置为简易玛垛,且工艺号为1
cout << "NRC_Pallet_GetUsePalletType : " << NRC_Pallet_GetUsePalletType(1) << endl;
NRC_Position pos[] =
{
{NRC_MCS, {401, 301, 201, 3.14159, 0, 0,0}},
{NRC_MCS, {401, -299, 201,3.14159, 0, 0,0}},
{NRC_MCS, {201, 301, 201, 3.14159, 0, 0,0}},
{NRC_MCS, {401, 301, 301, 3.14159, 0, 0,0}},
{NRC_MCS, {401, 301, 211, 3.14159, 0, 0,0}},
{NRC_MCS, {401, 301, 221, 3.14159, 0, 0,0}},
};
for (int i=0; i<6; i++)
NRC_Pallet_SetSimplePosParm(id, i, pos[i]);//设置简易码垛位置数据
for (int i=0; i<6; i++)
{
NRC_Position pos;
NRC_Pallet_GetSimplePosParm(id, i, pos);
}
NRC_Pallet_SetSimpleNumParm(id, 3, 2, 3);
int x=0,y=0,z=0;
NRC_Pallet_GetSimpleNumParm(id, x, y, z);
cout << "x=" << x << ", y=" << y << ",z=" << z << endl;
NRC_Delayms(2000);
//运动队列中实现码垛工艺
NRC_ServoEnable() ;//伺服上电
NRC_CreateNoFlieRunqueue();
NRC_RunqueueInsertPALCLEAR(1);//清空之前的码垛数据
NRC_RunqueueInsertMOVJ(50, 50,50,inexbot1, 4);//点到点运动到inexbot1(取料入口点)
NRC_RunqueueInsertMOVJ(50,50,50, inexbot2, 4);//点到点运动到inexbot2(取料辅助点“)
NRC_RunqueueInsertMOVJ(50,50,50,inexbot3, 4);//点到点运动到inexbot3,(取料工件点)
NRC_RunqueueInsertDOUT(3, 1);//三号端口输出高电平
NRC_RunqueueInsertPALON(1, 0, 0,0, 0);// 码垛工艺号1.码垛类型是码垛,当前已码总数变量 0,当前码垛层数变量 0,当前层跺数变量 0(玛垛开始判断)
NRC_RunqueueInsertPALENTER(0,1, 100,80,80,5);//码垛工艺号1,采用关节插补方式,运行速度100mm/s,平滑度设置为5(码垛入口点)
NRC_RunqueueInsertPALSHIFT(1, 1, 50,80,80,5);//码垛工艺号1,采用关节插补方式,运行速度50mm/s,平滑度设置为5(码垛辅助点 )
NRC_RunqueueInsertPALREAL(1, 1, 50,80,80,5);//码垛工艺号1,采用关节插补方式,运行速度50mm/s,平滑度设置为5(码垛工件点 )
NRC_RunqueueInsertTIMER(5.5);//等待5.5秒
NRC_RunqueueInsertPALOFF(1, 0);//存放码垛是否结束判断
NRC_StartRunNoFlieRunqueue();
NRC_SetCycleIndex(3);//循环运行3次
while(NRC_GetProgramRunStatus() != 0) //等待运行结束
{
NRC_Delayms(100); //延时100ms
printf("line=%d,time=%d\n",NRC_GetRunqueueCurrentRunLine(),NRC_GetCycleTimeSec());
}
NRC_Delayms(1000);
NRC_ServoDisable(); //伺服下电
NRC_Position inexbot5;//定义机器人位置结构体对象inexbot6
NRC_GetCurrentPos(NRC_MCS, inexbot5);//将当前机器人的直角坐标系赋值给inexbot6
printf("inexbot5.pos=%f,%f,%f,,%f,%f,%f,%f,\n",inexbot5.pos[0],inexbot5.pos[1],inexbot5.pos[2],inexbot5.pos[3],inexbot5.pos[4],inexbot5.pos[5],inexbot5.pos[6]);//将当前直角坐标位置输出while(1)//保持程序继续运行
while(1)//保持程序继续运行
{
NRC_Delayms(1000);
}
}
追加模式下的码垛工艺的 demo 程序
#include <iostream>
#include "nrcAPI.h"
#include<stdio.h>
using namespace std;
int main()
{
SystemStartup();//系统启动,详见3.3节
SetServoMap();//设置伺服映射关系,见3.5节
SettingofRobotRelatedParameters();//机器人相关参数设置,详见3.6节
//////以上调用函数可见附录一/////
NRC_SetServoReadyStatus(1);//设置伺服允许,详见3.8节
NRC_SetInterpolationMethod(1);//设置为S形插补方式,详见3.12节
NRC_SetOperationMode(NRC_RUN_);//设置操作模式为运行模式,详见3.11节
NRC_SetAutoRunSpeedPer(80);//设置自动速度为80,详见3.11节
NRC_Delayms(1000);//延时1000ms
//设置四个点(采用新版本定义方式)
double pos1[7] = { 296.71, -66.12, 606.38, 3.06, 0.15, -0.18,0.00 };
double pos2[7] = { 303.3191, 20.0862, 606.3863, 3.1038, 0.1630, -0.4658,0.0000 };
double pos3[7] = { 315.4386, 21.1369, 595.0522, 3.1006, 0.1196, -0.4678,0.0000 };
double pos4[7] = { 315.6836, -16.5291, 595.0751, 3.0866, 0.1140, -0.3479,0.0000 };
NRC_Position inexbot1 = { NRC_MCS,0,0,0,pos1 };
NRC_Position inexbot2 = { NRC_MCS,0,0,0,pos2 };
NRC_Position inexbot3 = { NRC_MCS,0,0,0,pos3 };
NRC_Position inexbot4 = { NRC_MCS,0,0,0,pos4 };
double devPos1[7] = { 10, 20, -10, 10, 0, 0 };
double devPos2[7] = { -50, 50, 10, 0, 0, 0.1 };
NRC_Position dev1 = { NRC_ACS,0,0,0,devPos1 }; //设置dev1的偏差
NRC_Position dev2 = { NRC_MCS,0,0,0,devPos2 }; //设置dev2的偏差
NRC_Position inexbot9;//定义机器人位置结构体对象inexbot6
NRC_GetCurrentPos(NRC_MCS, inexbot9);//将当前机器人的直角坐标系赋值给inexbot6
printf("inexbot9.pos=%f,%f,%f,,%f,%f,%f,%f,\n", inexbot9.pos[0], inexbot9.pos[1], inexbot9.pos[2], inexbot9.pos[3], inexbot9.pos[4], inexbot9.pos[5], inexbot9.pos[6]);//将当前直角坐标位置输出,
int id = 1;
NRC_Pallet_SetUsePalletType(id, 0);//设置为简易玛垛,且工艺号为1
cout << "NRC_Pallet_GetUsePalletType : " << NRC_Pallet_GetUsePalletType(1) << endl;
NRC_Position pos[] =
{
{NRC_MCS, {401, 301, 201, 3.14159, 0, 0,0}},
{NRC_MCS, {401, -299, 201,3.14159, 0, 0,0}},
{NRC_MCS, {201, 301, 201, 3.14159, 0, 0,0}},
{NRC_MCS, {401, 301, 301, 3.14159, 0, 0,0}},
{NRC_MCS, {401, 301, 211, 3.14159, 0, 0,0}},
{NRC_MCS, {401, 301, 221, 3.14159, 0, 0,0}},
};
for (int i=0; i<6; i++)
NRC_Pallet_SetSimplePosParm(id, i, pos[i]);//设置简易码垛位置数据
for (int i=0; i<6; i++)
{
NRC_Position pos;
NRC_Pallet_GetSimplePosParm(id, i, pos);
}
NRC_Pallet_SetSimpleNumParm(id, 3, 2, 3);
int x=0,y=0,z=0;
NRC_Pallet_GetSimpleNumParm(id, x, y, z);
cout << "x=" << x << ", y=" << y << ",z=" << z << endl;
NRC_Delayms(2000);
//追加模式实现码垛
NRC_OpenInstrAppendRunMode();//开启追加运行模式,机器人自动上使能
std::vector<NRC_InstrDataBase*> inexbot;
inexbot.push_back(new NRC_InstrDataMOVJ(100,50,50, inexbot1, 5));//点到点运动到inexbot1(取料入口点)
inexbot.push_back(new NRC_InstrDataMOVJ(100, 50,50,inexbot2, 5));//点到点运动到inexbot2(取料辅助点)
inexbot.push_back(new NRC_InstrDataMOVJ(100,50,50, inexbot3, 5));//点到点运动到inexbot3(取料工件点)
inexbot.push_back(new NRC_InstrDataPALON(1, 0, 1, 2, 3));// 码垛工艺号1.码垛类型是码垛,当前已码总数变量 1,当前码垛层数变量 2,当前层跺数变量 3
inexbot.push_back(new NRC_InstrDataPALENTER(1, 1, 50,80,80,3));//码垛工艺号1,速度是50mm/s,平滑过渡值是5,(码垛入口点)
inexbot.push_back(new NRC_InstrDataPALSHIFT(1, 1, 50,80,80,3));//码垛工艺号1,采用关节插补方式,运行速度50mm/s,平滑度设置为5(码垛辅助点 )
inexbot.push_back(new NRC_InstrDataPALREAL(1, 2, 100,80,80,3));//码垛工艺号1,采用关节插补方式,运行速度50mm/s,平滑度设置为5(码垛工件点 )
inexbot.push_back(new NRC_InstrDataTIMER(1));
inexbot.push_back(new NRC_InstrDataPALOFF(1, 1));//(码垛结束判断 )
NRC_AppendRunInstr(inexbot);//要插入的一组指令数据,插入到队列。添加队列后,机器人直接运行。
while(NRC_GetProgramRunStatus() != 0) //等待运行结束
{
NRC_Delayms(1000); //延时1000ms
}
NRC_Position inexbot8;//定义机器人位置结构体对象inexbot8
NRC_GetCurrentPos(NRC_MCS, inexbot8);//将当前机器人的直角坐标系赋值给inexbot8
printf("inexbot8.pos=%f,%f,%f,%f,%f,%f,%f,\n",inexbot8.pos[0],inexbot8.pos[1],inexbot8.pos[2],inexbot8.pos[3],inexbot8.pos[4],inexbot8.pos[5],inexbot8.pos[6]);//将当前直角坐标位置输出
NRC_StopInstrAppendRun();//停止追加运行
while(1)//保持程序继续运行
{
NRC_Delayms(1000);
}
}