Skip to content

主站库

介绍

纳博特Ethercat主站控制器主站抖动时间小于20us。可广泛应用于工业自动化控制系统的开发,特别适用于机器人、伺服电机控制等实时性要求高的场景。

版本信息

二次开发版本公司
1.0.0INEXBOT

版本迭代

版本修改日期修改人描述
1.0.020250310EA初始版本

概述

关于文档

本文旨在帮助用户使用纳博特Ethercat的主站控制的C++库libNexIghEcm。

关于libNexIghEcm库

该库可自动生成eni文件,用户只需获取pdo操作地址,注册周期任务即可,极大降低用户使用Ethercat主站难度。

开发环境要求

操作系统Ubuntu 20.04 LTS
系统架构x86_64
编译器GCC version 9.4.0/GLIBC 2.31-0ubuntu9.2
GCC version 4.8.2/EGLIBC 2.19-0ubuntu6.15
依赖库Libpthread、librt、libdl、libm

| --- | --- |

函数库API说明

使用概述

1. 将 libNexIghEcm.a 静态库文件复制到项目的 lib 目录

2.将 EcMasterApi.h 头文件复制到项目的 include 目录

3.在编译时链接 libNexIghEcm.a 库

NexIghLib API 函数列表

函数名称函数功能
startEcMaster开始启动主站
enableRealtimeEnvironment使能实时环境
ECM_LogMsg主站提供的消息级log打印
ECM_LogError主站提供的错误级log打印
ecatGetConnectedSlavesNum连接到主站的从站数目
ecatGetConfiguredSlavesNum主站配置的从站数目
ecatGetSlaveState获取从站的状态
ecatSetSDO设置SDO
ecatGetSDO获取SDO
setEcatLicenseKey设置主站密钥(空函数,无作用)
isEcatLicenseCorrect获取主站密钥是否正确
setLogDirName设置主站log输出的目录
setEcatLogSwitch设置主站log是否开启
getCycleTime获取主站实时性状态
getEcLibVersion获取主站库版本
getEniFileName获取eni文件名
getPDOAddrVec获取从站pdo数据列表
getSlaveIDVec获取从站ID、code列表
registerCustomeContrastID注册主站是否完成的回调函数
registerCustomeAppWorkpd注册比较主站找到的从站ID和预设从站ID是否相同的回调函数
registerCustomeEcMasterStartFinish注册主站每周期调用的回调函数
registerCustomeAppLog注册将主站log打印到nex日志中的回调函数

错误码定义

错误码含义
0无错误
1总线忙状态
2总线正在被使用
3总线错误
4设备访问超时
5IO 设备无法访问
6参数不合法
7文件加载错误
8动态库加载错误
9EtherCAT 主机请求错误
10获取从站数量时出错
11EtherCAT 主机获取从站失败
12XML 文件打开失败
13XML 信息解析失败
14从站配置数据初始化失败
15创建 EtherCAT 域失败
16配置从站时出错
17配置从站的 PDO 时出错
18配置从站的 PDO 时出错
19选择 EtherCAT 主机参考时钟时出错
20配置从站 Sync0 信号时出错
21主机激活失败
22域数据错误
23域大小错误
24获取 EtherCAT PDO 时出错

基础数据类型

typedef unsigned char EC_T_BYTE;
typedef unsigned short EC_T_WORD;
typedef unsigned int EC_T_DWORD;
typedef signed char EC_T_SBYTE;
typedef signed short EC_T_SWORD;
typedef signed int EC_T_SDWORD;
typedef double EC_T_REAL;

pdo数据结构

功能描述

PDOAddrData结构体是PDO地址的结构体,一个结构体表示一个PDO地址对象。

结构体原型
typedef struct {
    EC_T_WORD index;
    EC_T_WORD subIndex;
    EC_T_BYTE* addrMap;
} PDOAddrData;
成员变量说明
变量名描述
IndexPDO索引
subIndexPDO子索引
addrMapPDO对象地址指针

NexIghLib API使用流程

NexIghLib API 使用流程图

使用示例

Demo.cpp

int CALLBACK()
{
    static int iState = -5000;
    if (iState < 3001)
    {
        ctrlwdSend(iState);
        iState++;
    }
    else
    {
        for (int i = 0; i < slave_num; i++)
        {
            if (target_position[i] != nullptr)
            {
                iPos[i] += 300;
                *target_position[i] = iPos[i];
            }
        }
    }
    return 0;
}




void myprintf(unsigned char c1, const char *s1, const char *s2, const char *s3, const long n, const char *format, ...)
{
    char dest[1024 * 16 * 16];
    va_list argptr;
    va_start(argptr, format);
    vsprintf(dest, format, argptr);
    va_end(argptr);
    printf(dest);
}


int main()
{
//初始化参数
    int nArgc = 1;
    char *argv[8];
    int CycleTime = 1000;
    argv[0]=(char *)(&CycleTime);
 
//使能实时环境
    enableRealtimeEnvironment();
//注册日志回调
    EC_PF_EC_START_CustomeLog_CALLBACK p2 = myprintf;
    registerCustomeAppLog(p2);
//启动主站
    startEcMaster(nArgc,argv);
//获取从站数量
    slave_num = ecatGetConnectedSlavesNum();
    printf("getSlaveIDVec\n");
//获取从站id数组
    std::vector<std::pair<unsigned int, unsigned int> > vectorID;
    getSlaveIDVec(vectorID);
 
//获取PDO地址映射
    printf("getPDOAddrVec\n");
    PDOAddrVec outPDOAddrVec, inPDOAddrVec;
    getPDOAddrVec(outPDOAddrVec, inPDOAddrVec);
//访问输出PDO
    for (unsigned int i = 0; i < outPDOAddrVec.size(); i++) {
        for (unsigned int j = 0; j < outPDOAddrVec[i].size(); j++) {
            if ((outPDOAddrVec[i][j].index == 0x6040)
                    && (outPDOAddrVec[i][j].subIndex == 0x00)) {
                control_word[i] = (EC_T_WORD*) (outPDOAddrVec[i][j].addrMap);
                printf("get slave %d control_word addr = %x\n", i, control_word[i]);
            }
        }
    }
//访问输入PDO
    for (unsigned int i = 0; i < inPDOAddrVec.size(); i++) {
        for (unsigned int j = 0; j < inPDOAddrVec[i].size(); j++) {
            if ((inPDOAddrVec[i][j].index == 0x6041)
                    && (inPDOAddrVec[i][j].subIndex == 0x00)) {
                status_word[i] = (EC_T_WORD*) (inPDOAddrVec[i][j].addrMap);
                printf("get slave %d status_word addr = %x\n", i, status_word[i]);
            }
        }
    }
//注册自定义
    printf("registerCustomeAppWorkpd\n");
    EC_PF_EC_START_AppWorkpd_CALLBACK p = CALLBACK;
    registerCustomeAppWorkpd(p);
    while(1)
    {
      //自定义事件循环
    }
    return 0;
}

MakeFile

#说明编译器
CXX ?= g++
 
CFLAGS = -std=c++11
#添加libNexIghEcm.a的依赖
LDFLAGS = -lm -ldl -lpthread -lrt
 
INCLUDE = -I.
#链接 ../目录下的libNexIghEcm.a
LIB = -L.. -lNexIghEcm 
 
OBJ += $(patsubst %.cpp, %.o, $(wildcard *.cpp))
 
target = test
 
all:$(OBJ)
    $(CXX) *.o -o $(target) $(LIB) $(LDFLAGS)
%.o:%.cpp
    $(CXX) $(CFLAGS) -c $< -o $@ $(INCLUDE)
clean:
    rm -rf *.o $(target)

NexIghLib Api详解

startEcMaster

函数原型int startEcMaster();
功能描述启动EtherCAT主站。
参数说明
返回值返回 int 类型的值,0表示成功,非0表示失败。
备注说明

enableRealtimeEnvironment

函数原型int enableRealtimeEnvironment();
功能描述启用实时环境。
参数说明
返回值返回 int 类型的值,0表示成功,非0表示失败。
备注说明此函数用于启用实时环境,以便主站能够在实时系统中运行。

ECM_LogMsg

函数原型void ECM_LogMsg(const char* msg);
功能描述记录日志消息。
参数说明输入参数:
msg:要记录的日志消息,类型为 const char*。
返回值
备注说明该函数用于记录常规的日志消息。可以在系统中用于调试和运行时跟踪。

ECM_LogError

函数原型void ECM_LogError(const char* errorMsg);
功能描述记录错误日志。
参数说明输入参数:
errorMsg:要记录的错误消息,类型为 const char*。
返回值
备注说明该函数用于记录错误日志。适用于记录程序运行时出现的错误信息。

ecatGetConnectedSlavesNum

函数原型int ecatGetConnectedSlavesNum();
功能描述获取与主站连接的从站数量。
参数说明
返回值返回 int 类型的值,表示已连接的从站数量。
备注说明该函数用于获取与主站成功连接的从站的数量。

ecatGetConfiguredSlavesNum

函数原型int ecatGetConfiguredSlavesNum();
功能描述获取配置的从站数量。
参数说明
返回值返回 int 类型的值,表示配置的从站数量。
备注说明

ecatGetSlaveState

函数原型EC_T_WORD ecatGetSlaveState(EC_T_DWORD ecSlaveNum);
功能描述获取指定从站的状态。
参数说明输入参数:
ecSlaveNum:从站编号,从0开始。
返回值从站的状态,类型为 EC_T_WORD。
备注说明该函数用于获取指定从站的状态信息。

ecatSetSDO

函数原型int ecatSetSDO(EC_T_DWORD slaveNum, EC_T_WORD index, EC_T_DWORD subindex, EC_T_BYTE* value, EC_T_DWORD size);
功能描述设置从站的SDO值。
参数说明输入参数:
slaveNum:从站编号。
index:SDO的索引。
subindex:SDO的子索引。
value:要设置的SDO数据值。
size:数据值的大小。
返回值返回 int 类型的值,0表示成功,非0表示失败。
备注说明

ecatGetSDO

函数原型int ecatGetSDO(EC_T_DWORD slaveNum, EC_T_WORD index, EC_T_DWORD subindex, EC_T_BYTE* value, EC_T_DWORD size, int num = 0);
功能描述获取从站的SDO值。
参数说明输入参数:
slaveNum:从站编号。
index:SDO的索引。
subindex:SDO的子索引。
value:用于存储SDO值的缓冲区。
size:缓冲区的大小。
num:可选参数,默认为0,表示要获取的SDO数据的数量。
输出参数:
value:接收到的SDO数据值。
返回值返回 int 类型的值,0表示成功,非0表示失败。
------
备注说明该函数用于获取从站的SDO值。

setEcatLicenseKey

函数原型void setEcatLicenseKey(const char* licenseKey);
功能描述设置EtherCAT许可证密钥。
参数说明输入参数:
licenseKey:EtherCAT许可证密钥,类型为 const char*
返回值
备注说明无作用空函数

isEcatLicenseCorrect

函数原型bool isEcatLicenseCorrect();
功能描述检查EtherCAT许可证是否有效。
参数说明
返回值
备注说明无作用空函数

setLogDirName

函数原型void setLogDirName(const char* dir);
功能描述设置日志输出目录。
参数说明输入参数:
dir:日志目录路径,类型为 const char*。
返回值
备注说明该函数用于设置日志文件的输出目录。

setEcatLogSwitch

函数原型void setEcatLogSwitch(bool enable);
功能描述设置EtherCAT日志开关。
参数说明输入参数:
enable:布尔值,true 表示启用日志记录,false 表示禁用日志记录。
返回值
备注说明该函数用于启用或禁用EtherCAT的日志记录功能。

getCycleTime

函数原型CycleTime getCycleTime();
功能描述获取主站的实时性周期时间。
参数说明
返回值CycleTime 类型,表示周期时间。
备注说明此函数用于获取主站的实时性周期时间。

getEcLibVersion

函数原型const char* getEcLibVersion();
功能描述获取EtherCAT库的版本号。
参数说明
返回值const char*,表示EtherCAT库的版本号。
备注说明

getEniFileName

函数原型const char* getEniFileName();
功能描述获取配置的ENI文件名。
参数说明
返回值const char*,表示配置的ENI文件名。
备注说明该函数用于获取当前配置的ENI文件名。

getPDOAddrVec

函数原型const std::vector<EC_T_DWORD>& getPDOAddrVec();
功能描述获取PDO地址向量。
参数说明
返回值返回 PDO 地址向量的引用,表示与主站通信的PDO地址。
备注说明该函数用于获取主站和从站之间的PDO地址信息。

getSlaveIDVec

函数原型const std::vector<EC_T_DWORD>& getSlaveIDVec();
功能描述获取从站的ID向量。
参数说明
返回值std::vector<EC_T_DWORD> 类型,表示从站的ID向量。
备注说明该函数用于获取当前网络中所有从站的ID。

registerCustomeContrastID

函数原型void registerCustomeContrastID(void (*callback)(EC_T_DWORD slaveNum, bool isMatched));
功能描述注册自定义对比ID的回调函数。
参数说明输入参数:
callback:回调函数,接受两个参数:
slaveNum:从站编号。
isMatched:布尔值,表示从站ID是否与预设ID匹配。
返回值
备注说明该函数用于注册一个回调函数,该函数将在主站检查从站ID与预设ID是否匹配时调用。

registerCustomeAppWorkpd

函数原型void registerCustomeAppWorkpd(void (*callback)(EC_T_DWORD slaveNum, bool isMatched));
功能描述注册自定义工作周期回调函数。
参数说明输入参数:
callback:回调函数,接受两个参数:
slaveNum:从站编号。
isMatched:布尔值,表示从站ID是否与预设ID匹配。
返回值
备注说明该函数用于注册工作周期的回调函数。

registerCustomeEcMasterStartFinish

函数原型void registerCustomeEcMasterStartFinish(void (*callback)(bool success));
功能描述注册自定义EtherCAT主站启动完成回调函数。
参数说明输入参数:
callback:回调函数,接受一个布尔值 success,表示启动是否成功。
返回值
备注说明该函数用于注册工作周期的回调函数。

registerCustomeAppLog

函数原型void registerCustomeAppLog(void (callback)(const char logMessage));
功能描述注册应用日志回调函数。
参数说明输入参数:
callback:回调函数,接受一个字符串 logMessage,表示日志信息。
返回值
备注说明该函数用于注册自定义日志回调函数。