Skip to content

사용자 정의 명령어 ​

컨트롤러 2차 개발 demo는 관련 다운로드 중 컨트롤러 SDK에서 직접 다운로드할 수 있습니다 ​

1. 사용자 정의 명령어에 사용되는 인터페이스 함수 소개 ​

다음 함수들은 모두 SDK의 헤더 파일에 포함되어 있습니다:

cpp
/**
 * @brief 사용자 정의 작업 파일 명령어 호출을 위한 MOVJ 명령어, 직접 호출 불가
 * @param robotNum 로봇 번호[1-4]
 * @param pos 로봇 운동 목표 위치, 자세한 내용은 NRC_Position 참조
 * @param vel 로봇의 실행 속도, 로봇 최대 속도의 백분율, 매개변수 범위: 0 < vel <= 100
 * @param acc 로봇 실행 가속도, 로봇 각 관절 최대 가속도의 백분율, 매개변수 범위: 0 < vel <= 100
 * @param dec 로봇 실행 감속도, 로봇 각 관절 최대 감속도의 백분율, 매개변수 범위: 0 < vel <= 100
 * @param pl 부드러움 정도, 다음 이동 명령어와 부드럽게 전환됨, 값이 클수록 더 부드럽지만 궤적 편차도 커짐, 매개변수 범위: 0 <= pl <= 5
 * @param moveToNextLine 줄 건너뛰기 여부, 마지막 명령어에서만 moveToNextLine을 true로 설정하면 됨
 */
void NRC_Jobrun_MoveDirect(int robotNum, const NRC_Position & pos, double vel,  double acc, double dec, int pl, bool moveToNextLine = false);


/**
 * @brief 사용자 정의 작업 파일 명령어 호출을 위한 MOVL 명령어, 직접 호출 불가
 * @param robotNum 로봇 번호[1-4]
 * @param pos 로봇 운동 목표 위치, 자세한 내용은 NRC_Position 참조
 * @param vel 로봇의 실행 속도, 로봇 엔드 이펙터 위치의 절대 실행 속도, 단위는 mm/s, 매개변수 범위: vel > 1
 * @param acc 로봇 실행 가속도, 로봇 각 관절 최대 가속도의 백분율, 매개변수 범위: 0 < vel <= 100
 * @param dec 로봇 실행 감속도, 로봇 각 관절 최대 감속도의 백분율, 매개변수 범위: 0 < vel <= 100
 * @param pl 부드러움 정도, 다음 이동 명령어와 부드럽게 전환됨, 값이 클수록 더 부드럽지만 궤적 편차도 커짐, 매개변수 범위: 0 <= pl <= 5
 * @param moveToNextLine 줄 건너뛰기 여부, 마지막 명령어에서만 moveToNextLine을 true로 설정하면 됨
 */
void NRC_Jobrun_MoveLinear(int robotNum, const NRC_Position & pos, double vel, double acc, double dec, int pl, bool moveToNextLine = false);


/**
 * @brief 사용자 정의 작업 파일 명령어 호출을 위한 MOVC 명령어, 직접 호출 불가
 * @param robotNum 로봇 번호[1-4]
 * @param mid_pos,end_pos 로봇 운동 목표 위치, 자세한 내용은 NRC_Position 참조
 * @param vel 로봇의 실행 속도, 로봇 엔드 이펙터 위치의 절대 실행 속도, 단위는 mm/s, 매개변수 범위: vel > 1
 * @param acc 로봇 실행 가속도, 로봇 각 관절 최대 가속도의 백분율, 매개변수 범위: 0 < vel <= 100
 * @param dec 로봇 실행 감속도, 로봇 각 관절 최대 감속도의 백분율, 매개변수 범위: 0 < vel <= 100
 * @param pl 부드러움 정도, 다음 이동 명령어와 부드럽게 전환됨, 값이 클수록 더 부드럽지만 궤적 편차도 커짐, 매개변수 범위: 0 <= pl <= 5
 * @param moveToNextLine 줄 건너뛰기 여부, 마지막 명령어에서만 moveToNextLine을 true로 설정하면 됨
 * @note 주의, MOVC는 첫 번째 명령어로 실행될 수 없으며, 처음 호출할 때 앞에 MOVJ 또는 MOVL 명령어가 반드시 있어야 합니다
 */
void NRC_Jobrun_MoveC(int robotNum, const NRC_Position& mid_pos,const NRC_Position& end_pos, double vel, double acc, double dec, int pl, bool moveToNextLine = false);


/**
 * @brief 사용자 정의 작업 파일 명령어 호출을 위한 MOVS 명령어, 직접 호출 불가
 * @param robotNum 로봇 번호[1-4]
 * @param pos 로봇 운동 목표 위치 컨테이너, 크기는 4 이상이어야 함 (즉 pos.size() >= 4), 위치점 설정 자세한 내용은 NRC_Position 참조
 * @param vel 로봇의 실행 속도, 로봇 엔드 이펙터 위치의 절대 실행 속도, 단위는 mm/s, 매개변수 범위: vel > 1
 * @param acc 로봇 실행 가속도, 로봇 각 관절 최대 가속도의 백분율, 매개변수 범위: 0 < vel <= 100
 * @param dec 로봇 실행 감속도, 로봇 각 관절 최대 감속도의 백분율, 매개변수 범위: 0 < vel <= 100
 * @param pl 부드러움 정도, 다음 이동 명령어와 부드럽게 전환됨, 값이 클수록 더 부드럽지만 궤적 편차도 커짐, 매개변수 범위: 0 <= pl <= 5
 * @param moveToNextLine 줄 건너뛰기 여부, 마지막 명령어에서만 moveToNextLine을 true로 설정하면 됨
 * @note 주의, MOVS는 첫 번째 명령어로 실행될 수 없으며, 처음 호출할 때 앞에 MOVJ 또는 MOVL 명령어가 반드시 있어야 합니다
 */
void NRC_Jobrun_MoveS(int robotNum, int pointNum, const std::vector< NRC_Position>& pos, double vel, double acc, double dec, int pl, bool moveToNextLine = false);


/**
 * @brief 사용자 정의 작업 파일 명령어 호출을 위한 IMOV 명령어, 직접 호출 불가
 * @param robotNum 로봇 번호[1-4]
 * @param pos 로봇 운동 목표 위치 컨테이너, 크기는 4 이상이어야 함 (즉 pos.size() >= 4), 위치점 설정 자세한 내용은 NRC_Position 참조
 * @param vel 로봇의 실행 속도, 로봇 엔드 이펙터 위치의 절대 실행 속도, 단위는 mm/s, 매개변수 범위: vel > 1
 * @param acc 로봇 실행 가속도, 로봇 각 관절 최대 가속도의 백분율, 매개변수 범위: 0 < vel <= 100
 * @param dec 로봇 실행 감속도, 로봇 각 관절 최대 감속도의 백분율, 매개변수 범위: 0 < vel <= 100
 * @param pl 부드러움 정도, 다음 이동 명령어와 부드럽게 전환됨, 값이 클수록 더 부드럽지만 궤적 편차도 커짐, 매개변수 범위: 0 <= pl <= 5
 * @param moveToNextLine 줄 건너뛰기 여부, 마지막 명령어에서만 moveToNextLine을 true로 설정하면 됨
 * @param tm 사전 실행 시간, 범위: [0,999999], 생략 가능, 기본값은 0
 * @note 주의, IMOV는 첫 번째 명령어로 실행될 수 없으며, 그 앞에 운동 관련 명령어가 반드시 있어야 합니다
 */
int NRC_Jobrun_IMOV(int robotNum, const NRC_Position& offset, double vel, double acc, double dec, int pl, int tm = 0, bool moveToNextLine = false);


/**
 * @brief 사용자 정의 작업 파일 명령어 호출을 위한 MOVJEXT 명령어, 직접 호출 불가
 * @param robotNum 로봇 번호[1-4]
 * @param pos 로봇 운동 목표 위치, 자세한 내용은 NRC_Position 참조
 * @param syncPos 로봇 운동 목표 위치, 자세한 내용은 NRC_SyncPosition 참조
 * @param vel 로봇의 실행 속도, 로봇 최대 속도의 백분율, 매개변수 범위: 0 < vel <= 100
 * @param acc 로봇 실행 가속도, 로봇 각 관절 최대 가속도의 백분율, 매개변수 범위: 0 < vel <= 100
 * @param dec 로봇 실행 감속도, 로봇 각 관절 최대 감속도의 백분율, 매개변수 범위: 0 < vel <= 100
 * @param pl 부드러움 정도, 다음 이동 명령어와 부드럽게 전환됨, 값이 클수록 더 부드럽지만 궤적 편차도 커짐, 매개변수 범위: 0 <= pl <= 5
 * @param moveToNextLine 줄 건너뛰기 여부, 마지막 명령어에서만 moveToNextLine을 true로 설정하면 됨
 */
void NRC_Jobrun_MoveDirectSync(int robotNum, const NRC_Position & pos, const NRC_SyncPosition & syncPos, double vel, double acc, double dec, int pl, bool moveToNextLine = false);


/**
 * @brief 사용자 정의 작업 파일 명령어 호출을 위한 MOVLEXT 명령어, 직접 호출 불가
 * @param robotNum 로봇 번호[1-4]
 * @param pos 로봇 운동 목표 위치, 자세한 내용은 NRC_Position 참조
 * @param syncPos 로봇 운동 목표 위치, 자세한 내용은 NRC_SyncPosition 참조
 * @param vel 로봇의 실행 속도, 로봇 엔드 이펙터 위치의 절대 실행 속도, 단위는 mm/s, 매개변수 범위: vel > 1
 * @param acc 로봇 실행 가속도, 로봇 각 관절 최대 가속도의 백분율, 매개변수 범위: 0 < vel <= 100
 * @param dec 로봇 실행 감속도, 로봇 각 관절 최대 감속도의 백분율, 매개변수 범위: 0 < vel <= 100
 * @param pl 부드러움 정도, 다음 이동 명령어와 부드럽게 전환됨, 값이 클수록 더 부드럽지만 궤적 편차도 커짐, 매개변수 범위: 0 <= pl <= 5
 * @param moveToNextLine 줄 건너뛰기 여부, 마지막 명령어에서만 moveToNextLine을 true로 설정하면 됨
 * @param sync 협동 여부
 */
void NRC_Jobrun_MoveLinearSync(int robotNum, const NRC_Position & pos, const NRC_SyncPosition & syncPos, double vel, double acc, double dec, int pl, int sync, bool moveToNextLine = false);

2. 사용자 정의 명령어 함수 사용 예시 ​

사용자 정의 명령어 사용 예시 전체 흐름도

cpp
#include "nrcAPI.h"
#include "nrcAPI_advance.h"
#include "json/json.h"
#include <atomic>
#include <chrono>
#include <cstdlib>
#include <iostream>
#include <mutex>
#include <sstream>
#include <stdio.h>
#include <string>
#include <thread>
#include <unistd.h>
#include <vector>
#include <functional>
#include <cstdint>
#include <cstring>
#include <fstream>




using namespace std;


bool test_cmd(int line, const std::string &paramStr, const std::string &posName) {
  int robotNum = 1;             //로봇 1
  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, 50, 80, 80, 5);
  NRC_Jobrun_MoveDirect(robotNum, pos2, 50, 80, 80, 5);
  NRC_Jobrun_MoveDirect(robotNum, pos3, 50, 80, 80, 5, true);    //마지막에 줄 건너뛰기가 필요할 때 moveToNextLine에 true 전달
}


int main() {
  // Nexmotion 라이브러리 버전 정보 출력
  std::cout << "라이브러리 버전:" << NRC_GetNexMotionLibVersion() << std::endl;


  // 제어 시스템 시작
  NRC_StartController();


  // 시스템 초기화 완료 대기
  while (NRC_GetControlInitComplete() != 1 )
  {
    NRC_Delayms(100);
  }
  NRC_ClearServoError();
  NRC_SetServoReadyStatus(1);
  NRC_Delayms(2000);
  NRC_SetJobFileCustomInstructionCB(test_cmd);     //사용자 정의 명령어 콜백 함수 등록
  while (1) //2차 개발 프로그램 계속 실행 유지
  {
    NRC_Delayms(1000);
  }
}

사용자 정의 명령어 함수 코드 예시의 프로그램 실행 흐름도

3. 사용자 정의 명령어 실행하기 ​

사용자 정의 명령어는 2차 개발 티치 펜던트에만 있으며, 사용자는 관련 다운로드에서 해당 티치 펜던트 2차 개발을 다운로드할 수 있습니다

2차 개발 티치 펜던트에서 사용자 정의 명령어가 실행되는 효과

🤖 AI assistants / automation: start with the Agent Development Guide and Pre-generation Checklist (Chinese); machine-readable entry: /llms.txt; plain-text version: swap .html for .md in the URL