Appearance
控制器自定义指令使用示例
本文档只适用于有C++开发基础的用户
本文主要围绕相关下载内的控制器二次开发demo进行教学,需要结合demo中的代码一起看
1,注册自定义指令的回调函数
cpp
NRC_SetJobFileCustomInstructionCB(userdefinecmd); //注册自定义指令的回调函数注册的函数:
cpp
bool userdefinecmd(int id, const std::string & paramStr,const std::string & posName)
{
//id : 对应示教器接口userdefine_cmd_insert中的第一位参数
//paramStr : 对应示教器接口userdefine_cmd_insert中的第二位参数
return true;
}2,封装获取示教器端发送的自定义指令参数函数(可选,也可以自己开发解析的这部分)
封装解析接收到的的字符串的函数:
cpp
//功能函数,用于切分字符串并存入容器中
std::vector<std::string> split(const std::string& s, char delimiter)
{
std::vector<std::string> tokens;
std::string token;
std::istringstream tokenStream(s);
while (std::getline(tokenStream, token, delimiter))
{
tokens.push_back(token);
}
return tokens;
}split函数的使用示例:
cpp
std::vector<std::string> param = split(paramStr,' ');
param.erase(param.begin());
double vel = atoi(param.at(2).c_str());
double acc = atoi(param.at(3).c_str());
double dec = atoi(param.at(4).c_str());3,使用示例
将示教器发送的速度,加速度,减速度参数解析出来使用,下面是自定义指令运行三条MOVJ运动的示例:
注意:自定义指令内运动类的指令只能使用接口介绍中的运动类接口
cpp
bool userdefinecmd(int id, const std::string & paramStr,const std::string & posName)
{
//id : 对应示教器接口userdefine_cmd_insert中的第一位参数
//paramStr : 对应示教器接口userdefine_cmd_insert中的第二位参数
int robotNum = 1; //定义需要控制器的机器人编号
if (id == 1)
{
}
else if (id == 2)
{
//分隔字符串获取参数
std::vector<std::string> param = split(paramStr,' ');
param.erase(param.begin());
double vel = atoi(param.at(2).c_str());
double acc = atoi(param.at(3).c_str());
double dec = atoi(param.at(4).c_str()); //取出示教器封装的各参数
NRC_Position pos1 = {NRC_ACS, 40, 0, 0, 0, 0, 0};
NRC_Position pos2 = {NRC_ACS, 0, 0, 0, 0, 0, 0};
NRC_Position pos3 = {NRC_ACS, -40, 0, 0, 0, 0, 0}; //机器人运行的目标点位
NRC_Jobrun_MoveDirect(robotNum, pos1, vel, acc, dec, 5); //MOVJ运动指令
NRC_Jobrun_MoveDirect(robotNum, pos2, vel, acc, dec, 5);
NRC_Jobrun_MoveDirect(robotNum, pos3, vel, acc, dec, 5, true); //最后一条运动类指令需要跳行,将moveToNextLine传true!!!否则会出现机器人飞车事故!
}
else
{
printf("no this cmd");
}
return true;
}4,运行自定义指令
至此,代码部分已经完成。将示教器和控制器的二次开发程序编译好之后分别升级到示教器和控制器当中(关于如何编译的问题,参考文档中的控制器快速开始教程和示教器快速开始的教程),程序都升级完成之后,在作业文件当中插入我们刚刚写的自定义指令到作业文件当中,如图:

作业文件指令插入完成之后,切换到运行模式,启动程序。当程序运行到”移动到换枪位置 1 0 50 50 50 0“这条自定义指令的时候,就开始执行上面的例子中的userdefinecmd函数内的全部代码(三条MOVJ运动)。
5,进阶教程
当用户需要机器人运动到某一个点位的时候,进行一些对程序的控制,对机器人状态的控制,对IO的控制,或者用户自己的一些功能代码时,如果直接将这部分代码直接添加注册的自定义指令函数内,然后在示教器运行自定义指令则出现,机器人机器人一直在运动但是用户的代码在执行自定义指令刚开始时就已经跑完了,这个时候就需要用到下面的这个阻塞接口,将程序阻塞在需要的地方。
/**
* @brief 阻塞非运动指令,当当前存在机器人运动指令未执行完成时,会阻塞在此接口中,阻止程序向下执行;
* @brief 在断点恢复时,程序会从停止时程序停留的此接口处继续向下执行
*/
void NRC_JobRun_BlockNotMoveInstruction();示例一:当机器人运动到某一个点位之后需要打开IO输出
cpp
bool userdefinecmd(int id, const std::string & paramStr,const std::string & posName)
{
//id : 对应示教器接口userdefine_cmd_insert中的第一位参数
//paramStr : 对应示教器接口userdefine_cmd_insert中的第二位参数
int robotNum = 1; //定义需要控制器的机器人编号
if (id == 1)
{
}
else if (id == 2)
{
NRC_Position pos1 = {NRC_ACS, 40, 0, 0, 0, 0, 0};
NRC_Position pos2 = {NRC_ACS, 0, 0, 0, 0, 0, 0};
NRC_Position pos3 = {NRC_ACS, -40, 0, 0, 0, 0, 0}; //机器人运行的目标点位
NRC_Jobrun_MoveDirect(robotNum, pos1, 80, 50, 50, 0);
NRC_Jobrun_MoveDirect(robotNum, pos2, 80, 50, 50, 0);
NRC_JobRun_BlockNotMoveInstruction();//阻塞接口,将程序阻塞在该位置,等待上一条的MOVJ运动到目标点位后解除阻塞
NRC_DigOut(1, 1); //打开对应的IO数字输出
NRC_Jobrun_MoveDirect(robotNum, pos3, 80, 50, 50, 0, true); //最后一条运动类指令需要跳行,将moveToNextLine传true!!!否则会出现机器人飞车事故!
}
else
{
printf("no this cmd");
}
return true;
}其中nrcAPI.h头文件中的非运动类的接口大部分都是可以写在注册函数当中进行适用的。
示例二:当机器人运动到某一点位之后,需要执行用户自己写的功能函数:
当机器人运动到pos2的目标位置之后就开始执行用户自己写的功能函数,注意:用户在添加自己的功能函数的最后需要自己增加阻塞,防止功能函数还没执行完就开始执行下面的MOVJ运动!
cpp
bool userdefinecmd(int id, const std::string & paramStr,const std::string & posName)
{
//id : 对应示教器接口userdefine_cmd_insert中的第一位参数
//paramStr : 对应示教器接口userdefine_cmd_insert中的第二位参数
int robotNum = 1; //定义需要控制器的机器人编号
if (id == 1)
{
}
else if (id == 2)
{
NRC_Position pos1 = {NRC_ACS, 40, 0, 0, 0, 0, 0};
NRC_Position pos2 = {NRC_ACS, 0, 0, 0, 0, 0, 0};
NRC_Position pos3 = {NRC_ACS, -40, 0, 0, 0, 0, 0}; //机器人运行的目标点位
NRC_Jobrun_MoveDirect(robotNum, pos1, 80, 50, 50, 0);
NRC_Jobrun_MoveDirect(robotNum, pos2, 80, 50, 50, 0);
NRC_JobRun_BlockNotMoveInstruction();//阻塞接口,将程序阻塞在该位置,等待上一条的MOVJ运动到目标点位后解除阻塞
/**
* ........................
* 用户自己写的功能函数
* ........................
*/
NRC_Jobrun_MoveDirect(robotNum, pos3, 80, 50, 50, 0, true); //最后一条运动类指令需要跳行,将moveToNextLine传true!!!否则会出现机器人飞车事故!
}
else
{
printf("no this cmd");
}
return true;
}