Skip to content

마스터 스테이션 라이브러리

소개

INEXBOT EtherCAT 마스터 컨트롤러의 마스터 지터 시간은 20us 미만입니다. 산업 자동화 제어 시스템 개발에 폭넓게 사용될 수 있으며, 특히 로봇, 서보 모터 제어 등 실시간성이 요구되는 시나리오에 적합합니다.

버전 정보

이차 개발 버전회사
1.0.0INEXBOT

버전 업데이트 이력

버전수정 일자수정자설명
1.0.020250310EA초기 버전

개요

문서 소개

본 문서는 사용자가 INEXBOT EtherCAT의 마스터 제어용 C++ 라이브러리인 libNexIghEcm을 사용하는 것을 돕기 위해 작성되었습니다.

libNexIghEcm 라이브러리 소개

해당 라이브러리는 eni 파일을 자동으로 생성할 수 있으며, 사용자는 pdo 조작 주소를 가져오고 주기 작업을 등록하기만 하면 되어, 사용자가 EtherCAT 마스터를 사용하는 난이도를 크게 낮춥니다.

개발 환경 요구 사항

운영 체제Ubuntu 20.04 LTS
시스템 아키텍처x86_64
컴파일러GCC version 9.4.0/GLIBC 2.31-0ubuntu9.2<br>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슬레이브의 상태 가져오기
ecatSetSDOSDO 설정
ecatGetSDOSDO 가져오기
setEcatLicenseKey마스터 라이선스 키 설정 (빈 함수, 동작 없음)
isEcatLicenseCorrect마스터 라이선스 키 정확성 확인
setLogDirName마스터 log 출력 디렉터리 설정
setEcatLogSwitch마스터 log 활성화 여부 설정
getCycleTime마스터 실시간성 상태 가져오기
getEcLibVersion마스터 라이브러리 버전 가져오기
getEniFileNameeni 파일명 가져오기
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슬레이브 구성 데이터 초기화 실패
15EtherCAT 도메인 생성 실패
16슬레이브 구성 중 오류 발생
17슬레이브의 PDO 구성 중 오류 발생
18슬레이브의 PDO 구성 중 오류 발생
19EtherCAT 호스트 기준 클럭 선택 중 오류 발생
20슬레이브 Sync0 신호 구성 중 오류 발생
21호스트 활성화 실패
22도메인 데이터 오류
23도메인 크기 오류
24EtherCAT 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);
기능 설명로그 메시지를 기록합니다.
파라미터 설명입력 파라미터:<br>msg: 기록할 로그 메시지, 타입은 const char*.
반환값없음
비고이 함수는 일반 로그 메시지를 기록하는 데 사용됩니다. 시스템에서 디버깅 및 런타임 추적에 사용할 수 있습니다.

ECM_LogError

함수 프로토타입void ECM_LogError(const char* errorMsg);
기능 설명오류 로그를 기록합니다.
파라미터 설명입력 파라미터:<br>errorMsg: 기록할 오류 메시지, 타입은 const char*.
반환값없음
비고이 함수는 오류 로그를 기록하는 데 사용됩니다. 프로그램 실행 중 발생하는 오류 정보를 기록하는 데 적합합니다.

ecatGetConnectedSlavesNum

함수 프로토타입int ecatGetConnectedSlavesNum();
기능 설명마스터에 연결된 슬레이브 수를 가져옵니다.
파라미터 설명없음
반환값int 타입 값을 반환하며, 연결된 슬레이브 수를 나타냅니다.
비고이 함수는 마스터에 성공적으로 연결된 슬레이브 수를 가져오는 데 사용됩니다.

ecatGetConfiguredSlavesNum

함수 프로토타입int ecatGetConfiguredSlavesNum();
기능 설명구성된 슬레이브 수를 가져옵니다.
파라미터 설명없음
반환값int 타입 값을 반환하며, 구성된 슬레이브 수를 나타냅니다.
비고없음

ecatGetSlaveState

함수 프로토타입EC_T_WORD ecatGetSlaveState(EC_T_DWORD ecSlaveNum);
기능 설명지정된 슬레이브의 상태를 가져옵니다.
파라미터 설명입력 파라미터:<br>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 값을 설정합니다.
파라미터 설명입력 파라미터:<br>slaveNum: 슬레이브 번호.<br>index: SDO 인덱스.<br>subindex: SDO 서브 인덱스.<br>value: 설정할 SDO 데이터 값.<br>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 값을 가져옵니다.
파라미터 설명입력 파라미터:<br>slaveNum: 슬레이브 번호.<br>index: SDO 인덱스.<br>subindex: SDO 서브 인덱스.<br>value: SDO 값을 저장할 버퍼.<br>size: 버퍼 크기.<br>num: 선택적 파라미터, 기본값 0, 가져올 SDO 데이터의 수량.<br>출력 파라미터:<br>value: 수신된 SDO 데이터 값.
반환값int 타입 값을 반환하며, 0은 성공, 0이 아닌 값은 실패를 나타냅니다.
------
비고이 함수는 슬레이브의 SDO 값을 가져오는 데 사용됩니다.

setEcatLicenseKey

함수 프로토타입void setEcatLicenseKey(const char* licenseKey);
기능 설명EtherCAT 라이선스 키를 설정합니다.
파라미터 설명입력 파라미터:<br>licenseKey: EtherCAT 라이선스 키, 타입은 const char*.
반환값없음
비고동작 없는 빈 함수

isEcatLicenseCorrect

함수 프로토타입bool isEcatLicenseCorrect();
기능 설명EtherCAT 라이선스가 유효한지 확인합니다.
파라미터 설명없음
반환값없음
비고동작 없는 빈 함수

setLogDirName

함수 프로토타입void setLogDirName(const char* dir);
기능 설명로그 출력 디렉터리를 설정합니다.
파라미터 설명입력 파라미터:<br>dir: 로그 디렉터리 경로, 타입은 const char*.
반환값없음
비고이 함수는 로그 파일의 출력 디렉터리를 설정하는 데 사용됩니다.

setEcatLogSwitch

함수 프로토타입void setEcatLogSwitch(bool enable);
기능 설명EtherCAT 로그 스위치를 설정합니다.
파라미터 설명입력 파라미터:<br>enable: bool 값, 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 대조 콜백 함수를 등록합니다.
파라미터 설명입력 파라미터:<br>callback: 콜백 함수, 두 개의 파라미터를 받음:<br>slaveNum: 슬레이브 번호.<br>isMatched: bool 값, 슬레이브 ID가 사전 설정된 ID와 일치하는지 여부를 나타냅니다.
반환값없음
비고이 함수는 콜백 함수를 등록하는 데 사용되며, 해당 함수는 마스터가 슬레이브 ID와 사전 설정 ID가 일치하는지 검사할 때 호출됩니다.

registerCustomeAppWorkpd

함수 프로토타입void registerCustomeAppWorkpd(void (*callback)(EC_T_DWORD slaveNum, bool isMatched));
기능 설명사용자 정의 워크 사이클 콜백 함수를 등록합니다.
파라미터 설명입력 파라미터:<br>callback: 콜백 함수, 두 개의 파라미터를 받음:<br>slaveNum: 슬레이브 번호.<br>isMatched: bool 값, 슬레이브 ID가 사전 설정된 ID와 일치하는지 여부를 나타냅니다.
반환값없음
비고이 함수는 워크 사이클의 콜백 함수를 등록하는 데 사용됩니다.

registerCustomeEcMasterStartFinish

함수 프로토타입void registerCustomeEcMasterStartFinish(void (*callback)(bool success));
기능 설명사용자 정의 EtherCAT 마스터 시작 완료 콜백 함수를 등록합니다.
파라미터 설명입력 파라미터:<br>callback: 콜백 함수, bool 값 success를 받아 시작 성공 여부를 나타냅니다.
반환값없음
비고이 함수는 워크 사이클의 콜백 함수를 등록하는 데 사용됩니다.

registerCustomeAppLog

함수 프로토타입void registerCustomeAppLog(void (callback)(const char logMessage));
기능 설명애플리케이션 로그 콜백 함수를 등록합니다.
파라미터 설명입력 파라미터:<br>callback: 콜백 함수, 문자열 logMessage를 받아 로그 정보를 나타냅니다.
반환값없음
비고이 함수는 사용자 정의 로그 콜백 함수를 등록하는 데 사용됩니다.