跳到主要内容

作业文件编辑相关

作业文件中插入运动控制类指令

在作业文件写入指令前和写入指令后的相关操作,如作业文件的打开,暂停,停止等,参见 3.13 节。

插入 MOVJ

调用该函数前,请先调用NRC_CreateJobfile(std::string jobname) NRC_OpenJobfile(std::string jobname)创建或打开一个作业文件。

调用函数NRC_JobfileInsertMOVJ(int line, int vel, int acc, int dec, const NRC_Position& target, int pl=0)实现在作业文件插入 MOVJ 指令,即点到点。

  • 参数 line 表示将指令插入到第 line 行,参数范围:0 < line <= (NRC_GetJobfileLineSum()+1).
  • 参数 target 表示机器人运动目标位置,详见 NRC_Position。
  • 参数 vel 是机器人的运行速度,为机器人最大速度的百分比,参数范围:0 < vel <= 100。
  • 参数 acc 表示机器人运行加速度,为机器人各关节最大加速度的百分比,参数范围:0 < vel <= 100 target 机器人运动目标位置,详见 NRC_Position。
  • 参数 dec 表示机器人运行减速度,为机器人各关节最大减速度的百分比,参数范围:0 < vel <= 100。
  • 参数 pl 表示平滑度,将和后面一条移动指令进行平滑过渡,数值越大,越平滑,轨迹偏差也越大,参数范围:0 <= pl <= 5。

插入 MOVL

调用该函数前,请先调用NRC_CreateJobfile(std::string jobname) NRC_OpenJobfile(std::string jobname)创建或打开一个作业文件。

调用函数NRC_JobfileInsertMOVL(int line, int vel, int acc, int dec, const NRC_Position& target, int pl=0)实现在作业文件插入 MOVL 指令,即直线。

  • 参数 vel 表示机器人的运行速度,为机器人末端位置点绝对运行速度,单位为 毫米每秒(mm/s),参数范围:vel > 1。
  • 参数 acc 表示 机器人运行加速度,为机器人各关节最大加速度的百分比,参数范围:0 < vel <= 100。
  • 参数 target 机器人运动目标位置,详见 NRC_Position。
  • 参数 dec 表示机器人运行减速度,为机器人各关节最大减速度的百分比,参数范围:0 < vel <= 100。
  • 参数 target 表示机器人运动目标位置,详见 NRC_Position。
  • 参数 pl 表示平滑度,将和后面一条移动指令进行平滑过渡,数值越大,越平滑,轨迹偏差也越大,参数范围:0 <= pl <= 5。

插入 MOVC

调用该函数前,请先调用NRC_CreateJobfile(std::string jobname) NRC_OpenJobfile(std::string jobname)创建或打开一个作业文件。

调用函数NRC_JobfileInsertMOVC(int line, int vel, int acc, int dec, const NRC_Position& target, int pl=0)实现作业文件插入 MOVC 指令,即圆弧。 需要注意的是 MOVC 指令需要两条才可执行。

  • 参数 vel 表示机器人的运行速度,为机器人末端位置点绝对运行速度,单位为 毫米每秒(mm/s),参数范围:vel > 1。
  • 参数 acc 表示机器人运行加速度,为机器人各关节最大加速度的百分比,参数范围:0 < vel <= 100。
  • 参数 target 机器人运动目标位置,详见 NRC_Position。
  • 参数 dec 表示机器人运行减速度,为机器人各关节最大减速度的百分比,参数范围:0 < vel <= 100。 e.参数 pl 表示平滑度,将和后面一条移动指令进行平滑过渡,数值越大,越平滑,轨迹偏差也越大,参数范围:0 <= pl <= 5。
    作业文件插入 MOVC 指令:
//以100mm/s的速度以圆弧插补方式经过pos1点到达pos2点,
NRC_JobfileInsertMOVC(1,100,5050, pos1, 0);
NRC_JobfileInsertMOVC(2,100,5050, pos2, 0);//插入一条MOVC。

插入 IMOV

调用该函数前,请先调用NRC_CreateJobfile(std::string jobname) NRC_OpenJobfile(std::string jobname)创建或打开一个作业文件。

IMOV 指令是以关节或直线的插补方式从当前位置按照设定的增量距离移动。 调用函数NRC_JobfileInsertIMOV(int line, int vel,int acc, int dec, const NRC_Position& deviation, int pl=0)实现作业文件插入 IMOV 指令。 deviation.coord 为 NRC_ACS 时,该指令将使用关节插补方式,deviation.coord 为其他值时,使用直线插补方式。

  • 参数 line 是 将指令插入到第 line 行,参数范围:0 < line < (NRC_GetJobfileLineSum()+1)。
  • 参数 vel 是 机器人的运行速度,deviation.coord 为 NRC_ACS 时,为机器人最大速度的百分比,参数范围:0 < vel <= 100,deviation.coord 不为 NRC_ACS 时,为机器人末端位置点绝对运行速度,单位为 毫米每秒(mm/s),参数范围:vel > 1。
  • 参数 acc 表示机器人运行加速度,为机器人各关节最大加速度的百分比,参数范围:0 < vel <= 100 target 机器人运动目标位置,详见 NRC_Position。
  • 参数 dec 表示机器人运行减速度,为机器人各关节最大减速度的百分比,参数范围:0 < vel <= 100。
  • deviation 机器人运动偏移量,详见 NRC_Position。
  • 参数 pl 表示平滑度,将和后面一条移动指令进行平滑过渡,数值越大,越平滑,轨迹偏差也越大,参数范围:0 <= pl <= 5。

作业文件中插入输入输出类指令

调用该函数前,请先调用NRC_CreateJobfile(std::string jobname) NRC_OpenJobfile(std::string jobname)创建或打开一个作业文件。

使某个数字输出端口输出高或者低电平,可以调用函数NRC_JobfileInsertDOUT(int line, int port, int value)使作业文件插入 DOUT 指令实现。

  • 参数 line 是将指令插入到第 line 行,参数范围:0 < line < (NRC_GetJobfileLineSum()+1)。
  • 参数 port 表示要输出的数字输出端口号,参数范围:port > 0,value 端口输出的状态,返回值 0 表示低电平,返回值 1 表示高电平。
  • value 端口输出的状态,value=0:输出低电平,value=1:输出高电平

作业文件中插入定时类指令

调用该函数前,请先调用NRC_CreateJobfile(std::string jobname) NRC_OpenJobfile(std::string jobname)创建或打开一个作业文件。

调用函数NRC_JobfileInsertTIMER(int line, double timeSec)实现作业文件插入 TIMER 指令。参数 line 是将指令插入到第 line 行,参数范围:0 < line < (NRC_GetJobfileLineSum()+1)。参数 timeSec 表示要延时的时间,单位为秒,参数范围:timeSec > 0。

作业文件中插入条件控制类

插入 WAIT

调用该函数前,请先调用NRC_CreateJobfile(std::string jobname) NRC_OpenJobfile(std::string jobname)创建或打开一个作业文件。

调用函数 NRC_JobfileInsertWAIT(int line, int port, int value, double timeoutSec, bool now=false)表示作业文件插入 WAIT 指令,参数 line 是将指令插入到第 line 行,参数范围:0 < line < (NRC_GetJobfileLineSum()+1)。port 表示 要检测的数字输入端口号,参数范围:port > 0,参数 value 表示要等待的输入状态,返回值 0 表示低电平,返回值 1 表示高电平。参数 timeoutSec 表示超时时间,单位为秒,参数范围:timeSec >= 0,如果等待 timeoutSec 时间仍未满足要求,将不再继续等待,本条指令执行结束,如果值为 0 时,将无限时间等待,直到条件成立。

插入 UNTIL,ENDUNTIL

调用这两个函数前,请先调用NRC_CreateJobfile(std::string jobname) NRC_OpenJobfile(std::string jobname)创建或打开一个作业文件。

调用函数NRC_JobfileInsertUNTIL(int line, int port, int value)作业文件插入 UNTIL 指令,参数 line 表示将指令插入到第 line 行,参数范围:0 < line < (NRC_GetJobfileLineSum()+1),参数 port 表示要检测的数字输入端口号,参数范围:port > 0 参数,value 表示要等待的输入状态,返回值 0 表示低电平,返回值 1 表示高电平。该函数需要和 NRC_JobfileInsertENDUNTIL(int line);配合使用。 调用函数NRC_JobfileInsertENDUNTIL(int line)实现在作业文件插入 ENDUNTIL 指令。参数 line 是将指令插入到第 line 行,参数范围:0 < line < (NRC_GetJobfileLineSum()+1)。该函数需要和 NRC_JobfileInsertUNTIL(int line, int port, int value); 配合使用。

作业文件插入 UNTIL 指令示例:

需要调用函数依次是:

//在UNTIL和ENDUNTIL之间运行时,UNTIL的条件成立,将立刻中断当前运行指令,并跳转到ENDUNTIL执行,
NRC_JobfileInsertUNTIL(1, 5, 1);
NRC_JobfileInsertMOVJ(2, 100,50,50, pos1, 0);
NRC_JobfileInsertMOVL(3, 100,50,50, pos2, 0);
NRC_JobfileInsertDOUT(4, 1, 0);
NRC_JobfileInsertTIMER(5, 0.5);
NRC_JobfileInsertENDUNTIL(6);

需要注意的是当程序在 UNTIL 和 ENDUNTIL 之间运行时,当 UNTIL 的条件不成立时,顺序执行,当条件成立,立即中断当前运行指令,执行 ENDUNTIL 后面的指令。

插入 IF,ELSE, ENDIF

调用此三个函数前,请先调用NRC_CreateJobfile(std::string jobname) NRC_OpenJobfile(std::string jobname)创建或打开一个作业文件。

调用函数NRC_JobfileInsertIF(int line, int port, int value)实现作业文件插入 IF 指令。 参数 line 表示将指令插入到第 line 行,参数范围:0 < line < (NRC_GetJobfileLineSum()+1), port 表示要检测的数字输入端口号,参数范围:port > 0,参数 value 表示要等待的输入状态,返回值 0 表示低电平,返回值 1 表示高电平。该函数需要和 NRC_JobfileInsertENDIF(int line)配合使用。

调用函数NRC_JobfileInsertELSE(int line)实现作业文件插入 ELSE 指令。调用该函数前,参数 line 是 将指令插入到第 line 行,参数范围:0 < line < (NRC_GetJobfileLineSum()+1),函数需要和 NRC_JobfileInsertIF(int line, int port, int value);NRC_JobfileInsertENDIF(int line) 配合使用。

调用函数NRC_JobfileInsertENDIF(int line)实现作业文件插入 ENDIF 指令,调用该函数前,参数 line 是 将指令插入到第 line 行,参数范围:0 < line < (NRC_GetJobfileLineSum()+1)。函数需要和 NRC_JobfileInsertIF(int line, int port, int value)配合使用。 作业文件中插入 IF 指令示例

函数调用依次是:

//如果IF条件成立,执行IF代码块,否则执行ELSE代码块;如果没有ELSE指令,IF条件不成立,则会跳过IF代码块,直接执行ENDIF指令后面的指令
NRC_JobfileInsertIF(1,5,1);
NRC_JobfileInsertMOVJ(2,100,50,50,pos1,0);
NRC_JobfileInsertDOUT(3,1,0);
NRC_JobfileInsertELSE(4);
NRC_JobfileInsertMOVL(5,100,50,50,pos2,0);
NRC_JobfileInsertTIMER(6,0.5);
NRC_JobfileInsertENDIF(7);

作业文件编辑相关的 demo 程序(码垛相关的指令在 3.19 章)

#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 };

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]);//将当前直角坐标位置输出,

//作业文件相关指令实现
if (NRC_JudgeJobIsExist("INEXBOT1") == 0)
{
cout << "作业文件不存在" << endl;
NRC_CreateJobfile("INEXBOT1");//创建作业文件INEXBOT1
NRC_OpenJobfile("INEXBOT1");
}
else
NRC_OpenJobfile("INEXBOT1");//打开作业文件INEXBOT1
NRC_JobfileInsertMOVJ(1, 50, 50, 50, inexbot1, 4); //点到点运动到inexbot1
NRC_JobfileInsertMOVL(2, 500, 50, 50, inexbot2, 1);//直线运动到inexbot2
NRC_JobfileInsertMOVC(3, 300, 50, 50, inexbot3, 5);
NRC_JobfileInsertMOVC(4, 300, 50, 50, inexbot4, 5);//经过点inexbot3圆弧运动到inexbot4
NRC_JobfileInsertDOUT(5, 3, 1);//数字输出端口3输出高电平
NRC_JobfileInsertWAIT(6, 3, 1, 3.3);//等待数字输入端口3输入高电平,若3.3秒后仍然未满足条件,本指令结束
NRC_JobfileInsertTIMER(7, 5.5);//等待5.5秒
cout << "file line sum is " << NRC_GetJobfileLineSum() << endl;
NRC_ServoEnable(); //伺服上电
NRC_StartRunJobfile("INEXBOT1");//开始运行作业文件
//NRC_StepRunJobfile("INEXBOT1", 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,\n", inexbot7.pos[0], inexbot7.pos[1], inexbot7.pos[2], inexbot7.pos[3], inexbot7.pos[4], inexbot7.pos[5]);//将当前直角坐标位置输出

if (NRC_JudgeJobIsExist("INEXBOT2") == 0)
{
cout << "作业文件不存在" << endl;
NRC_CreateJobfile("INEXBOT2");//创建作业文件INEXBOT2
NRC_OpenJobfile("INEXBOT2");
}
else
NRC_OpenJobfile("INEXBOT2");//打开作业文件INEXBOT2
//在UNTIL和ENDUNTIL之间运行时,UNTIL的条件成立,将立刻中断当前运行指令,并跳转到ENDUNTIL执行
NRC_JobfileInsertUNTIL(1, 5, 1);
NRC_JobfileInsertMOVJ(2, 100, 50, 50, inexbot1, 0); //点到点运动到inexbot1
NRC_JobfileInsertMOVL(3, 100, 50, 50, inexbot2, 0);//直线运动到inexbot2
NRC_JobfileInsertDOUT(4, 1, 0);
NRC_JobfileInsertTIMER(5, 0.5);
NRC_JobfileInsertENDUNTIL(6);
NRC_ServoEnable(); //伺服上电
NRC_StartRunJobfile("INEXBOT2");//开始运行作业文件
//NRC_StepRunJobfile("INEXBOT1", 3);
while (NRC_GetProgramRunStatus() != 0) //等待运行结束
{
NRC_Delayms(500); //延时100ms
printf("line=%d,time=%d\n", NRC_GetJobfileCurrentRunLine(), NRC_GetCycleTimeSec());
}
NRC_ServoDisable(); //伺服下电
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]);//将当前直角坐标位置输出

if (NRC_JudgeJobIsExist("INEXBOT3") == 0)
{
cout << "作业文件不存在" << endl;
NRC_CreateJobfile("INEXBOT3");//创建作业文件INEXBOT3
NRC_OpenJobfile("INEXBOT3");
}
else
NRC_OpenJobfile("INEXBOT3");//打开作业文件INEXBOT3
//如果IF条件成立,执行IF代码块,否则执行ELSE代码块;如果没有ELSE指令,IF条件不成立,则会跳过IF代码块,直接执行ENDIF指令后面的指令
NRC_JobfileInsertIF(1, 5, 1);
NRC_JobfileInsertMOVJ(2, 100, 50, 50, inexbot1, 0);//点到点运动到inexbot1
NRC_JobfileInsertDOUT(3, 1, 0);
NRC_JobfileInsertELSE(4);
NRC_JobfileInsertMOVJ(5, 100, 50, 50, inexbot2, 0);//点到点运动到inexbot2
NRC_JobfileInsertTIMER(6, 0.5);
NRC_JobfileInsertENDIF(7);
NRC_JobfileInsertIMOV(7, 50, 50, 50, dev1, 3);
NRC_JobfileInsertIMOV(8, 500, 50, 50, dev2, 0);
NRC_ServoEnable(); //伺服上电
NRC_StartRunJobfile("INEXBOT3");//开始运行作业文件
//NRC_StepRunJobfile("INEXBOT1", 3);
while (NRC_GetProgramRunStatus() != 0) //等待运行结束
{
NRC_Delayms(500); //延时100ms
printf("line=%d,time=%d\n", NRC_GetJobfileCurrentRunLine(), NRC_GetCycleTimeSec());
}
NRC_ServoDisable(); //伺服下电
NRC_Position inexbot10;//定义机器人位置结构体对象inexbot10
NRC_GetCurrentPos(NRC_MCS, inexbot10);//将当前机器人的直角坐标系赋值给inexbot10
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]);//将当前直角坐标位置输出
while(1)//保持程序继续运行
{
NRC_Delayms(1000);
}


}