跳到主要内容

追加模式相关

开启追加模式

通过调用函数NRC_OpenInstrAppendRunMode()实现开启追加运行模式,开启追加运行模式后,添加运行队列即可直接响应运行。成功调用该函数后,机器人自动上使能,请注意安全。只有伺服在就绪状态下才可开启追加运行模式,即 NRC_GetServoStatus() == 1。

在追加运行模式中,出现伺服报错、运行报错、解析报错,将自动退出追加运行模式,并下使能,在追加运行模式中,切换示教、运行模式,将会自动退出追加运行模式,并下使能。

关闭追加模式

通过调用函数NRC_CloseInstrAppendRunMode()实现关闭追加运行模式,成功调用该函数后,机器人会自动下使能,只有在无运行队列或全部运行队列已运行完毕的情况下才可关闭追加运行模式,即在 NRC_GetProgramRunStatus() == 0 时。

获取追加运行剩余数目

调用函数NRC_GetRestAppendInstrNum()获取追加运行当前剩余指令数目。返回值是指当前剩余指令数目,需要注意的是对于 MOVC 指令,两条为一对,在插入指令时,插入了两条,但在运行时,是记作一条的。

追加模式下添加运动队列

通过调用函数NRC_AppendRunInstr(std::vector<NRC_InstrDataBase*>& instrVec)实现追加运行模式下,添加运行队列,参数 instrVec 是要插入的一组指令数据,添加运行队列后,机器人将会立即执行加入的队列,请注意安全,添加的运行队列只能是机器人移动指令。

示例:开启追加运行模式,机器人自动上使能

NRC_OpenInstrAppendRunMode();
std::vector<NRC_InstrDataBase*> instrVec;
instrVec.push_back(new NRC_InstrDataMOVJ(50, 50,50,pos1, 5));
instrVec.push_back(new NRC_InstrDataMOVL(30, 50,50,pos2, 2));
//添加队列后,机器人直接运行
NRC_AppendRunInstr(instrVec);
......
instrVec.clear();
instrVec.push_back(new NRC_InstrDataMOVC(20,50,50, pos0, 3));
instrVec.push_back(new NRC_InstrDataMOVC(20,50,50, pos1, 3));
//机器人运行完之前添加的队列后,会接上本次添加的队列
NRC_AppendRunInstr(instrVec);
......
NRC_PauseInstrAppendRun();//暂停运行
......
instrVec.clear();
instrVec.push_back(new NRC_InstrDataMOVJ(50,50,50, pos1, 5));
instrVec.push_back(new NRC_InstrDataMOVL(30,50,50, pos2, 2));
暂停时添加的队列,调用再启动运行后,也可正常运行
NRC_AppendRunInstr(instrVec);
......
NRC_RestartInstrAppendRun();//再启动运行
......
停止运行,机器人停止,并清空全部队列
NRC_StopInstrAppendRun();
关闭追加运行模式,机器人自动下使能
NRC_CloseInstrAppendRunMode();

暂停,再启动,停止相关

通过调用函数NRC_PauseInstrAppendRun()实现暂停追加运行, 成功调用该函数后,机器人将暂停运行,调用 NRC_RestartInstrAppendRun()可继续运行,暂停时添加的运行队列,不会立刻运行,而是放入缓存队列中,调用再启动后,才会运行该队列。

通过调用函数NRC_RestartInstrAppendRun()实现再启动追加运行,在机器人将暂停时,调用该函数可使机器人继续运行。

通过调用函数实现NRC_StopInstrAppendRun()实现停止追加运行,成功调用该函数后,机器人将停止运行,并清空全部运行队列,之后若继续添加运行队列,会直接运行添加的指令。

判断是否是追加模式

通过调用函数NRC_GetIsInstrAppendRunMode()获取当前是否是追加运行模式,返回值表示当前是否是追加运行模式。retval =0 当前不是追加运行模式 retval =1 当前处于追加运行模式。

追加模式相关的 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 };
NRC_OpenInstrAppendRunMode();//开启追加模式后,添加运动队列即可直接相应运行
std::vector<NRC_InstrDataBase*>inexbot;//自动创建队列
inexbot.push_back(new NRC_InstrDataMOVJ(50,50,50,inexbot1, 5));//点到点运动到inexbot1
inexbot.push_back(new NRC_InstrDataMOVL(30,50,50, inexbot2, 2));//直线运动到inexbot2
std::vector<NRC_InstrDataBase*>inexbot6;
inexbot6.push_back(new NRC_InstrDataMOVJ(50,50,50,inexbot3, 5));//直线运动到inexbot3
inexbot6.push_back(new NRC_InstrDataMOVC(50,50,50,inexbot2, 5));
inexbot6.push_back(new NRC_InstrDataMOVC(50,50,50,inexbot1, 5));//圆弧运动到inexbot1
NRC_AppendRunInstr(inexbot);//要插入的一组指令数据,插入到队列。添加队列后,机器人直接运行。
while(NRC_GetProgramRunStatus() != 0) //等待运行结束
{
NRC_Delayms(1000); //延时1000ms
}
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]);//将当前直角坐标位置输出
inexbot.clear();
inexbot.push_back(new NRC_InstrDataMOVC(20,50,50, inexbot3, 3));
inexbot.push_back(new NRC_InstrDataMOVC(20,50,50, inexbot4, 3));//圆弧运动到inexbot4
//机器人运行完之前添加的队列后,会接上本次添加的队列
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_AppendRunInstr(inexbot6);
while(NRC_GetProgramRunStatus() != 0) //等待运行结束
{
NRC_Delayms(1000); //延时1000ms
}
NRC_Position inexbot5;//定义机器人位置结构体对象inexbot5
NRC_GetCurrentPos(NRC_MCS, inexbot5);//将当前机器人的直角坐标系赋值给inexbot5
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]);//将当前直角坐标位置输出

NRC_PauseInstrAppendRun();//暂停运行.暂停时添加的队列,调用再启动运行后,也可正常运行
inexbot6.clear();
inexbot6.push_back(new NRC_InstrDataMOVL(30,50,50, inexbot2, 2));//直线运动到inexbot2

NRC_AppendRunInstr(inexbot6);
NRC_RestartInstrAppendRun();//再启动运行
while(NRC_GetProgramRunStatus() != 0) //等待运行结束
{
NRC_Delayms(1000); //延时1000ms
}
NRC_Position inexbot10;//定义机器人位置结构体对象inexbot10
NRC_GetCurrentPos(NRC_MCS, inexbot10);//将当前机器人的直角坐标系赋值给inexbot9
printf("inexbot10.pos=%f,%f,%f,,%f,%f,%f,%f,\n",inexbot10.pos[0],inexbot10.pos[1],inexbot10.pos[2],inexbot10.pos[3],inexbot10.pos[4],inexbot10.pos[5],inexbot10.pos[6]);//将当前直角坐标位置输出
NRC_CloseInstrAppendRunMode();//关闭追加运行模式,机器人自动下使能
while(1)//保持程序继续运行
{
NRC_Delayms(1000);
}
}