机器人配置
在新版本的 nrcAPI.h 中,执行系统启动 NRC_StartController()时系统将自动设置机器人类型、机器人伺服类型、IO 板型号,即使是新的控制系统也无需再编写设置程序,删除了早期版本的 NRC_SetEthercatIOConfig()、NRC_SetServoTypeConfig()函数,但是保留了 NRC_SetRobotTypeConfig()、NRC_SetIOTypeConfig() 函数。同时,增加了伺服映射关系设置 NRC_SetServoMapRelation(),需要注意的是在 inexbot 控制器上运行程序模拟机器人动作时,需要设置伺服为虚拟伺服,虚拟伺服对应参数应设置为 0。
设置机器人类型
设置机器人类型是机器人能正常运行的前提。了解机器人本体类型后,此接口支持四种机器人类型。通过调用函数 NRC_SetRobotTypeConfig(std::string type)来设置机器人类型。机器人参数设置好后,需重启示教器才能够生效。
参数 type 表示机器人类型:
- "R_GENERAL_6S" 六轴
- "R_SCARA" 四轴 SCARA
- "R_FOURAXIS_PALLET" 四轴码垛
- "R_FOURAXIS" 四轴
- "R_GENERAL_1S" 一轴
- "R_GENERAL_5S" 五轴
- "R_GENERAL_6S_1" 六轴异形一
- "R_SCARA_TWOAXIS" 两轴 SCARA
- "R_SCARA_THREEAXIS" 三轴 SCARA
- "R_THREE_CARTESIAN_COORDINATE" 三轴直角
- "R_THREE_CARTESIAN_COORDINATE_1" 三轴异形一
- "R_GENERAL_7S_RBT" 七轴
- "R_SCARA_1" 四轴 SCARA 异形一
IO 配置
(1)通过调用函数int NRC_SetIOTypeConfig(std::string type)
设置扩展 IO 口类型,此接口支持 2 种 IO 类型参数设置。如果是 EtherCat 扩展 IO,则设置为"none",控制器会自动识别,如果连接非 EtherCat 扩展 IO,设置为"custom"将不会生效,参数设置好后,需重启才能生效。需要根据实际的工作要求设置,下面的 demo 程序使用的是 ethercat 扩展 IO。
参数 type 表示扩展 IO 类型:
- "none" 无扩展 IO 或自动识别扩展 IO
- "custom" 自定义扩展 IO
(2)当选择 IO 扩展类型为"custom"时,就需要自定义 IO 的数目和地址,其中包括自定义 IO dout 和 IO din。
通过调用函数NRC_SetCustomIODoutConfig(int sum, int* addr
)来设置自定义 IO dout 的数目和对应地址,1 表示高电平,0 表示低电平。参数 sum 是自定义 IO dout 的数目,参数范围:sum >= 0。参数 addr 表示自定义 IO dout 的对应地址。
通过调用函数NRC_SetCustomIODinConfig(int sum, int* addr)
设置自定义 IO din 配置的数目和对应地址,1 表示高电平,0 表示低电平。参数 sum 是 自定义 IO din 的数目,参数范围:sum >= 0。参数 addr 表示 自定义 IO din 的对应地址。
下面是一个自定义 IO 的例子
..........
NRC_SetIOTypeConfig("custom");//为自定义扩展IO类型
int inexbotIn[32] = {0};//定义一个数组
int inexbotOut[32] = {0};//定义一个数组
NRC_SetCustomIODoutConfig(32, inexbotIn);//设置自定义IO dout 配置
NRC_SetCustomIODinConfig(32, inexbotOut);//设置自定义IO din配置
..........
IO 口调用
通过调用函数NRC_DigOut(int port, int value)
使数字端口信息输出,其中 port 是要输出的数字 IO 端口,最大范围为 1 <= port <= 16,实际范围取决于所连接点 IO 模块上的 IO 端口数目, value 是 要输出的状态,value=0 输出低电平,value=1 输出高电平。
同时调用函数NRC_ReadDigOut(int port)
读取数字 IO 输出端口的状态, port 是要读取的数字 IO 端口,最大范围为 1 <= port <= 16,实际范围取决于所连接点 IO 模块上的 IO 端口数目,返回值表示当前端口的状态,retval = 0 表示当前处于低电平,retval = 1 表示当前处于高电平,retval =-1 该端口不存在。
调用函数NRC_ReadDigIn(int port)
读取数字 IO 输入端口的状态,port 是要读取的数字 IO 端口,最大范围为 1 <= port <= 16,实际范围取决于所连接点 IO 模块上的 IO 端口数目,同样返回值表示当前端口的状态,retval = 0 表示当前处于低电平,retval = 1 表示当前处于高电平,retval =-1 该端口不存在。
获取机器人配置
在新版本库中系统启动时会自动配置机器人,我们可以调用相关函数获取这些配置信息。
- 获取机器人轴数:int NRC_GetRobotAxisSum();
- 获取外部轴数:int NRC_GetSyncAxisSum();
- 获取 IO 扩展版总数及类型:int NRC_GetEthercatIOConfig(int& sum, std::string& type1, std::string& type2);其中参数 sum 用于返回扩展板总数,type1、type2 用于返回扩展板类型。
机器人配置和 IO 口调用 C++ demo 程序
#include <iostream>
#include "nrcAPI.h"
using namespace std;
void robotsetting()
{
NRC_SetRobotTypeConfig("R_GENERAL_6S");//六轴
NRC_SetIOTypeConfig("ethercat");
}
void flicker(int j)
{
for (int i=j; i>0; i--)
{
NRC_DigOut(2, 1); //IO端口2输出高电平
NRC_Delayms(1000); //延时1000ms
NRC_DigOut(2, 0); //IO端口2输出低电平
NRC_Delayms(1000); //延时1000ms
}
}
void RobotMsg()
{
int ioNum;
std::string type1,type2;
cout<<"机器人轴数:"<<NRC_GetRobotAxisSum()<<endl;
NRC_GetEthercatIOConfig(ioNum, type1, type2);
cout<<"扩展板数:"<<ioNum<<endl;
if(ioNum>0)
{
cout<<"扩展板类型:"<<type1<<" ,"<<type2<<endl;
}
}int main()
{
SystemStartup();//系统启动,详见3.3节
robotsetting();//设置机器人配置,为程序简洁使用函数调用形式实现
RobotMsg(); //获取机器人配置,为程序简洁使用函数调用形式实现IO调用
int inexbot6=NRC_ReadDigOut(1);//读取数字IO输出端口1的状态
if( inexbot6 == -1 )
{
cout << "端口不存在" << endl;
}
else
{
NRC_DigOut(1, inexbot6); //IO端口1输出状态
NRC_Delayms(1000); //延时1000ms
}
flicker (15);//IO端口2闪烁15次
int inexbot8=NRC_ReadDigIn(1);//读取数字IO输入端口1的状态
if( inexbot8== -1 )
{ cout << "端口不存在" << endl ;}
else if(inexbot8==1)
{cout << "当前处于高电平" << endl;}
else
{cout << "当前处于低电平" << endl;}
}
在调用 inexbotAPI 使机器人动作时,需要根据根据实际所要运行的机器人的伺服和 IO 等设置调用相应 API 进行参数设置,设置之后需要重启控制器参数设置才能生效,生成相应配置文件。