Skip to content

단축 구동 (Single Move)

모션 구동의 가장 기본이 되는 구동은 단축 구동이다. 단축 구동은 크게 위치 구동(Position Drive), 속도 구동(Velocity Drive), 신호 검색 구동(Signal Search Drive), 원점 검색 구동(Home Search Drive)으로 나뉜다.

1. 위치 구동

위치 구동은 기구부를 원하는 위치로 이동시키기 위한 명령이다. 위치 구동을 위한 함수로는 AxmMovePosAxmMoveStartPos 가 있다. 두 함수는 설정한 거리 또는 위치로 입력해준 속도 및 가속도로 이동하도록 하는데, AxmMovePos 함수는 종점 탈출 함수로 구동이 종료되어야 프로그램의 다음 명령을 실행시키고, AxmMoveStartPos 함수는 시점 탈출 함수로 동작이 시작되고 바로 프로그램의 다음 명령을 수행한다.

AxmMovePos 함수를 사용한다면 좌표계와 속도 프로파일을 따로 설정하는 함수를 사용하고, 이동량, 속도, 가속도를 설정한다. 아래와 같이 대칭 프로파일 구동일 경우 입력한 감속도는 무시되며 입력한 가속도가 가감속 시 적용된다.

//0축을 절대 좌표로 100 위치까지 대칭 S자 구동 모드로 이동 (속도 100, 가속도 200)  
long lAxisNo = 0;  
DWORD uAbsRelMode = 0;  
DWORD uProfileMode = 3;  
AxmMotSetAbsRelMode(lAxisNo, uAbsRelMode);  
AxmMotSetProfileMode(lAxisNo, uProfileMode);  
double dPosition = 100;  
double dMaxVelocity = 100;  
double dMaxAccel = 200;  
double dMaxDecel = 200;  
AxmMovePos(lAxisNo, dPosition, dMaxVelocity, dMaxAccel, dMaxDecel);  

AxmMoveStartPos 함수를 사용한다면 구동이 시작되자마자 바로 다음 함수가 실행되는데, 만약 다음 함수가 구동 함수라면 반드시 AxmStatusReadInMotion 함수를 이용하여 구동 여부를 확인하고 구동 종료 후 다음 구동 명령을 수행해야 한다.
구동 중일 때는 모든 모션 구동 명령이 에러를 반환하고 실행되지 않기 때문이다.
여기서 AxmStatusReadInMotion 함수는 모션 구동 중이면 TRUE, 구동 중이 아니면 FALSE를 반환한다.

//0축을 상대 좌표로 100 위치까지 비대칭 S자 구동 모드로 이동 (속도 100, 가속도 200, 감속도 100)
long lAxisNo = 0;
DWORD uAbsRelMode = 1;
DWORD uProfileMode = 4;
AxmMotSetAbsRelMode(lAxisNo, uAbsRelMode);
AxmMotSetProfileMode(lAxisNo, uProfileMode);
double dPosition = 100;
double dMaxVelocity = 100;
double dMaxAccel = 200;
double dMaxDecel = 100;
AxmMoveStartPos(lAxisNo, dPosition, dMaxVelocity, dMaxAccel, dMaxDecel);
DWORD uStatus;

AxmStatusReadInMotion(lAxisNo, &uStatus);
while(uStatus){
    AxmStatusReadInMotion(lAxisNo, &uStatus);
}
// Ex5_AXM_PositionMove.cpp : Defines the entry point for the console application.
// 위치 구동 함수로 100만큼 이동 후 다시 -100만큼 이동 후 종료한다.
#include "stdafx.h"
#include "AXL.h"
#include <conio.h>
#include "stdio.h"
#define AXIS_0 0

void main(void)
{
    // 라이브러리를 초기화한다.
    // 7은 IRQ를 뜻한다. PCI에서 자동으로 IRQ가 설정된다.
    DWORD Code = AxlOpen(7);
    if (Code == AXT_RT_SUCCESS)
    {
        printf("라이브러리가 초기화되었습니다.\n");
        //모션 모듈이 있는지 검사
        DWORD uStatus;
        Code = AxmInfoIsMotionModule(&uStatus);
        if(Code == AXT_RT_SUCCESS)
        {
            if(uStatus == STATUS_EXIST)
            {
                printf("모션 모듈이 존재합니다.\n");
                // 0축의 +End limit 과 -End limit 의 Active level을 HIGH로 설정한다.
                AxmSignalSetLimit(AXIS_0, 0, HIGH, HIGH);
                // 0축의 Inpositon 신호의 입력 레벨을 HIGH로 설정한다.
                AxmSignalSetInpos(AXIS_0, HIGH);
                // 0축의 알람 신호의 입력 레벨을 LOW로 설정한다.
                AxmSignalSetServoAlarm(AXIS_0, LOW);
                // 0축의 비상 정지 신호(ESTOP)의 Active 입력 레벨을 HIGH로 설정한다.
                AxmSignalSetStop(AXIS_0, 0, HIGH);
                //0축 지령 값을 mm단위가 되도록한다.
                AxmMotSetMoveUnitPerPulse(AXIS_0, 10, 10000);
                //0축에 초기 속도를 1로 설정한다. Default : 1
                AxmMotSetMinVel(AXIS_0, 1);
                //0축의 펄스 출력 방식을 TwoCwCcwHigh로 한다.
                AxmMotSetPulseOutMethod(AXIS_0, TwoCcwCwHigh);
                //지정 축에 Encoder 입력 방식을 4체배로 설정한다.
                AxmMotSetEncInputMethod(AXIS_0, ObverseSqr4Mode);
                //현재 위치를 원점으로 설정한다.
                AxmStatusSetActPos(AXIS_0, 0.0);
                AxmStatusSetCmdPos(AXIS_0, 0.0);
                //Servo On
                AxmSignalServoOn(AXIS_0, ENABLE);
                printf("0축을 절대 좌표로 100위치까지 대칭 S자 구동(속도 100, 가속도 200, 종점 탈출)\n");
                printf("아무 키나 누르면 구동을 시작합니다.\n");
                getch();
                AxmMotSetAbsRelMode(AXIS_0, 0);
                AxmMotSetProfileMode(AXIS_0, 3);
                AxmMovePos(AXIS_0, 100, 100, 200, 200);
                printf("0축을 상대 좌표로 -100 위치까지 비대칭 S자 구동 (속도 100, 가속도 200, 시점 탈출)\n");
                printf("아무 키나 누르면 구동을 시작합니다.\n");
                getch();
                AxmMotSetAbsRelMode(AXIS_0, 1);
                AxmMotSetProfileMode(AXIS_0, 4);
                AxmMoveStartPos(AXIS_0, -100, 100, 200, 200);
                //현재 구동 중이면 대기한다.
                DWORD uStatus;
                AxmStatusReadInMotion(AXIS_0, &uStatus);
                while(uStatus) 
                {
                    AxmStatusReadInMotion(AXIS_0, &uStatus);
                }
            }
            else
                printf ("AxmInfoIsMotionModule() : ERROR ( NOT STATUS_EXIST ) code 0x%x\n",Code);
        }
        else
            printf ("AxmInfoIsMotionModule() : ERROR ( Return FALSE ) code 0x%x\n",Code);
    }
    else
        printf ("AxlOpen() : ERROR code 0x%x\n",Code);

    // 라이브러리를 종료한다.
    if (AxlClose())
        printf("라이브러리가 종료되었습니다.\n");
    else
        printf("라이브러리가 정상적으로 종료되지 않았습니다.\n");
}

2. 속도(조그) 구동

속도 구동은 속도, 가속도, 가속 시간을 정하여 종료 명령이 나올 때까지 계속 움직이는 형태의 구동이다.
속도 구동 함수는 모두 펄스가 시작되는 시점에서 함수를 벗어나는 펄스 시점 탈출 함수이다.
속도 구동을 하기 위해서는 AxmMoveVel 함수를 사용하는데, AxmMoveVel 함수는 일정한 직선 속도로 이동하도록 하는 명령이다. 구동 방향은 속도값의 부호로 결정된다.

//0축을 (+)방향으로 속도 100, 대칭 S자 속도 프로파일로 구동을 시작한다.
long lAxisNo = 0;
DWORD uProfileMode = 3;
AxmMotSetProfileMode(lAxisNo, uProfileMode);

double dMaxVelocity = 100;
double dMaxAccel = 200;
double dMaxDecel = 200;
AxmMoveVel(lAxisNo, dMaxVelocity, dMaxAccel, dMaxDecel);
//0축을 (-)방향으로 속도 100, 대칭 사다리꼴 속도 프로파일로 구동을 시작한다.
long lAxisNo = 0;
DWORD uProfileMode = 0;
AxmMotSetProfileMode(lAxisNo, uProfileMode);

double dMaxVelocity = -100;
double dMaxAccel = 200;
double dMaxDecel = 200;
AxmMoveVel(lAxisNo, dMaxVelocity, dMaxAccel, dMaxDecel);

이렇게 속도 구동 함수를 시작하면 정지 명령을 내릴 때까지 계속 구동하게 된다.
구동의 정지는 뒤에서 상세히 언급할 것이며, 아래와 같이 하면 된다.

//0축의 구동을 설정된 감속도로 감속하면서 정지하도록 한다.
long lAxisNo = 0;
AxmMoveSStop(lAxisNo);
// Ex6_AXM_VelocityMove.cpp : Defines the entry point for the console application.
// 속도 구동 함수를 이용하여 구동하고, 정지 명령에 의해 구동을 종료한다.
#include "stdafx.h"
#include "AXL.h"
#include <conio.h>
#include "stdio.h"

#define AXIS_0 0
void main(void)
{
    // 라이브러리를 초기화한다.
    // 7은 IRQ를 뜻한다. PCI에서 자동으로 IRQ가 설정된다.
    DWORD Code = AxlOpen(7);
    if (Code == AXT_RT_SUCCESS)
    {
        printf("라이브러리가 초기화되었습니다.\n");
        //모션 모듈이 있는지 검사
        DWORD uStatus;
        Code = AxmInfoIsMotionModule(&uStatus);
        if(Code == AXT_RT_SUCCESS)
        {
            if(uStatus == STATUS_EXIST)
            {
                printf("모션 모듈이 존재합니다.\n");
                // 0축의 +End limit 과 -End limit 의 Active level을 HIGH로 설정한다.
                AxmSignalSetLimit(AXIS_0, 0, HIGH, HIGH);
                // 0축의 Inpositon 신호의 입력 레벨을 HIGH로 설정한다.
                AxmSignalSetInpos(AXIS_0, HIGH);
                // 0축의 알람 신호의 입력 레벨을 LOW로 설정한다.
                AxmSignalSetServoAlarm(AXIS_0, LOW);
                // 0축의 비상 정지 신호(ESTOP)의 Active 입력 레벨을 HIGH로 설정한다.
                AxmSignalSetStop(AXIS_0, 0, HIGH);
                //0축의 지령 값을 mm 단위가 되도록한다.
                AxmMotSetMoveUnitPerPulse(AXIS_0, 10, 10000);
                //0축의 초기 속도를 1로 설정한다. Default : 1
                AxmMotSetMinVel(AXIS_0, 1);
                //0축의 펄스 출력 방식을 TwoCcwCwHigh로 한다.
                AxmMotSetPulseOutMethod(AXIS_0, TwoCcwCwHigh);
                //지정 축의 Encoder 입력 방식을 4체배로 설정한다.
                AxmMotSetEncInputMethod(AXIS_0, ObverseSqr4Mode);
                //현재 위치를 원점으로 설정한다.
                AxmStatusSetActPos(AXIS_0, 0.0);
                AxmStatusSetCmdPos(AXIS_0, 0.0);
                //Servo On
                AxmSignalServoOn(AXIS_0, ENABLE);
                // help Message
                printf("[INFORMATION]*************** \n");
                printf("[ESC] : Exit after Servo Off \n");
                printf("[1] : (+)방향으로 속도 구동 시작 \n");
                printf("[2] : (-)방향으로 속도 구동 시작 \n");
                printf("[3] : STOP \n");
                printf("**************************** \n");

                DWORD uStatus;
                BOOL fExit = FALSE;
                while (!fExit) // 무한 루프
                {
                    if (kbhit()) // 아무 키나 누르면
                    {
                        int ch = getch();
                        switch (ch)
                        {
                            case 27: // Esc key
                            fExit = TRUE;
                            AxmSignalServoOn(AXIS_0, DISABLE); //Servo Off
                            break;
                            case '1':
                            // 구동 중이 아니라면, (+)방향으로 대칭 사다리꼴 속도 프로파일로 연속 구동한다.
                            AxmStatusReadInMotion(AXIS_0, &uStatus);
                            if(!uStatus)
                            {
                                AxmMotSetProfileMode(AXIS_0, 0);
                                AxmMoveVel(AXIS_0, 100, 200, 200);
                            }
                            break;
                            case '2':
                            // 구동 중이 아니라면, (-)방향으로 대칭 S자 속도 프로파일로 연속 구동한다.
                            AxmStatusReadInMotion(AXIS_0, &uStatus);
                            if(!uStatus)
                            {
                                AxmMotSetProfileMode(AXIS_0, 3);
                                AxmMoveVel(AXIS_0, -100, 200, 200);
                            }
                            break;
                            case '3': //구동 중이라면, 감속 정지한다.
                            AxmStatusReadInMotion(AXIS_0, &uStatus);
                            if(uStatus)
                                AxmMoveSStop(AXIS_0);
                            break;
                        }
                    }
                } //End of While()
            }
            else
                printf ("AxmInfoIsMotionModule() : ERROR ( NOT STATUS_EXIST ) code 0x%x\n",Code);
        }
        else
            printf ("AxmInfoIsMotionModule() : ERROR ( Return FALSE ) code 0x%x\n",Code);
    }
    else
        printf ("AxlOpen() : ERROR code 0x%x\n",Code);

    // 라이브러리를 종료한다.
    if (AxlClose())
        printf("라이브러리가 종료되었습니다.\n");
    else
        printf("라이브러리가 정상적으로 종료되지 않았습니다.\n");
}

3. 신호 검색 구동

신호 검색 구동이란 Limit 신호나 범용 입출력 신호 등의 검출 대상을 미리 설정하고, 일정 속도로 움직이다가 설정한 신호가 감지될 경우 정지하는 구동을 뜻한다.
신호 검색 구동은 특정 신호가 검색되면 감속 또는 급정지하는 AxmMoveSignalSearch 함수와 신호가 검색되면 그 위치를 저장하는 AxmMoveSignalCapture 함수가 있다.
검색할 수 있는 신호는 아래의 표에서와 같이 8개의 신호가 있는데, 각각 Up Edge와 Down Edge가 있으므로 총 16개의 신호가 있다.

정의 검출 신호
PosEndLimit 0x0 +Elm(End limit) +방향 리미트 센서 신호
NegEndLimit 0x1 -Elm(End limit) -방향 리미트 센서 신호
PosSloLimit 0x2 사용하지 않음
NegSloLimit 0x3 사용하지 않음
HomeSensor 0x4 IN0(ORG) 원점 센서 신호
EncodZPhase 0x5 IN1(Z상) Encoder Z상 신호
UniInput02 0x6 IN2(범용) 범용 입력 2번 신호
UniInput03 0x7 IN3(범용) 범용 입력 3번 신호

신호 검색 구동을 하기 위해서는 AxmMoveSignalSearch 함수를 사용하는데, 이 함수는 특정 입력 신호의 Edge를 검출하여 급정지 또는 감속 정지하는 함수로 검출할 입력 신호와 선택한 입력 신호의 Edge 방향, 구동 방향, 속도 및 가속도, 정지 방법를 입력 받는다.
여기서 구동 방향은 속도값의 부호에 따라 결정된다. 특히 이 함수는 다음 그림에서와 같이 해당 신호가 검출된 후에 감속을 시작하므로 정확한 신호 위치의 검색을 위해서는 신호 검색 구동에서 감속 정지 한 후에 반대 방향으로 신호를 저속 검색하면서 해당 신호에서 급정지하는 방법을 사용하여야 한다.

// -방향으로 이동하면서 홈 센서의 Up Edge를 찾는다.
long lAxisNo = 0;
double dMaxVelocity = -100;
double dMaxAccel = 200;
long lDetectSignal = HomeSensor;
long lSignalEdge = UP_EDGE;
long lSignalMethod = 0; // [0]감속 정지, [1]급정지
AxmMoveSignalSearch(lAxisNo, dMaxVelocity, dMaxAccel, lDetectSignal, lSignalEdge, lSignalMethod);

// +방향으로 천천히 이동하면서 홈 센서의 Down Edge를 검색한 후 급정지한다.
double dMaxVelocity = 20;
double dMaxAccel = 0;
long lDetectSignal = HomeSensor;
long lSignalEdge = DOWN_EDGE;
long lSignalMethod = 1; // [0]감속 정지, [1]급정지
AxmMoveSignalSearch(lAxisNo, dMaxVelocity, dMaxAccel, lDetectSignal,lSignalEdge,lSignalMethod);

Single-Move

단순히 신호가 검색되는 위치에 정지시키는 것 뿐만 아니라 해당 신호의 위치를 확인하고자 한다면 AxmMoveSignalCapture 함수를 사용하면 된다.
이 함수를 호출하면 해당 신호 검색을 시작하고 신호가 검색되면 해당 위치를 저장하게 되는데, AxmMoveGetCapturePos 함수를 사용하여 저장된 위치를 확인할 수 있다.
저장되는 위치는 Command Position 또는 Actual Position 값 중 하나이며, 이를 통해 원점으로부터의 거리를 확인할 수 있다.

// +방향으로 이동하면서 +ELM의 Up Edge를 찾는다.
long lAxisNo = 0;
double dMaxVelocity = 100;
double dMaxAccel = 200;
long lDetectSignal = PosEndLimit;
long lSignalEdge = UP_EDGE
long lTarget = 0; //[0] Command Position, [1] Actual Position
long lSignalMethod = 0 //[0]감속 정지, [1]급정지
AxmMoveSignalCapture(lAxisNo, dMaxVelocity, dMaxAccel, lDetectSignal, lSignalEdge, lTarget, lSignalMethod);

//+ELM 센서의 위치를 확인한다.
double dCapPotition;
AxmMoveGetCapturePos(lAxisNo, &dCapPotition);
printf(+ELM센서의위치 : %f, dCapPotition);
// Ex7_AXM_SignalSearchDrive.cpp : Defines the entry point for the console application.
// 신호 검색 구동 함수를 이용해서 리미트 센서와 홈 센서로 이동한다.
#include "stdafx.h"
#include "AXL.h"
#include <conio.h>
#include "stdio.h"
#define AXIS_0 0

void main(void)
{
    // 라이브러리를 초기화한다.
    // 7은 IRQ를 뜻한다. PCI에서 자동으로 IRQ가 설정된다.
    DWORD Code = AxlOpen(7);
    if (Code == AXT_RT_SUCCESS)
    {
        printf("라이브러리가 초기화되었습니다.\n");
        //모션 모듈이 있는지 검사
        DWORD uStatus;
        Code = AxmInfoIsMotionModule(&uStatus);
        if(Code == AXT_RT_SUCCESS)
        {
            if(uStatus == STATUS_EXIST)
            {
                printf("모션 모듈이 존재합니다.\n");
                // 0축의 +End limit 과 -End limit 의 Active level 을 HIGH로 설정한다.
                AxmSignalSetLimit(AXIS_0, 0, HIGH, HIGH);
                // 0축의 Inpositon 신호 입력 레벨을 HIGH로 설정한다.
                AxmSignalSetInpos(AXIS_0, HIGH);
                // 0축의 알람 신호 입력 레벨을 LOW로 설정한다.
                AxmSignalSetServoAlarm(AXIS_0, LOW);
                // 0축의 비상 정지 신호(ESTOP) Active 입력 레벨을 HIGH로 설정한다.
                AxmSignalSetStop(AXIS_0, 0, HIGH);
                //0축 지령 값을 mm단위가 되도록 한다.
                AxmMotSetMoveUnitPerPulse(AXIS_0, 10, 10000);
                //0축의 초기 속도를 1로 설정한다. Default : 1
                AxmMotSetMinVel(AXIS_0, 1);
                //0축의 펄스 출력 방식을 TwoCwCcwHigh로 한다.
                AxmMotSetPulseOutMethod(AXIS_0, TwoCcwCwHigh);
                //지정 축의 Encoder 입력 방식을 4체배로 설정한다.
                AxmMotSetEncInputMethod(AXIS_0, ObverseSqr4Mode);
                //현재 위치를 원점으로 설정한다.
                AxmStatusSetActPos(AXIS_0, 0.0);
                AxmStatusSetCmdPos(AXIS_0, 0.0);
                //Servo On
                AxmSignalServoOn(AXIS_0, ENABLE);
                // help Message
                printf("[INFORMATION]*************** \n");
                printf("[ESC] : Exit \n");
                printf("[1] : +ELM센서의 Up Edge를 감지할 때까지 +방향으로 이동 후 사다리꼴 감속 정지
                \n");
                printf("[2] : -ELM센서의 Up Edge 를 감지할 때까지 –방향으로 이동 후 S-커브 감속 정지
                \n");
                printf("[3] : IN/OUT5(ORG) DownEdge를 감지할 때까지 +방향으로 이동 후 급정지 \n");
                printf("**************************** \n");
                DWORD uPositiveStatus, uNegativeStatus, uHomeStatus;
                BOOL fExit = FALSE;
                while (!fExit) // 무한 루프
                {
                    if (kbhit()) // 아무 키나 누르면
                    {
                        int ch = getch();
                        switch (ch)
                        {
                            case 27: // Esc key
                            fExit = TRUE;
                            AxmSignalServoOn(AXIS_0, DISABLE); //Servo Off
                            break;
                            case '1':
                            // 0축에 100의속도와 200의 가감속도로 사다리꼴 구동
                            // +ELM센서의 Up Edge를 감지할 때까지 +방향으로 구동 후 감속 정지한다.
                            AxmMotSetProfileMode(AXIS_0, 0);
                            AxmMoveSignalSearch(AXIS_0, 100, 200, PosEndLimit,UP_EDGE,0);
                            break;
                            case '2':
                            // 0축에 100의속도와 200의가감속도로 S자구동,
                            // -ELM센서의 Up Edge를 감지할 때까지 –방향으로 구동 후 감속 정지한다.
                            AxmMotSetProfileMode(AXIS_0, 3);
                            AxmMoveSignalSearch(AXIS_0, -100, 200, NegEndLimit, UP_EDGE,0);
                            break;
                            case '3':
                            // 0축에 20의 속도로 홈 센서의 Down Edge를 감지할 때까지 +방향으로 구동
                             급정지
                            AxmMoveSignalSearch(AXIS_0, 20, 0, HomeSensor, DOWN_EDGE,1);
                            break;
                        }
                    }
                    // 각 센서의 신호 상태를 확인한다.
                    AxmSignalReadLimit(AXIS_0, &uPositiveStatus, &uNegativeStatus);
                    AxmSignalReadInputBit(AXIS_0, 0, &uHomeStatus);
                    printf("\r신호상태 : P_Elm(%d),N_Elm(%d),Home(%d)",uPositiveStatus, uNegativeStatus, uHomeStatus);
                } //End of While()
            }
            else
                printf ("AxmInfoIsMotionModule() : ERROR ( NOT STATUS_EXIST )code 0x%x\n",Code);
        }
        else
            printf ("AxmInfoIsMotionModule() : ERROR ( Return FALSE ) code 0x%x\n",Code);
    }
    else
        printf ("AxlOpen() : ERROR code 0x%x\n",Code);

    // 라이브러리를 종료한다.
    if (AxlClose())
        printf("\n라이브러리가 종료되었습니다.\n");
    else
        printf("\n라이브러리가 정상적으로 종료되지 않았습니다.\n");
}

4. 원점 검색 구동

하드웨어 초기화, 파라미터 설정, 서보 온의 과정으로 모션 구동에 작업이 준비되어 있다 하더라도 좌표계의 방향만 설정되어 있을 뿐 좌표계의 기준이 되는 원점은 설정이 되어 있지 않은 상태이다.
기구부가 사용자가 원하는 일정한 위치로 이송되기 위해서는 정확한 원점이 보장되어야 한다.

원점 검색을 하는 방법에는 크게 신호 검색 구동 함수를 이용하는 방법과 원점 검색 함수를 이용하는 방법이 있다. 신호 검색을 이용하여 홈 검색을 수행하기 위해서는 상당히 번거로운 작업들이 이루어져야 하므로 이러한 과정을 더 편하게 하기 위해 홈 검색 함수를 제공한다.

원점 검색 함수를 이용하기 위해서는 AxmHomeSetMethod 함수와 AxmHomeSetVel 함수로 홈 검색에 필요한 데이터들을 설정하고, AxmHomeSetStart 함수를 호출하여 홈 검색을 시작하면 된다.

원점 검색 함수는 개별적인 스레드를 생성하여 작동하므로, 만약 여러 축의 원점 검색을 해야 하는 경우라면 각각의 원점 검색 명령을 열거해서 사용하면 된다.

원점 검색 방법 및 속도 설정

원점 검색은 기구부에 따라 여러 가지 신호 검색 순서가 발생할 수 있지만, AXL의 원점 검색 함수는 아래의
7단계의 원점 검색 시퀀스로 이루어지며, -방향으로 원점 검색을 실행할 경우, 원점 검색 단계는 다음과 같다.

Single-Move

1단계: -방향으로 이동하면서 홈 센서의 Rising Edge 신호를 검색하여 감속 정지
           (홈 센서가 이미 HIGH 상태라면 1단계를 생략)
2단계: +방향으로 이동하면서 홈 센서의 Falling Edge 신호를 검색하여 감속 정지
3단계: -방향으로 이동하면서 홈 센서의 Rising Edge신호를 검색하여 급정지

< Z 상 검색을 사용하지 않은 경우 >
4단계: +방향으로 이동하면서 홈 센서의 Falling Edge신호를 검색하여 급정지
5단계: -방향으로 이동하면서 홈 센서의 Rising Edge신호를 검색하여 급정지

< Z 상 검색을 사용한 경우 >
4단계: +방향으로 이동하면서 Z 상의 Falling Edge신호를 검색하여 급정지
5단계: -방향으로 이동하면서 Z 상의 Rising Edge신호를 검색하여 급정지
6단계: Offset 값이 있다면 Offset 값 만큼 추가 이동
7단계: 사용자 설정 시간 동안 대기 후 위치값을 0으로 설정

  • Step별 원점 검출 속도 설정의 이해 (Z 상 검색을 사용 할 경우)

Single-Move

① VelFirst, AccFirst사용
HmDir 방향으로 원점센서를 고속 검출하고 HAccF 감속도로 감속 정지

② VelSecond, AccSecond사용
HmDir 반대 방향으로 원점센서의 Down Edge를 검출하고 HAccF 감속도로 감속 정지

③ VelThird사용
HmDir 방향으로 원점센서의 Up Edge를 검출하고 급정지

④ VelLast 사용
HmDir 반대 방향으로 Z상의 Down Edge를 검출하고 급정지

⑤ VelLast 사용
HmDir 방향으로 Z상의 Up Edge를 검출하고 급정지

  • Offset 값 설정의 이해

기구적인 원점 센서 검출이 완료된 후 특정 위치로 옮겨 원점을 설정해야 될 경우 Offset에 값을 지정하면
원점 센서 검출이 완료된 후 자동으로 해당 Offset만큼 이동 완료 후 원점을 재설정하게 된다.
이때 주의할 것은 (+)나 (-)Limit을 벗어나지 않는 범위에서 Offset을 지정해야 된다.
그렇지 않을 경우 원점 검색을 정상적으로 수행할 수 없다.

Single-Move

  • 원점 검색 함수와 관련된 파라미터 및 설명
원점 검색 관련 설정 변수 변수 설명
HmSig 원점 센서로 사용할 신호를 설정 예) 원점 센서(4), +Limi 센서(0) 등
HmLev 원점 센서의 Active Level을 설정 예) 0: A 접점, 1: B 접점
HmDir 원점 센서 검출 시 초기 검색 진행 방향을 설정 예) 1: (+)방향, 0: (-)방향
Zphas 원점 센서 검출 후 엔코더 Z상 검출 여부 설정 예) 1: 사용함, 0: 사용 안함
4번 Step에서 Z상의 Down Edge를 검출하고 5번 Step에서 Z상의 Up Edge를 재 검출함으로써 원점 검색 속도와 정밀도를 높이기 위해 사용
VelFirst 원점 검색 시 초기 고속 검출 속도
(초기 원점 센서가 감지되지 않았을경우)
VelSecond 원점 검색 시 1차 센서 검출 후 반대 방향으로 빠져나오는 속도
VelThird 원점 검색 시 1차 센서 검출 후 재검색을 진행하는 속도
VelLast 원점 검색 시 최종 검출 속도 설정 [원점 검색의 정밀도 결정]
AccFirst 원점 검색 시 초기 고속 검출 가속도
AccSecond 원점 검색 시 1차 센서 검출 후 반대 방향으로 빠져나오는 가속도
HClrTim 원점 검색 완료 후 Command, Actual(Encoder) 위치를 Clear하기 전 대기 시간
HOffset 원점 검색 완료 후 기구 원점 재설정 시 이동 Offset 값

주의 사항

레벨을 잘못 설정 시 -방향으로 설정해도 +방향으로 동작할 수 있으며, 홈을 찾는데 있어 문제가 될 수 있다.

// 원점 검색 방법을 설정하는 함수
long lAxisNo = 0; //원점 검색이 이루어질 축 번호
long nHmDir = 0; //원점 검색 1단계의 이동 방향, (-)방향을 입력
DWORD uHomeSignal = HomeSensor; //신호 검색 구동에서의 신호들을 사용
DWORD uZphas = 1; // Z상 검출 유무, 1이면 검출, 0이면 검출 안 함
double dHomeClrTime = 2000.0; // 원점 검색 Enc 값 Set하기 위한 대기 시간
double dHomeOffset = 0.0; // 원점 검색 후 Offset값 만큼 추가적으로 이동
AxmHomeSetMethod(lAxisNo,nHmDir,uHomeSignal,uZphas,dHomeClrTime,dHomeOffset);

// 원점 검색 시 사용될 속도를 설정
double dVelFirst = 100; //1단계에서의 속도
double dVelSecond = 20; //2단계에서의 속도
double dVelThird = 10; //3단계에서의 속도
double dvelLast = 10; // index검색 및 정밀하게 검색하기 위한 속도 (Offset 값 이동 시 적용)
double dAccFirst = 200; //1단계에서의 가속도
double dAccSecond = 40; //2단계에서의 가속도
AxmHomeSetVel(lAxisNo, dVelFirst, dVelSecond, dVelThird, dvelLast, dAccFirst, dAccSecond);

여기서 원점 검색 속도는 1단계에서는 고속으로 하여도 되나, 2단계와 3단계는 정밀한 작업이 이루어지므로 매우 작은 값으로 하여야 한다.
또한 가속도도 1단계는 적당한 가속도를 선택하면 되지만, 2단계는 상당히 큰 값을 설정하는 것이 바람직하다. 때로는 기구부의 상태에 따라 위에서 제공하는 원점 검색 시퀀스를 사용할 수 없는 경우가 있는데, 그럴 때는 신호 검색 구동 함수를 이용하여 자신의 기구부에 맞는 원점 검색 시퀀스를 작성하여 사용해야 한다.

  • 원점 검색 진행률 확인

원점 검색 실행 시 원점 검색 진행률을 확인할 수 있다.
진행률은 AxmHomeGetRate 함수를 이용하여 확인하며, 특정 단계를 넘어가면 값이 증가하고, 0에서 시작하여 100이되면 원점 검색이 종료되었음을 의미한다.

//0축의 홈 검색 진행률을 확인한다.
long lAxisNo = 0;
DWORD uHomeMainStepNumber, uHomeStepNumber;
AxmHomeGetRate(lAxisNo, &uHomeMainStepNumber , &uHomeStepNumber);
printf(현재 진행률 : %d , uHomeStepNumber);
// uHomeMainStepNumber은 겐트리일 경우 마스터,슬레이브가 동작하는지 확인할 때 이용한다.
// 마스터 축 동작일때는 0을 리턴, 슬레이브 동작일 때는 10을 리턴한다.
  • 원점 검색 완료 확인

사용자가 원점 검색 함수를 실행하면 라이브러리 내부에서는 새로운 스레드를 만들어 원점 검색을 실행하게 되고, 원점 검색이 끝나면 원점 검색의 결과를 리턴한다.
원점 검색의 결과를 확인하기 위해서는 AxmHomeGetResult 함수를 사용하며 아래와 같이 사용할 수 있다.

//원점 검색의 결과를 반환한다.
long lAxisNo = 0;
DWORD uHomeResult;
AxmHomeGetResult(lAxisNo, &uHomeResult);
정의 설명
HOME_ERR_UNKNOWN 알 수 없는 축 번호로 원점 검색을 시작하려 할 때
HOME_ERR_GNT_RANGE 겐트리 구동 축의 Master 축과 Slave 축의 원점 검색 결과가 설정한 OffsetRange를 벗어났을 경우
HOME_ERR_USER_BREAK 원점 검색 중 사용자가 정지 명령을 실행했을 경우
HOME_ERR_VELOCITY 원점 검색 속도 설정이 되어있지 않을 경우
HOME_ERR_AMP_FAULT 원점 검색 중 서보팩 알람이 발생 할 경우
HOME_ERR_NEG_LIMIT (+)방향으로 원점 센서 검출 중 (-)리미트 센서가 감지될 경우
HOME_ERR_POS_LIMIT (-)방향으로 원점 센서 검출 중 (+)리미트 센서가 감지될 경우
HOME_ERR_NOT_DETECT 원점 센서가 감지되지 않을 경우
HOME_SEARCHING 현재 원점 검색이 진행 중일 경우
HOME_SUCCESS 원점 검색이 성공적으로 종료 됐을 경우

5. 모션 구동 정지

모션 구동의 마무리 단계인 모션의 정지에는 급정지, 감속 정지, 특정 감속도를 통한 정지 방식이 있다.
급정지를 구현할 때에는 AxmMoveEStop, 감속 정지를 구현할 때에는 AxmMoveSStop, 특정 감속도를 통한 정지를 할 때는 AxmMoveStop 함수를 각각 사용하여 모션을 정지시킨다.
특히 AxmMoveStop 은 감속도를 설정하도록 되어 있는데, 이 함수가 호출되면 기존의 입력된 감속도는 무효가 되고 새로 입력되는 감속도로 감속 정지하게 된다.
이 감속도를 0으로 하면 AxmMoveEStop, 원래의 감속도로 설정하면 AxmMoveSStop 과 같은 기능이 된다.

// 0축에서 모션 구동을 급정지한다.
long lAxisNo = 0;
AxmMoveEStop(lAxisNo);
// 0축에서 모션 구동을 감속 정지한다.
long lAxisNo = 0;
AxmMoveSStop(lAxisNo);
// 0축에서 모션 구동을 100의 감속도로 정지한다.
long lAxisNo = 0;
double dMaxDecel = 100;
AxmMoveStop(lAxisNo, dMaxDecel);
// Ex8_AXM_HomeSearchDrive.cpp : Defines the entry point for the console application.
//원점 검색 함수를 이용하여 원점 검색을 한다.
#include "stdafx.h"
#include "AXL.h"
#include <conio.h>
#include "stdio.h"
#define AXIS_0 0

void main(void)
{
    // 라이브러리를초기화한다.
    // 7은 IRQ를뜻한다. PCI에서 자동으로 IRQ가 설정된다.
    DWORD Code = AxlOpen(7);
    if (Code == AXT_RT_SUCCESS)
    {
        printf("라이브러리가 초기화되었다.\n");
        //모션 모듈이 있는지 검사
        DWORD uStatus;
        Code = AxmInfoIsMotionModule(&uStatus);
        if(Code == AXT_RT_SUCCESS)
        {
            if(uStatus == STATUS_EXIST)
            {
                printf("모션모듈이존재한다.\n");
                // 0축의 +End limit과 -End limit의 Active level을 HIGH로 설정한다.
                AxmSignalSetLimit(AXIS_0, 0, HIGH, HIGH);
                // 0축의 Inpositon 신호 입력 레벨을 HIGH로 설정한다.
                AxmSignalSetInpos(AXIS_0, HIGH);
                // 0축의 알람 신호 입력 레벨을 LOW로 설정한다.
                AxmSignalSetServoAlarm(AXIS_0, LOW);
                // 0축의 비상 정지 신호(ESTOP)의 Active 입력 레벨을 HIGH로 설정한다.
                AxmSignalSetStop(AXIS_0, 0, HIGH);
                //0축 지령 값을 mm단위가 되도록한다.
                AxmMotSetMoveUnitPerPulse(AXIS_0, 10, 10000);
                //0축에 초기 속도를 1로 설정한다. Default : 1
                AxmMotSetMinVel(AXIS_0, 1);
                //0축의 펄스 출력 방식을 TwoCwCcwHigh로 한다.
                AxmMotSetPulseOutMethod(AXIS_0, TwoCcwCwHigh);
                //지정 축에 Encoder 입력 방식을 4체배로 설정한다.
                AxmMotSetEncInputMethod(AXIS_0, ObverseSqr4Mode);
                //Servo On
                AxmSignalServoOn(AXIS_0, ENABLE);

                // 원점 검색 방법을 설정
                long lAxisNo = 0; //원점 검색이 이루어질 축 번호
                long nHmDir = 0; //원점 검색 1단계의 이동 방향, (-)방향을 입력
                DWORD uHomeSignal = HomeSensor; //신호 검색 구동에서의 신호들을 사용
                DWORD uZphas = 1; //Z상 검출 유무, 1이면 검출하고, 0이면 안 함
                double dHomeClrTime = 2000.0; //원점 검색 Enc 값 Set하기 위한 대기 시간
                double dHomeOffset = 0.0; //원점 검색 후 Offset 값만큼 추가적으로 이동
                AxmHomeSetMethod(AXIS_0,nHmDir,uHomeSignal,uZphas,dHomeClrTime,dHomeOffset);

                // 원점 검색시 사용될 속도를 설정
                double dVelFirst = 100; //1단계에서의 속도
                double dVelSecond = 20; //2단계에서의 속도
                double dVelThird = 10; //3단계에서의 속도
                double dvelLast = 10; // index검색 및 정밀하게 검색하기 위한 속도
                double dAccFirst = 200; //1단계에서의 가속도
                double dAccSecond = 40; //2단계에서의 가속도
                AxmHomeSetVel(AXIS_0, dVelFirst, dVelSecond, dVelThird, dvelLast, dAccFirst,dAccSecond);
                // help Message
                printf("[INFORMATION]*************** \n");
                printf("[ESC] : Exit \n");
                printf("[1] : 원점 검색 시작\n");
                printf("[2] : 원점 검색 종료\n");
                printf("**************************** \n");
                DWORD uHomeResult;
                DWORD uHomeMainStepNumber , uHomeStepNumber;
                BOOL fExit = FALSE;
                while (!fExit) // 무한 루프
                {
                    if (kbhit()) // 아무 키나 누르면
                    {
                        int ch = getch();
                        switch (ch)
                        {
                            case 27: // Esc key
                            fExit = TRUE;
                            AxmSignalServoOn(AXIS_0, DISABLE); //Servo Off
                            break;
                            case '1':// 0축에 원점 검색 중이 아니라면, 원점 검색을 시작한다.
                            AxmHomeGetResult(AXIS_0, &uHomeResult);
                            if(uHomeResult) //원점 검색 진행 중 : 0, 원점 검색 완료 : 1
                            {
                            AxmHomeSetStart(AXIS_0);
                            printf("\n원점 검색을 시작한다.\n");
                            }
                            break;
                            case '2': //0축에 원점 검색 진행 중이라면, 원점 검색을 종료시킨다.
                            AxmHomeGetResult(AXIS_0, &uHomeResult);
                            if(uHomeResult == HOME_SEARCHING)//원점 검색 진행 중 : 0
                            {
                            AxmMoveSStop(AXIS_0);
                            printf("\n원점 검색을 종료한다.\n");
                            }
                            break;
                        }
                    }
                    //현재 원점 검색 진행률을 확인
                    AxmHomeGetRate(AXIS_0, &uHomeMainStepNumber,&uHomeStepNumber);
                    printf("\r 원점 검색 진행률 : %d ", uHomeStepNumber);
                } //End of While()
            }
            else
                printf ("AxmInfoIsMotionModule() : ERROR ( NOT STATUS_EXIST ) code 0x%x\n",Code);
        }
        else
            printf ("AxmInfoIsMotionModule() : ERROR ( Return FALSE ) code 0x%x\n",Code);
    }
    else
        printf ("AxlOpen() : ERROR code 0x%x\n",Code);

    // 라이브러리를 종료한다.
    if (AxlClose())
        printf("\n라이브러리가 종료되었다.\n");
    else
        printf("\n라이브러리가 정상적으로 종료되지 않았다.\n");
}

6. 모션 구동 상태 확인

모션 구동을 하면 모션 제어기로부터 위치 정보가 모터 드라이브로 전달되며, 기구부가 지령된 거리 만큼 움직인다.
이러한 모션 구동에서 현재의 위치나 속도, 구동 상태, 정지 원인 등의 정보를 확인하는 것을 구동 및 정지 상태 모니터링이라한다.

현재 위치 및 지령 위치 확인

모션 제어기에서 현재 얼마만큼의 이동을 명령하고 있는지, 모터의 엔코더에서 피드백 된 실제 기구부의
이동거리는 얼마인지 등을 확인할 수 있다. 특정 축의 Actual 위치를 확인할 때에는 AxmStatusGetActPos 함수를 사용하고 사용 예는 아래와 같다.

//0축의 현재 위치를 확인한다.
long lAxisNo = 0;
double dPosition;
AxmStatusGetActPos(lAxisNo, &dPosition);
printf(0축의 실제 위치 : %f, dPosition);

Command 위치를 확인할 때에는 AxmStatusGetCmdPos 함수를 사용하고 예는 아래와 같다

//0축의 지령 위치를 확인한다.
long lAxisNo = 0;
double dPosition;
AxmStatusGetCmdPos(lAxisNo, &dPosition);
printf(0축의지령위치 : %f, dPosition);

Command 위치와 Actual 위치의 차이 값을 확인할 때에는 AxmStatusReadPosError 함수를 사용하고 예는 아래와 같다.

//0축의 지령 위치와 실제 위치의 차이를 확인한다.
long lAxisNo = 0;
double dError;
AxmStatusReadPosError(lAxisNo, &dError);
printf(0축의 지령 위치와 실제 위치의  : %f, dError);

현재 속도 확인

속도 확인은 기구부의 현재 구동 속도를 얻어오는 것을 뜻한다. 현재 구동 속도를 확인할 때에는 AxmStatusReadVel 함수를 사용하고 예는 아래와 같이 한다.

//0축의 현재 속도를 확인한다.
long lAxisNo = 0;
double dVelocity;
AxmStatusReadVel(lAxisNo, &dVelocity);
printf(0축의 현재 속도 : %f, dVelocity);

모션 구동 여부 확인

지정 축의 펄스 출력 상태를 확인하는 것으로, 간단히 말하자면 기구부가 움직이고 있는지 구동이 끝났는지
를 확인하는 것을 뜻한다. 특정 축이 움직이고 있는지를 확인할 때에는 AxmStatusReadInMotion 함수를 사용 한다.

//0축이 구동을 하고 있는지를 확인한다.
long lAxisNo = 0;
DWORD uStatus;
AxmStatusReadInMotion(lAxisNo, &uStatus);

구동 상태 정보 확인

지정 축의 DriveStatus 레지스터를 확인함으로써 특정 축의 구동 상태를 읽어올 수 있다.
특정 축의 구동상태를 확인하기 위해서는 AxmStatusReadMotion 함수를 사용한다.

//0축의 구동 상태를 읽어온다.
long lAxisNo = 0;
DWORD uStatus;
AxmStatusReadMotion(lAxisNo, &uStatus);

AxmStatusReadMotion 함수는 여기서 언급하는 정보 외에도 각각 보다 세부적인 정보를 추가적으로 확인할 수 있으므로 해당 칩의 매뉴얼을 참조하기 바란다. 특히, 많이 사용하는 값은 다음과 같다.

  • 주로 사용되는 Drive Status
정의 설명
QIDRIVE_STATUS_0 BUSY (DRIVE 중)
QIDRIVE_STATUS_1 DOWN (감속 DRIVE 중)
QIDRIVE_STATUS_2 CONST (정속 DRIVE 중)
QIDRIVE_STATUS_3 Up (가속 DRIVE 중)
QIDRIVE_STATUS_4 연속 드라이브 구동 중
QIDRIVE_STATUS_5 지정 거리 드라이브 구동 중
QIDRIVE_STATUS_6 MPG 드라이브 구동 중

정지 상태 정보 확인

지정 축의 EndStatus 레지스터를 확인함으로써 특정축의 종료상태를 확인할 수 있다.
특정 축의 종료 상태를 확인하기 위해서는 AxmStatusReadStop 함수를 사용한다.

//0축의 종료 상태를 확인한다.
long lAxisNo = 0;
DWORD uStatus;
AxmStatusReadStop(lAxisNo, &uStatus);

AxmStatusReadStop 함수는 라이브러리 매뉴얼에서 살펴볼 수 있듯이 여러 가지의 정지 상태를 반환하므로, 현재 어떤 이유로 정지되었는지를 확인할 수 있는데, 0을 반환했다면, 정상적으로 구동을 종료했다는 의미이고, 0이 아닌 값을 반환한다면 해당하는 종료원인에 의해 종료되었다고 볼 수 있다.
주로 사용하는 값은 다음과 같다.

  • 주로 사용되는 End Status
정의 설명
QIEND_STATUS_0 정방향 리미트 신호(PELM)에 의한 종료
QIEND_STATUS_1 역방향 리미트 신호(NELM)에 의한 종료
QIEND_STATUS_4 정방향 소프트 리미트 급정지 기능에 의한 구동 종료
QIEND_STATUS_5 역방향 소프트 리미트 급정지 기능에 의한 구동 종료
QIEND_STATUS_6 정방향 소프트 리미트 감속 정지 기능에 의한 구동 종료
QIEND_STATUS_7 역방향 소프트 리미트 감속 정지 기능에 의한 구동 종료
QIEND_STATUS_8 서보 알람 기능에 의한 구동 종료
QIEND_STATUS_9 비상 정지 신호 입력에 의한 구동 종료
QIEND_STATUS_10 급정지 명령에 의한 구동 종료
QIEND_STATUS_11 감속 정지 명령에 의한 구동 종료

서보 Alarm Code 및 서보 Alarm History 확인

네트워크 타입 서보 드라이브(PCI-R1604를 사용하는 A4N 서보, PCI-R1604-MLII 를 사용하는 SGDV 서보)는 세부적인 알람 내용 및 알람 내역을 읽어볼 수 있다. 알람 코드에 대한 정의 파일이 제공되며, 지정한 축의 알람 코드를 읽어 알람 코드의 내용을 사용자 프로그램에서 사용할 수 있다.
현재 발생한 알람 코드를 확인하기 위해서는 먼저 알람 코드에 대한 요청(AxmStatusRequestServoAlarm)을 하여야 한다.
이후 알람 코드 요청 결과는 AxmStatusReadServoAlarm로 받아 볼 수 있으며, 알람 코드의 해석에는 AxmStatusGetServoAlarmString 를 사용한다.
또한 알람 내역을 확인하기 위해서는 알람 내역 요청(AxmStatusRequestServoAlarmHistory)을 하고, 이후 알람 내역을 AxmStatusReadServoAlarmHistory 로 받아 본다.
알람 내역의 해석은 AxmStatusGetServoAlarmString 를 사용한다.
현재 서보 드라이버에 저장된 알람 내역을 지우기 위해서는 AxmStatusClearServoAlarmHistory 를 사용한다.

// 0축의 알람 코드를 확인한다.(Imidiate : 0, Blocking : 1, Non Blocking :2 );
long lAxisNo = 0;
DWORD uAlarmCode;
DWORD uReturn;
char strAlarm[1025] = "";

AxmStatusRequestServoAlarm(lAxisNo);
if(uReturn == AXT_RT_SUCCESS)
{
    uReturn = AxmStatusRequestServoAlarm(lAxisNo, 1, &uAlarmCode);
    if (uReturn == AXT_RT_SUCCESS)
    {
        AxmStatusGetServoAlarmString(lAxisNo, uAlarmCode, 1024, strAlarm);
        printf("알람코드[0x%X] : %s\n", uAlarmCode, strAlarm);
    }
}
// Ex9_AXM_MotionStatus1.cpp : Defines the entry point for the console application.
// 상대 위치 구동 함수를 이용하여 200만큼 (+)방향으로 이동하면서 이동 거리 및 속도를 확인
#include "stdafx.h"
#include "AXL.h"
#include <conio.h>
#include "stdio.h"

#define AXIS_0 0

void main(void)
{
    // 라이브러리를 초기화한다.
    // 7은 IRQ를 뜻한다. PCI에서 자동으로 IRQ가 설정된다.
    DWORD Code = AxlOpen(7);
    if (Code == AXT_RT_SUCCESS)
    {
        printf("라이브러리가 초기화되었습니다.\n");

        //모션 모듈이 있는지 검사
        DWORD uStatus;
        Code = AxmInfoIsMotionModule(&uStatus);
        if(Code == AXT_RT_SUCCESS)
        {
            if(uStatus == STATUS_EXIST)
            {
                printf("모션 모듈이 존재합니다.\n");
                // 0축의 +End limit 과 -End limit 의 Active level 을 HIGH로 설정한다.
                AxmSignalSetLimit(AXIS_0, 0, HIGH, HIGH);
                // 0축의 Inpositon 신호의 입력 레벨을 HIGH로 설정한다.
                AxmSignalSetInpos(AXIS_0, HIGH);
                // 0축의 알람 신호의 입력 레벨을 LOW로 설정한다.
                AxmSignalSetServoAlarm(AXIS_0, LOW);
                // 0축의 비상 정지 신호(ESTOP)의 Active 입력 레벨을 HIGH로 설정한다.
                AxmSignalSetStop(AXIS_0, 0, HIGH);
                //0축 지령 값을 mm단위가 되도록 한다.
                AxmMotSetMoveUnitPerPulse(AXIS_0, 10, 10000);
                //0축의 초기 속도를 1로 설정한다. Default : 1
                AxmMotSetMinVel(AXIS_0, 1);
                //0축의 펄스 출력 방식을 TwoCwCcwHigh로 한다.
                AxmMotSetPulseOutMethod(AXIS_0, TwoCcwCwHigh);
                //지정 축에 Encoder 입력 방식을 4체배로 설정한다.
                AxmMotSetEncInputMethod(AXIS_0, ObverseSqr4Mode);
                AxmMotSetAbsRelMode(AXIS_0, 0); //절대 위치 구동
                AxmMotSetProfileMode(AXIS_0, 3); //대칭 S자 구동
                // 원점 검색 방법을 설정
                AxmHomeSetMethod(AXIS_0,-1,HomeSensor,1,2000.0,0.0);
                // 원점 검색 시 사용될 속도를 설정
                AxmHomeSetVel(AXIS_0, 100, 20, 10, 10, 200, 40);
                //Servo On
                AxmSignalServoOn(AXIS_0, ENABLE);
                //원점을 검색한다.
                printf("아무키나누르면원점검색을시작합니다.\n");
                getch();
                AxmHomeSetStart(AXIS_0);

                //현재 원점 검색 진행률을 확인
                DWORD uHomeMainStepNumber , uHomeStepNumber;
                DWORD uHomeResult;
                AxmHomeGetResult(AXIS_0, &uHomeResult);

                while(!uHomeResult)
                {
                    AxmHomeGetResult(AXIS_0, &uHomeResult);
                    AxmHomeGetRate(AXIS_0,&uHomeMainStepNumber , &uHomeStepNumber);
                    printf("\r 원점 검색 중 . . . %d % ", uHomeStepNumber);
                }

                printf("\n[INFORMATION]***************************** \n");
                printf("AP : Actual Position \n");
                printf("CP : Command Position \n");
                printf("Error : Actual Position - Command Position \n");
                printf("CV : Command Velocity \n");
                printf("****************************************** \n");
                printf("0축을 S자 속도 프로파일로 (+)방향 200만큼 이동(속도:100, 가속도:200, 시점 탈출)\n");
                printf("아무 키나 누르면 구동을 시작합니다.");
                getch();
                AxmMoveStartPos(AXIS_0, 200, 100, 200, 200);

                // 구동되고 있는 동안 구동 상태를 확인한다.
                DWORD uStatus;
                double dActualPosition, dCommandPosition, dError, dVelocity;
                AxmStatusReadInMotion( AXIS_0, &uStatus);

                while(uStatus)
                {
                    AxmStatusReadInMotion( AXIS_0, &uStatus);
                    AxmStatusGetActPos(AXIS_0, & dActualPosition); //0축의 현재 위치를 확인.
                    AxmStatusGetCmdPos(AXIS_0, & dCommandPosition);
                    //0축의 지령 위치를 확인.
                    AxmStatusReadPosError(AXIS_0, & dError);
                    //0축의 지령 위치와 실제 위치의 차이를 확인.
                    AxmStatusReadVel(AXIS_0, & dVelocity); //0축의 현재 속도를 확인.
                    printf("\rAP:%.1f, CP:%.1f, Error:%.1f, CV:%.1f ", dActualPosition, dCommandPosition,
                    dError, dVelocity );
                } //End of While()

                printf("\n구동을완료하였습니다.\n");
                AxmSignalServoOn(AXIS_0, DISABLE); //Servo Off
            }
            else
            printf ("AxmInfoIsMotionModule() : ERROR ( NOT STATUS_EXIST ) code 0x%x\n",Code)
        }
        else
            printf ("AxmInfoIsMotionModule() : ERROR ( Return FALSE ) code 0x%x\n",Code);
    }
    else
        printf ("AxlOpen() : ERROR code 0x%x\n",Code);

    // 라이브러리를 종료한다.
    if (AxlClose())
        printf("\n라이브러리가 종료되었습니다.\n");
    else
        printf("\n라이브러리가 정상적으로 종료되지 않았습니다.\n");
}

7. 단축 구동 함수

AxmMovePos

Purpose

지정 축의 설정된 위치까지 설정된 속도와 가속율로 구동을 한다.
모션 구동이 완료된 후에 함수를 벗어난다.

A Serviceable Product

BPHR / BPFR BEHR / BEFR PCI-Nx04 PCIe-Nx04
O O O O
PCI-Rxx04 PCIe-Rxx04-RTEX PCI-Rxx04-MLII PCI-Rxx00-MLIII
A4N A5N/A6N PM A4N A5N/A6N PM SGDV SGDV SGD7 PM
O O O O O O O O O O
PCI-Rxx04-SIIIH PCIe-Rxx04-SIIIH PCIe-Rxx05-MLIII PCIe-RxxIF-ECAT
MR-J4-B PM MR-J4-B PM SGDV SGD7 PM Servo PM
O O O O O O O O O
PCIe-Rxx05-ECAT PCIe-Rxx05-ECAT-E
Servo PM Servo PM
O O O O

Format

C++
DWORD AxmMovePos(long lAxisNo, double dPos, double dVel, double dAccel, double dDecel);
C#
uint AxmMovePos(int lAxisNo, double dPos, double dVel, double dAccel, double dDecel);

Parameters

[in/out] Name [Init Value] Explanation
[in] lAxisNo 채널(축) 번호(0 ~ (최대 축 수 - 1))
[in] dPos 구동 거리
[in] dVel 속도
[in] dAccel 가속도 (가속도의 단위는 Unit/pulse를 1/1로 한 경우에 PPS[Pulses/sec^2])
[in] dDecel 감속도 (감속도의 단위는 Unit/pulse를 1/1로 한 경우에 PPS[Pulses/sec^2])

Return Values

[0000] AXT_RT_SUCCESS: 함수 실행 성공
[4154] AXT_RT_MOTION_ERROR_GANTRY_ENABLE: Gantry Slave 축에 Move 명령이 내려졌을 때
[4201] AXT_RT_MOTION_HOME_SEARCHING: 홈을 찾고있는 중일 때 또는 다른 모션 함수들을 사용할 때
[4255] AXT_RT_MOTION_SETTING_ERROR: 속도, 가속도, 저크, 프로파일 설정이 잘못됨

Description

  • 하나의 축에 대하여 현재의 위치에서 지정한 거리(절대/상대)만큼 이동을 수행한다.
  • AxmMotSetAbsRelMode 함수를 이용하여 절대/상대 모드를 선택하고, AxmMotSetProfileMode 함수를 이용하여 프로파일 모드를 선택한다.
  • 지정 축의 설정된 위치까지 설정된 속도와 가속도로 구동을 한다. 펄스 출력이 종료되는 시점에서 함수를 벗어난다.
  • 함수 시작 후 구동 종료할 때까지 CPU 의 process 를 점유하게 되므로 주의해서 사용해야 한다.
  • AxmStatusReadInMotion 함수에 의해 모션 중인지 확인할 수 없다.
  • 절대 위치 모드인 경우에는 설정한 위치값이 이동할 절대 위치값이 되고, 상대 위치 모드인 경우에는 설정한 위치값은 이동할 거리량이 된다. 예를 들어 위치값을 ‘100’으로 입력한 경우, 절대 위치 모드인 경우는 ‘100’의 위치로 이동하여 정지하게 되며, 상대 위치 모드인 경우는 현재 위치에서 ‘100’ 만큼 이동하게 된다.
  • AxmSignalSetInpos 함수를 사용하는 경우에는 Inposition 입력 신호가 Enable 로 설정되어 있다면 Command 펄스 출력이 완료해도 INP 입력이 ON 되기 전까지는 모션이 완료되지 않은 것으로 간주되어 모션 구동 종료 플래그가 설정되지 않는다.
    (AxmSignalSetInpos 함수 참고)
  • AxmGantrySetEnable 을 이용해서 마스터, 슬레이브를 사용할 경우 슬레이브 축에 명령을 내렸을 경우에는 명령이 무시된다.

예제 코드

C++
// 0축에 절대 좌표로 2000만큼 100의 속도와 200의 가속율로 사다리꼴 구동, 구동이 종료될 때까지
기다렸다가
// 함수를 빠져나온다.
AxmMovePos (0, 2000, 100, 200, 200);

AxmMoveMultiPos

Purpose

여러 개의 축에 대해서 현재의 위치에서 지정한 거리만큼 이동을 동시에 시작한다.
이 함수를 사용하면 여러 개의 축이 동시에 작업을 시작한다. 이 함수는 여러 축이 동기를 맞추어 작업을 시작해야하는 경우에 사용한다.
펄스 출력이 종료되는 시점에서 함수를 벗어난다. 동시 구동에 사용할 축은 별도의 케이블 연결없이 같은 보드 내의 축들로 구성되어야 하며, 보드 간 축들의 동기 제어는 동기 신호 전용 케이블을 연결해야 한다.

A Serviceable Product

BPHR / BPFR BEHR / BEFR PCI-Nx04 PCIe-Nx04
O O O O
PCI-Rxx04 PCIe-Rxx04-RTEX PCI-Rxx04-MLII PCI-Rxx00-MLIII
A4N A5N/A6N PM A4N A5N/A6N PM SGDV SGDV SGD7 PM
O O O O O O O O O O
PCI-Rxx04-SIIIH PCIe-Rxx04-SIIIH PCIe-Rxx05-MLIII PCIe-RxxIF-ECAT
MR-J4-B PM MR-J4-B PM SGDV SGD7 PM Servo PM
O O O O O O O O O
PCIe-Rxx05-ECAT PCIe-Rxx05-ECAT-E
Servo PM Servo PM
O O O O

Format

C++
DWORD AxmMoveMultiPos(long lArraySize, long *lpAxesNo, double *dpPos, double *dpVel, double *dpAccel, double *dpDecel);
C#
uint AxmMoveMultiPos(int lArraySize, int[] lpAxesNo, double[] dpPos, double[] dpVel, double[] dpAccel, double[] dpDecel);

Parameters

[in/out] Name [Init Value] Explanation
[in] lArraySize 축 사이즈
[in] lpAxesNo 채널(축) 번호(0 ~ (최대 축 수 - 1)) 배열
[in] dpPos 구동 거리 배열
[in] dpVel 속도 배열
[in] dpAccel 가속도 (가속도의 단위는 Unit/pulse를 1/1로 한 경우에 PPS[Pulses/sec^2]) 배열
[in] dpDecel 감속도 (감속도의 단위는 Unit/pulse를 1/1로 한 경우에 PPS[Pulses/sec^2]) 배열

Return Values

[0000] AXT_RT_SUCCESS : 함수 실행 성공
[4154] AXT_RT_MOTION_ERROR_GANTRY_ENABLE : Gantry Slave 축에 Move 명령이 내려졌을 때
[4201] AXT_RT_MOTION_HOME_SEARCHING : 홈을 찾고있는 중일 때 다른 모션 함수들을 사용할 때
[4255] AXT_RT_MOTION_SETTING_ERROR : 속도, 가속도, 저크, 프로파일 설정이 잘못됨

Description

  • 다축에 대하여 현재의 위치에서 지정한 거리(절대/상대) 만큼 이동을 수행한다.
  • AxmMotSetAbsRelMode 함수를 이용하여 각 축의 절대/상대 좌표계를 선택하고 AxmMotSetProfileMode 함수를 이용하여 각각의 프로파일을 설정한다.
  • 지정 축의 설정된 위치까지 설정된 속도와 가속도로 구동을 한다.
  • 펄스 출력이 종료되는 시점에서 함수를 벗어난다.
  • 함수 시작 후 구동을 종료할 때까지 CPU 의 process 를 점유하게 되므로 주의해서 사용하여야 한다.
  • AxmStatusReadInMotion 함수에 의해 모션 중인지 확인할 수 없다.
  • 절대 위치 모드인 경우에는 설정한 위치값이 이동할 절대 위치값이 되고, 상대 위치 모드인 경우에는 설정한 위치값은 이동할 거리량이 된다.
    예를 들어 위치값을 ‘100’으로 입력한 경우, 절대 위치 모드인 경우에는 ‘100’의 위치로 이동하여 정지하게 되며, 상대 위치 모드인 경우에는 현재 위치에서 ‘100’ 만큼 이동하게 된다.
  • AxmStatusReadInMotion 함수에 의해 모션 중인지 확인할 수 있다.
  • AxmSignalSetInpos 함수를 사용하는 경우에는 Inposition 입력 신호가 Enable 로 설정되어 있다면 Command 펄스 출력이 완료되어도 INP 입력이 ON 되기 전까지는 모션이 완료되지 않은 것으로 간주되어 반환되지 않는다.
    (AxmSignalSetInpos 함수 참고)

예제 코드

C++
// 절대 좌표로 2000만큼 100의 속도와 200의 가속율로 사다리꼴 구동, 구동이 시작되면 함수를 빠져 나온다.
long lAxis[2];
double dPos[2], dVel[2], dAccel[2];

for( int i=0; i<2; i++)
{
    AxmMotSetProfileMode(i, 3);
    AxmMotSetAbsRelMode(i, 1);
    lAxis[i] = i;
    dPos[i] = 2000;
    dVel[i] = 100;
    dAccel[i] = 200;
}

AxmMoveMultiPos (2, lAxis, dPos, dVel, dAccel, dAccel);

AxmMoveStartPos

Purpose

지정 축의 설정된 위치까지 설정된 속도와 가속율로 구동을 한다.
펄스 출력이 시작되는 시점에서 함수를 벗어난다.

A Serviceable Product

BPHR / BPFR BEHR / BEFR PCI-Nx04 PCIe-Nx04
O O O O
PCI-Rxx04 PCIe-Rxx04-RTEX PCI-Rxx04-MLII PCI-Rxx00-MLIII
A4N A5N/A6N PM A4N A5N/A6N PM SGDV SGDV SGD7 PM
O O O O O O O O O O
PCI-Rxx04-SIIIH PCIe-Rxx04-SIIIH PCIe-Rxx05-MLIII PCIe-RxxIF-ECAT
MR-J4-B PM MR-J4-B PM SGDV SGD7 PM Servo PM
O O O O O O O O O
PCIe-Rxx05-ECAT PCIe-Rxx05-ECAT-E
Servo PM Servo PM
O O O O

Format

C++
DWORD AxmMoveStartPos(long lAxisNo, double dPos, double dVel, double dAccel, double dDecel);
C#
uint AxmMoveStartPos(int lAxisNo, double dPos, double dVel, double dAccel, double dDecel);

Parameters

[in/out] Name [Init Value] Explanation
[in] lAxisNo 채널(축) 번호(0 ~ (최대 축 수 - 1))
[in] dPos 구동 거리
[in] dVel 속도
[in] dAccel 가속도 (가속도의 단위는 Unit/pulse를 1/1로 한 경우에 PPS[Pulses/sec^2])
[in] dDecel 감속도 (감속도의 단위는 Unit/pulse를 1/1로 한 경우에 PPS[Pulses/sec^2])

Return Values

[0000] AXT_RT_SUCCESS : 함수 실행 성공
[4154] AXT_RT_MOTION_ERROR_GANTRY_ENABLE : Gantry Slave 축에 Move 명령이 내려졌을 때
[4201] AXT_RT_MOTION_HOME_SEARCHING : 홈을 찾고있는 중일 때 또는 다른 모션 함수들을 사용할 때
[4255] AXT_RT_MOTION_SETTING_ERROR : 속도, 가속도, 저크, 프로파일 설정이 잘못됨

Description

  • 하나의 축에 대하여 현재의 위치에서 지정한 거리(절대/상대) 만큼 이동을 수행한다.
  • AxmMotSetAbsRelMode 함수를 이용하여 절대/상대 모드를 선택하고 AxmMotSetProfileMode 함수를 이용하여 프로파일을 선택한다.
  • 절대 위치 모드인 경우에는 설정한 위치값이 이동할 절대 위치값이 되고, 상대 위치 모드인 경우에는 설정한 위치값은 이동할 거리량이 된다.
    예를 들어 위치값을 ‘100’으로 입력한 경우, 절대 위치 모드인 경우에는 ‘100’의 위치로 이동하여 정지하게 되며, 상대 위치 모드인 경우는 현재 위치에서 ‘100’만큼 이동하게 된다.
  • AxmStatusReadInMotion 함수에 의해 모션 중인지 확인할 수 있다.
  • AxmSignalSetInpos 함수를 사용하는 경우에는 Inposition 입력 신호가 Enable 로 설정되어 있다면 Command 펄스 출력이 완료되어도 INP 입력이 ON 되기 전까지 모션이 완료되지 않은 것으로 간주되어 반환되지 않는다. 이 내용은 AxmSignalSetInpos 함수를 참고하기 바란다.
  • AxmGantrySetEnable 을 이용하여 마스터, 슬레이브를 사용할 경우 슬레이브 축에 명령을 내렸을 경우에는 명령이 무시된다.

Single-Move

  • 속도의 이해
    속도 = 거리의 변화 / 시간의 변화
    거리 = 속도 x 시간

속도는 시간의 변화에 대한 거리의 변화 비율이므로, 속도의 단위는 mm/s와 같은 것을 이용한다.
여기서는 mm는 이동거리 밀리미터를 나타내고, s는 시간 초를 나타낸다.
따라서 속도가 2 mm/s라고 하면 시간이 1초 변할 때, 거리는 2mm가 변한다는 의미다.

Single-Move

  • 가속도 (가속도의 단위는 Unit/pulse 를 1/1 로 한 경우에 PPS[Pulses/sec])의 이해

가속도가 0이라면 속도의 변화가 없다는 것을 의미한다.
즉 일정한 속도로 움직이게 된다. 가속의 단위는 mm/s2 을 사용한다.
여기서는 mm는 이동거리 밀리미터를 나타내고, s2는 시간의 제곱이다.

가속도 = 속도의 변화 / 시간의 변화

예제 코드

C++
// 0축에 절대 좌표로 2000 만큼 100의 속도와 200의 가속율로 사다리꼴 구동, 구동이 시작되면 함 수를 빠져 나온다.
AxmMoveStartPos(0, 2000, 100, 200, 200);

AxmMoveStartMultiPos

Purpose

여러 개의 축에 대하여 현재의 위치에서 지정한 거리만큼 이동을 동시에 시작한다. 이 함수를 사용하면 여러 개의 축이 동시에 작업을 시작한다. 이 함수는 여러 축이 동기를 맞추어 작업을 시작해야하는 경우에 사용한다. 펄스 출력이 시작되는 시점에서 함수를 벗어난다.

A Serviceable Product

BPHR / BPFR BEHR / BEFR PCI-Nx04 PCIe-Nx04
O O O O
PCI-Rxx04 PCIe-Rxx04-RTEX PCI-Rxx04-MLII PCI-Rxx00-MLIII
A4N A5N/A6N PM A4N A5N/A6N PM SGDV SGDV SGD7 PM
O O O O O O O O O O
PCI-Rxx04-SIIIH PCIe-Rxx04-SIIIH PCIe-Rxx05-MLIII PCIe-RxxIF-ECAT
MR-J4-B PM MR-J4-B PM SGDV SGD7 PM Servo PM
O O O O O O O O O
PCIe-Rxx05-ECAT PCIe-Rxx05-ECAT-E
Servo PM Servo PM
O O O O

Format

C++
DWORD AxmMoveStartMultiPos(long lArraySize, long *lpAxisNo, double *dpPos, double *dpVel, double *dpAccel, double *dpDecel);
C#
uint AxmMoveStartMultiPos(int lArraySize, int[] lpAxisNo, double[] dpPos, double[] dpVel, double[] dpAccel, double[] dpDecel);

Parameters

[in/out] Name [Init Value] Explanation
[in] lArraySize 축 사이즈
[in] lpAxisNo 채널(축) 번호(0 ~ (최대 축 수 - 1)) 배열
[in] dpPos 구동 거리 배열
[in] dpVel 속도 배열
[in] dpAccel 가속도 (가속도의 단위는 Unit/pulse를 1/1로 한 경우에 PPS[Pulses/sec^2]) 배열
[in] dpDecel 감속도 (감속도의 단위는 Unit/pulse를 1/1로 한 경우에 PPS[Pulses/sec^2]) 배열

Return Values

[0000] AXT_RT_SUCCESS : 함수 실행 성공
[4154] AXT_RT_MOTION_ERROR_GANTRY_ENABLE : Gantry Slave 축에 Move 명령이 내려졌을 때
[4201] AXT_RT_MOTION_HOME_SEARCHING : 홈을 찾고있는 중일 때 다른 모션 함수들을 사용할 때
[4255] AXT_RT_MOTION_SETTING_ERROR : 속도, 가속도, 저크, 프로파일 설정이 잘못됨

Description

  • 하나의 축에 대하여 현재의 위치에서 지정한 거리(절대/상대) 만큼 이동을 수행한다.
  • AxmMotSetAbsRelMode 함수를 이용하여 절대/상대 모드를 선택하고 AxmMotSetProfileMode 함수를 이용하여 프로파일을 설정한다.
  • AxmStatusReadInMotion 함수에 의해 모션 중인지 확인할 수 있다.
  • 절대 위치 모드인 경우에는 설정한 위치값이 이동할 절대 위치값이 되고, 상대 위치 모드인 경우는 설정한 위치값은 이동할 거리량이 된다.
    예를 들어, 위치값을 ‘100’으로 입력한 경우 절대 위치 모드인 경우에는 ‘100’의 위치로 이동하여 정지하게 되며, 상대 위치 모드인 경우에는 현재 위치에서 ‘100’ 만큼 이동하게 된다.
  • 다축 동시 제어는 여러 개의 축을 완전한 동기를 맞추어 동시에 제어하는 기능을 말한다.
  • 만일 속도 프로파일을 동일하게 설정하였다면 여러 개의 제어 대상 축이 시작 및 종료 시점은 물론이고 가속/감속 구간까지 완전히 동기를 맞추어 제어될 수 있다.
  • AxmStatusReadInMotion 함수에 의해 모션 중인지 확인할 수 있다.
  • AxmSignalSetInpos 함수를 사용하는 경우에는 Inposition 입력 신호가 Enable 로 설정되어 있다면 Command 펄스 출력이 완료되어도 INP 입력이 ON 되기 전까지는 모션이 완료되지 않은 것으로 간주되어 반환되지 않는다.
    (AxmSignalSetInpos 함수 참고)

예제 코드

C++
// 절대 좌표로 2000만큼 100의 속도와 200의 가속율로 사다리꼴 구동, 구동이 시작되면 함수를 빠져나온다.
long lAxis[2]; double dPos[2], dVel[2], dAccel[2];

for( int i=0; i<2; i++)
{
    AxmMotSetProfileMode(i, 3);
    AxmMotSetAbsRelMode(i, 1);
    lAxis[i] = i;
    dPos[i] = 2000;
    dVel[i] = 100;
    dAccel[i] = 200; 
}

AxmMoveStartMultiPos (2, lAxis, dPos, dVel, dAccel, dAccel);

AxmMoveStartPosWithList

Purpose

지정 축에 대해서 절대/상대 좌표로 설정된 위치까지 설정된 속도, 가속율로 구동을 한다.

A Serviceable Product

BPHR / BPFR BEHR / BEFR PCI-Nx04 PCIe-Nx04
O O O O
PCI-Rxx04 PCIe-Rxx04-RTEX PCI-Rxx04-MLII PCI-Rxx00-MLIII
A4N A5N/A6N PM A4N A5N/A6N PM SGDV SGDV SGD7 PM
PCI-Rxx04-SIIIH PCIe-Rxx04-SIIIH PCIe-Rxx05-MLIII PCIe-RxxIF-ECAT
MR-J4-B PM MR-J4-B PM SGDV SGD7 PM Servo PM
O O O
PCIe-Rxx05-ECAT PCIe-Rxx05-ECAT-E
Servo PM Servo PM

Format

C++
DWORD AxmMoveStartPosWithList(long lAxisNo, double dPosition, double *dpVel, double *dpAccel, double *dpDecel, long lListNum);
C#
uint AxmMoveStartPosWithList(int lAxisNo, double dPosition, double[] dpVel, double[] dpAccel, double[] dpDecel, int lListNum);

Parameters

[in/out] Name [Init Value] Explanation
[in] lpAxisNo 채널(축) 번호(0 ~ (최대 축 수 - 1))
[in] dPosition 구동 거리
[in] dpVel 속도 배열
[in] dpAccel 가속도 (가속도의 단위는 Unit/pulse를 1/1로 한 경우에 PPS[Pulses/sec^2]) 배열
[in] dpDecel 감속도 (감속도의 단위는 Unit/pulse를 1/1로 한 경우에 PPS[Pulses/sec^2]) 배열
[in] lListNum 속도, 가속율을 설정할 리스트 개수

Return Values

[0000] AXT_RT_SUCCESS : 함수 실행 성공
[4154] AXT_RT_MOTION_ERROR_GANTRY_ENABLE : Gantry Slave 축에 Move 명령이 내려졌을 때
[4201] AXT_RT_MOTION_HOME_SEARCHING : 홈을 찾고있는 중일 때 다른 모션 함수들을 사용할 때
[4255] AXT_RT_MOTION_SETTING_ERROR : 속도, 가속도, 저크, 프로파일 설정이 잘못됨

Description

  • 하나의 축에 대하여 현재의 위치에서 지정한 거리(절대/상대) 만큼 이동을 수행한다.
  • 속도 프로파일은 비대칭 사다리꼴로 고정된다.
  • 가감속도 설정 단위는 기울기로 고정된다.
  • dVel[1] == dVel[3]을 반드시 만족해야 하며, dVel[2]로 정속 구동 구간이 발생 할 수 있도록 dPosition 이 충분히 큰 값이어야 정상적으로 구동이 가능하다.
    예를 들어, dPosition 이 10000 일 때
    dVel[0] = 300, dAccel[0] = 200, dDecel[0] = 0; <== 가속
    dVel[1] = 500, dAccel[1] = 100, dDecel[1] = 0; <== 가속
    dVel[2] = 700, dAccel[2] = 200, dDecel[2] = 250; <== 가속, 등속, 감속
    dVel[3] = 500, dAccel[3] = 0, dDecel[3] = 150; <== 감속
    dVel[4] = 200, dAccel[4] = 0, dDecel[4] = 350; <== 감속

    dAccel != 0.0 이고 dDecel == 0.0 일 경우, 이전 속도에서 감속없이 지정 속도까지 가속.
    dAccel != 0.0 이고 dDecel != 0.0 일 경우, 이전 속도에서 지정 속도까지 가속 후 등속 이후 감속.
    dAccel == 0.0 이고 dDecel != 0.0 일 경우, 이전 속도에서 다음 속도까지 감속 이며 펄스가 종료되는 시점에서 함수를 벗어난다.

예제 코드

C++
// 절대 좌표로 10000만큼 100의 속도와 200의 가감속율, 200의 속도와 300의 가감속율로 구동
long lAxis = 0, lListNum = 2;
double dPos = 10000, dVel[2], dAccel[2], dDecel[2];
dVel[0] = 100;
dVel[1] = 200;
dAccel[0] = 200;
dAccel[1] = 300;
dDecel[0] = 200;
dDecel[1] = 300;

AxmMoveStartPosWithList (lAxis, dPos, dVel, dAccel, dDecel, lListNum);

AxmMoveStartPosWithPosEvent

Purpose

설정한 거리만큼 또는 위치까지 대상 축의 위치가 증감할 때 이벤트가 발생한다.

A Serviceable Product

BPHR / BPFR BEHR / BEFR PCI-Nx04 PCIe-Nx04
O O O O
PCI-Rxx04 PCIe-Rxx04-RTEX PCI-Rxx04-MLII PCI-Rxx00-MLIII
A4N A5N/A6N PM A4N A5N/A6N PM SGDV SGDV SGD7 PM
PCI-Rxx04-SIIIH PCIe-Rxx04-SIIIH PCIe-Rxx05-MLIII PCIe-RxxIF-ECAT
MR-J4-B PM MR-J4-B PM SGDV SGD7 PM Servo PM
O O
PCIe-Rxx05-ECAT PCIe-Rxx05-ECAT-E
Servo PM Servo PM
O O O O

Format

C++
DWORD AxmMoveStartPosWithPosEvent(long lAxisNo, double dPos, double dVel, double dAccel, double dDecel, long lEventAxisNo, double dComparePosition, DWORD uPositionSource)
C#
uint AxmMoveStartPosWithPosEvent(int lAxisNo, double dPos, double dVel, double dAccel, double dDecel, int lEventAxisNo, double dComparePosition, uint uPositionSource);

Parameters

[in/out] Name [Init Value] Explanation
[in] lpAxisNo 채널(축) 번호(0 ~ (최대 축 수 - 1))
[in] dPos 구동 거리
[in] dVel 속도 (+방향: 0 이상값 , -방향: 0 이하값)
[in] dAccel 가속도 (가속도의 단위는 Unit/pulse를 1/1로 한 경우에 PPS[Pulses/sec^2])
[in] dDecel 감속도 (감속도의 단위는 Unit/pulse를 1/1로 한 경우에 PPS[Pulses/sec^2])
[in] lEventAxisNo 시작 조건 발생 축
[in] dComparePosition 시작 조건 발생 축의 조건 발생 위치
[in] uPositionSource 시작 조건 발생 축의 조건 발생 위치 기준 선택
[0] COMMAND
[1] ACTUAL

Return Values

[0000] AXT_RT_SUCCESS : 함수 실행 성공
[4154] AXT_RT_MOTION_ERROR_GANTRY_ENABLE : Gantry Slave 축에 Move 명령이 내려졌을 때
[4201] AXT_RT_MOTION_HOME_SEARCHING : 홈을 찾고있는 중일 때 다른 모션 함수들을 사용할 때
[4255] AXT_RT_MOTION_SETTING_ERROR : 속도, 가속도, 저크, 프로파일 설정이 잘못됨

Description

설정한 거리만큼 또는 위치까지 대상 축의 위치가 증감할 때 이동을 시작한다.
예약 후 취소는 AxmMoveStop, AxmMoveEStop, AxmMoveSStop 을 이용하며 이동 축과 시작 조건 발생 축은 4 축 단위 하나의 그룹(2V04 의 경우 같은 모듈)에 존재 하여야 한다.

예제 코드

C++
// 0축을 10000까지 100의 속도로 200의 가감속율로 구동한다. 0축의 Command 지령이 5000에 위치 했을 때 이벤트가 발생한다.
long lAxis = 0;
double dPos = 10000, dVel = 100, dAccel = 200, dDecel = 200;
long lEventAxisNo = 0;
double dComparePosition = 5000;
DWORD uPositionSource = 0;

AxmMoveStartPosWithPosEvent(lAxis, dPos, dVel, dAccel, dDecel, lEventAxisNo, dComparePosition, uPositionSource);

AxmMoveVel

Purpose

지정 축에 설정된 속도로 구동하는 속도 모드 구동 함수이다.
모션 구동이 시작되는 시점에서 함수를 벗어난다.

A Serviceable Product

BPHR / BPFR BEHR / BEFR PCI-Nx04 PCIe-Nx04
O O O O
PCI-Rxx04 PCIe-Rxx04-RTEX PCI-Rxx04-MLII PCI-Rxx00-MLIII
A4N A5N/A6N PM A4N A5N/A6N PM SGDV SGDV SGD7 PM
O O O O O O O O O O
PCI-Rxx04-SIIIH PCIe-Rxx04-SIIIH PCIe-Rxx05-MLIII PCIe-RxxIF-ECAT
MR-J4-B PM MR-J4-B PM SGDV SGD7 PM Servo PM
O O O O O O O O O
PCIe-Rxx05-ECAT PCIe-Rxx05-ECAT-E
Servo PM Servo PM
O O O O

Format

C++
DWORD AxmMoveVel(long lAxisNo, double dVel, double dAccel, double dDecel);
C#
uint AxmMoveVel(int lAxisNo, double dVel, double dAccel, double dDecel);

Parameters

[in/out] Name [Init Value] Explanation
[in] lpAxisNo 채널(축) 번호(0 ~ (최대 축 수 - 1))
[in] dVel 속도(+방향: 0 이상값 , -방향: 0이하값)
[in] dAccel 가속도 (가속도의 단위는 Unit/pulse를 1/1로 한 경우에 PPS[Pulses/sec^2])
[in] dDecel 감속도 (감속도의 단위는 Unit/pulse를 1/1로 한 경우에 PPS[Pulses/sec^2])

Return Values

[0000] AXT_RT_SUCCESS : 함수 실행 성공
[4154] AXT_RT_MOTION_ERROR_GANTRY_ENABLE : Gantry Slave 축에 Move 명령이 내려졌을 때
[4201] AXT_RT_MOTION_HOME_SEARCHING : 홈을 찾고있는 중일 때 다른 모션 함수들을 사용할 때
[4255] AXT_RT_MOTION_SETTING_ERROR : 속도, 가속도, 저크, 프로파일 설정이 잘못됨

Description

목표 속도까지 가속한 후에 속도를 유지하며, 정지 함수 호출 또는 외부 센서 신호에 의해 정지 시킬 수 있으며, 지정한 방향으로의 모션을 계속 수행한다.
AxmStatusReadInMotion 함수에 의해 모션 중인지 확인할 수 있다.
AxmGantrySetEnable 을 이용하여 마스터, 슬레이브를 사용할 경우 또는 슬레이브 축에 명령을 내렸을 경우에는 명령이 무시된다.

예제 코드

C++
// 0축에 절대 좌표로 100의 속도와 200의 가속율로 속도 구동을 한다.
AxmMoveVel(0, 100, 200, 200);

AxmMoveStartMultiVel

Purpose

지정된 다축에 설정된 속도로 구동하는 속도 모드 구동 함수이다.
모션 구동이 시작되는 시점에서 함수를 벗어난다.

A Serviceable Product

BPHR / BPFR BEHR / BEFR PCI-Nx04 PCIe-Nx04
O O O O
PCI-Rxx04 PCIe-Rxx04-RTEX PCI-Rxx04-MLII PCI-Rxx00-MLIII
A4N A5N/A6N PM A4N A5N/A6N PM SGDV SGDV SGD7 PM
O O O O O O O O O O
PCI-Rxx04-SIIIH PCIe-Rxx04-SIIIH PCIe-Rxx05-MLIII PCIe-RxxIF-ECAT
MR-J4-B PM MR-J4-B PM SGDV SGD7 PM Servo PM
O O O O O O O O O
PCIe-Rxx05-ECAT PCIe-Rxx05-ECAT-E
Servo PM Servo PM
O O O O

Format

C++
DWORD AxmMoveStartMultiVel(long lArraySize, long *lpAxisNo, double *dpVel, double *dpAccel, double *dpDecel);
C#
uint AxmMoveStartMultiVel(int lArraySize, int[] lpAxesNo, double[] dpVel, double[] dpAccel, double[] dpDecel);

Parameters

[in/out] Name [Init Value] Explanation
[in] lArraySize 축 사이즈
[in] lpAxisNo 채널(축) 번호(0 ~ (최대 축 수 - 1)) 배열
[in] dpVel 속도(+방향: 0 이상값 , -방향: 0이하값) 배열
[in] dpAccel 가속도 배열 (가속도의 단위는 Unit/pulse를 1/1로 한 경우에 PPS[Pulses/sec^2])
[in] dpDecel 감속도 배열 (감속도의 단위는 Unit/pulse를 1/1로 한 경우에 PPS[Pulses/sec^2])

Return Values

[0000] AXT_RT_SUCCESS : 함수 실행 성공
[4154] AXT_RT_MOTION_ERROR_GANTRY_ENABLE : Gantry Slave 축에 Move 명령이 내려졌을 때
[4201] AXT_RT_MOTION_HOME_SEARCHING : 홈을 찾고있는 중일 때 다른 모션 함수들을 사용할 때
[4255] AXT_RT_MOTION_SETTING_ERROR : 속도, 가속도, 저크, 프로파일 설정이 잘못됨

Description

  • 다축 동시 제어는 여러 개의 축을 완전한 동기를 맞추어 동시에 제어하는 기능을 말한다.
  • 만일 속도 프로파일을 동일하게 설정하였다면 여러 개의 제어 대상 축이 시작 및 종료 시점은 물론이고, 가속/감속 구간까지 완전히 동기를 맞추어 제어될 수 있다.
  • 여러 개의 축에 대하여 Velocity Move 작업을 동시에 시작한다.
  • Velocity Move 는 작업 속도까지 가속한 후에 작업 속도를 유지하며 정지 함수가 호출될 때까지 또는 외부 센서에 의해 정지할 수 있으며, 지정한 방향으로 모션을 계속 수행한다.
  • 이 함수를 사용하면 여러 개의 축이 동시에 작업을 시작하고 여러 축이 동기를 맞추어 작업을 시작해야 하는 경우 유용하게 사용될 수 있다.
  • AxmStatusReadInMotion 함수에 의해 모션 중인지 확인할 수 있다.

예제 코드

C++
// 0축, 1축을 S커브 프로파일로 100의 속도와 200의 가속율로 속도 구동을 한다.
long lAxis[2];
double dPos[2],dVel[2];
double dAccel[2],dDecel[2];

for( int i=0; i<2; i++)
{
    AxmMotSetProfileMode(i, 4);
    AxmMotSetAbsRelMode(i, 0);
    lAxis[i] = i;
    dVel[i] = 100;
    dAccel[i] = 200;
    dDecel[i] = 200;
}

AxmMoveStartMultiVel(2, lAxis, dVel, dAccel, dDecel);

AxmMoveStartLineVel

Purpose

지정된 다축에 대하여 설정된 속도와 가속율로 지속적으로 속도 모드 구동을 한다.
펄스 출력이 시작되는 시점에서 함수를 벗어나며, Master 축은(Distance 가 가장 큰) dVel 속도로 움직이며, 나머지 축들은 Distance 비율로 움직인다. 속도는 해당 Chip 중 축 번호가 가장 낮은 축의 속도만 읽힌다.

A Serviceable Product

BPHR / BPFR BEHR / BEFR PCI-Nx04 PCIe-Nx04
O O O O
PCI-Rxx04 PCIe-Rxx04-RTEX PCI-Rxx04-MLII PCI-Rxx00-MLIII
A4N A5N/A6N PM A4N A5N/A6N PM SGDV SGDV SGD7 PM
PCI-Rxx04-SIIIH PCIe-Rxx04-SIIIH PCIe-Rxx05-MLIII PCIe-RxxIF-ECAT
MR-J4-B PM MR-J4-B PM SGDV SGD7 PM Servo PM
O O O O O
PCIe-Rxx05-ECAT PCIe-Rxx05-ECAT-E
Servo PM Servo PM
O O O O

Format

C++
DWORD AxmMoveStartLineVel(long lArraySize, long *lpAxisNo, double *dpDis, double dVel, double dAccel, double dDecel);
C#
uint AxmMoveStartLineVel(int lArraySize, int[] lpAxisNo, double[] dpDis, double dVel, double dAccel, double dDecel);

Parameters

[in/out] Name [Init Value] Explanation
[in] lArraySize 축 사이즈
[in] lpAxisNo 채널(축) 번호(0 ~ (최대 축 수 - 1)) 배열
[in] dpDis 이동거리 배열
[in] dVel 속도 (+방향: 0 이상값 , -방향: 0 이하값)
[in] dAccel 가속도 (가속도의 단위는 Unit/pulse를 1/1로 한 경우에 PPS[Pulses/sec^2])
[in] dDecel 감속도 (감속도의 단위는 Unit/pulse를 1/1로 한 경우에 PPS[Pulses/sec^2])

Return Values

[0000] AXT_RT_SUCCESS : 함수 실행 성공
[4154] AXT_RT_MOTION_ERROR_GANTRY_ENABLE : Gantry Slave 축에 Move 명령이 내려졌을 때
[4201] AXT_RT_MOTION_HOME_SEARCHING : 홈을 찾고있는 중일 때 다른 모션 함수들을 사용할 때
[4255] AXT_RT_MOTION_SETTING_ERROR : 속도, 가속도, 저크, 프로파일 설정이 잘못됨

Description

  • 다축 동시 제어는 여러 개의 축을 완전한 동기를 맞추어 동시에 제어하는 기능을 말한다.
  • 만일 속도 프로파일을 동일하게 설정하였다면 여러 개의 제어 대상 축이 시작 및 종료 시점은 물론이고, 가속/감속 구간까지 완전히 동기를 맞추어 제어될 수 있다.
  • 여러 개의 축에 대하여 Velocity Move 작업을 동시에 시작한다.
  • Velocity Move 는 작업 속도까지 가속한 후에 작업 속도를 유지하며, 정지 함수가 호출될 때까지 또는 외부 센서에 의해 정지할 수 있으며, 지정한 방향으로 모션을 계속 수행한다.

예제 코드

C++
// 0축, 1축을 S커브 프로파일로 3000의 거리를 100의 속도와 200의 가속율로 속도 구동을 한다.
long lpAxis[2];
double dpDis[2],dPos[2],dVel[2];
doubledAccel[2],dDecel[2];

for( int i=0; i<2; i++)
{
    AxmMotSetProfileMode(i, 4);
    AxmMotSetAbsRelMode(i, 0);
    lpAxis[i] = i;
    dpDis[i] = 3000;
    dVel[i] = 100;
    dAccel[i] = 200;
    dDecel[i] = 200;
}

AxmMoveStartLineVel (2, lpAxis, dpDis ,dVel, dAccel, dDecel);

AxmMoveToAbsPos

Purpose

지정 축의 설정한 절대 위치로 사다리꼴 속도 프로파일을 이용하여 이동한다.
펄스가 출력되는 시점에서 함수를 벗어난다.

A Serviceable Product

BPHR / BPFR BEHR / BEFR PCI-Nx04 PCIe-Nx04
PCI-Rxx04 PCIe-Rxx04-RTEX PCI-Rxx04-MLII PCI-Rxx00-MLIII
A4N A5N/A6N PM A4N A5N/A6N PM SGDV SGDV SGD7 PM
O O
PCI-Rxx04-SIIIH PCIe-Rxx04-SIIIH PCIe-Rxx05-MLIII PCIe-RxxIF-ECAT
MR-J4-B PM MR-J4-B PM SGDV SGD7 PM Servo PM
O O O O O O O
PCIe-Rxx05-ECAT PCIe-Rxx05-ECAT-E
Servo PM Servo PM

Format

C++
DWORD AxmMoveToAbsPos(long lAxisNo, double dPos, double dVel, double dAccel, double dDecel);
C#
uint AxmMoveToAbsPos(int lAxisNo, double dPos, double dVel, double dAccel, double dDecel);

Parameters

[in/out] Name [Init Value] Explanation
[in]lAxisNo 채널(축) 번호(0 ~ (최대 축 수 - 1))
[in]dPos 구동 거리
[in]dVel 속도
[in]dAccel 가속도 (가속도의 단위는 Unit/pulse를 1/1로 한 경우에 PPS[Pulses/sec^2])
[in]dDecel 감속도 (감속도의 단위는 Unit/pulse를 1/1로 한 경우에 PPS[Pulses/sec^2])

Return Values

[0000] AXT_RT_SUCCESS : 함수 실행 성공
[4154] AXT_RT_MOTION_ERROR_GANTRY_ENABLE : Gantry Slave 축에 Move 명령이 내려졌을 때
[4201] AXT_RT_MOTION_HOME_SEARCHING : 홈을 찾고있는 중일 때 또는 다른 모션 함수들을 사용할 때
[4255] AXT_RT_MOTION_SETTING_ERROR : 속도, 가속도, 저크, 프로파일 설정이 잘못됨

Description

하나의 축에 대하여 현재의 위치에서(구동 중) 지정한 거리(절대) 만큼 이동한다. 항상 위치 및 속도, 가감속도를 변경 가능하며, 반대 방향 위치 변경 기능을 포함한다. 속도 프로파일은 사다리꼴 전용으로 펄스가 출력되는 시점에서 함수를 벗어난다.

예제 코드

// 구동 중 0축에 절대 좌표로 200만큼 100의 속도와 200의 가속율로 사다리꼴 구동,
// 구동과 동시에 함수를 빠져나온다.
AxmMoveToAbsPos (0, 200, 100, 200, 200);

AxmMoveSignalSearch

Purpose

지정 축에 설정된 신호를 검출한다.

A Serviceable Product

BPHR / BPFR BEHR / BEFR PCI-Nx04 PCIe-Nx04
O O O O
PCI-Rxx04 PCIe-Rxx04-RTEX PCI-Rxx04-MLII PCI-Rxx00-MLIII
A4N A5N/A6N PM A4N A5N/A6N PM SGDV SGDV SGD7 PM
O O O O O O O
PCI-Rxx04-SIIIH PCIe-Rxx04-SIIIH PCIe-Rxx05-MLIII PCIe-RxxIF-ECAT
MR-J4-B PM MR-J4-B PM SGDV SGD7 PM Servo PM
O O O O O O O O O
PCIe-Rxx05-ECAT PCIe-Rxx05-ECAT-E
Servo PM Servo PM
O O O O

Format

C++
DWORD AxmMoveSignalSearch(long lAxisNo, double dVel, double dAccel, long lDetectSignal, long lSignalEdge, long lSignalMethod);
C#
uint AxmMoveSignalSearch(int lAxisNo, double dVel, double dAccel, int lDetectSignal, int lSignalEdge, int lSignalMethod);

Parameters

[in/out] Name [Init Value] Explanation
[in]lAxisNo 채널(축) 번호(0 ~ (최대 축 수 - 1))
[in]dVel 속도(+방향: 0 이상값 , -방향: 0 이하값)
[in]dAccel 가속도 (가속도의 단위는 Unit/pulse를 1/1로 한 경우에 PPS[Pulses/sec^2])
[in]lDetectSignal 검출 신호 설정: AXT_MOTION_HOME_DETECT_SIGNAL_DEF
- [00h]+Elm(End limit) +방향 리미트 센서 신호
- [01h]-Elm(End limit) -방향 리미트 센서 신호
- [02h]Reserved
- [03h]Reserved
- [04h]IN0(ORG) 원점 센서 신호
- [05h]IN1(Z상) Encoder Z상 신호
- [06h]IN2(범용) 범용 입력 2번 신호
- [07h]IN3(범용) 범용 입력 3번 신호
[in]lSignalEdge 검출 신호의 Edge 방향 설정: AXT_MOTION_EDGE_DEF
- [00h]다운 에지
- [01h]업 에지
[in]lSignalMethod 정지 모드: AXT_MOTION_STOPMODE_DEF
- [00h]급정지
- [01h]감속 정지

Return Values

[0000] AXT_RT_SUCCESS : 함수 실행 성공
[4154] AXT_RT_MOTION_ERROR_GANTRY_ENABLE : Gantry Slave 축에 Move 명령이 내려졌을 때
[4201] AXT_RT_MOTION_HOME_SEARCHING : 홈을 찾고있는 중일 때 다른 모션 함수들을 사용할 때
[4255] AXT_RT_MOTION_SETTING_ERROR : 속도, 가속도, 저크, 프로파일 설정이 잘못됨

Description

  • 지정 축에 설정된 신호를 검출한다. 리미트 센서 신호나 원점 센서 신호, 서보 드라이버의 Z 상 신호 또는 범용 입력 신호들의 Edge 를 검출할 수 있다.
  • 주로 원점 검색 구동 함수 구현 시 사용하는 함수이다.
  • AxmStatusReadInMotion 함수에 의해 모션 중인지 확인할 수 있다.
  • AxmSignalSetInpos 함수를 사용하는 경우에는 Inposition 입력 신호가 Enable 로 설정되어 있다면 Command 펄스 출력이 완료되어도 INP 입력이 ON 되기 전까지는 모션이 완료되지 않은 것으로 간주되어 반환되지 않는다. (AxmSignalSetInpos 함수 참고)

주의 사항

  • lDetectSignal 이 PosEndLimit, NegEndLimit(0,1) 을 찾을 경우, 신호의 Active Level 상태를 검출한다.
  • SignalMethod 를 EMERGENCY_STOP(0)로 사용할 경우 가감속이 무시되며 지정된 속도로 가속 급정지하게 된다.

예제 코드

// 0축의 Z상 신호를 만나면 감속 정지하면서 Falling Edge 검출
AxmMoveSignalSearch (0, 100, 200, 5, 0, 0);

AxmMoveSignalCapture

Purpose

지정 축으로 구동 중 설정된 신호를 검출하고 그때의 위치를 자동 저장하기 위한 구동 함수이다.

A Serviceable Product

BPHR / BPFR BEHR / BEFR PCI-Nx04 PCIe-Nx04
O O O O
PCI-Rxx04 PCIe-Rxx04-RTEX PCI-Rxx04-MLII PCI-Rxx00-MLIII
A4N A5N/A6N PM A4N A5N/A6N PM SGDV SGDV SGD7 PM
O O
PCI-Rxx04-SIIIH PCIe-Rxx04-SIIIH PCIe-Rxx05-MLIII PCIe-RxxIF-ECAT
MR-J4-B PM MR-J4-B PM SGDV SGD7 PM Servo PM
O O O O O O O
PCIe-Rxx05-ECAT PCIe-Rxx05-ECAT-E
Servo PM Servo PM
O O O O

Format

C++
DWORD AxmMoveSignalCapture(long lAxisNo, double dVel, double dAccel,
    long lDetectSignal, long lSignalEdge, long lTarget, long
    lSignalMethod);
C#
uint AxmMoveSignalCapture(int lAxisNo, double dVel, double dAccel,
    int lDetectSignal, int lSignalEdge, int lTarget, int lSignalMethod);

Parameters

[in/out] Name [Init Value] Explanation
[in]lAxisNo 채널(축) 번호(0 ~ (최대 축 수 - 1))
[in]dVel 속도(+방향: 0 이상 값 , -방향: 0 이하 값)
[in]dAccel 가속도 (가속도의 단위는 Unit/pulse를 1/1로 한 경우에 PPS[Pulses/sec^2])
[in]lDetectSignal 검출 신호 설정: AXT_MOTION_HOME_DETECT_SIGNAL_DEF
- [00h] +Elm(End limit) +방향 리미트 센서 신호
- [01h] -Elm(End limit) -방향 리미트 센서 신호
- [02h] Reserved
- [03h] Reserved
- [04h] IN0(ORG) 원점 센서 신호
- [05h] IN1(Z상) Encoder Z상 신호
- [06h] IN2(범용) 범용 입력 2번 신호
- [07h] IN3(범용) 범용 입력 3번 신호
[in]lSignalEdge 검출 신호의 Edge 방향 설정: AXT_MOTION_EDGE_DEF
- [00h] 다운 에지
- [01h] 업 에지
[in]lTarget 검출할 위치 소스 설정: AXT_MOTION_SELECTION_DEF
- [00h]목표 위치 (Cmd 위치를 저장함)
- [01h]실제 위치 (ACT (1) : Encoder 위치를 저장함)
[in]lSignalMethod 정지 모드: AXT_MOTION_STOPMODE_DEF
- [00h]급정지
- [01h]감속 정지

Return Values

[0000] AXT_RT_SUCCESS : 함수 실행 성공
[4154] AXT_RT_MOTION_ERROR_GANTRY_ENABLE : Gantry Slave 축에 Move 명령이 내려졌을 때
[4201] AXT_RT_MOTION_HOME_SEARCHING : 홈을 찾고있는 중일 때 다른 모션 함수들을 사용할 때
[4255] AXT_RT_MOTION_SETTING_ERROR : 속도, 가속도, 저크, 프로파일 설정이 잘못됨

Description

  • 지정 축에서 설정된 신호를 검출하고 그 위치를 저장하기 위해 이동하는 함수이다.
  • 리미트 센서 신호나 원점 센서 신호 ,서보 드라이버의 Z 상 신호 또는 범용 입력 신호들의 Edge 를 검출할 수 있다.
  • 신호 검출 시 Cmd 위치나 Encoder 위치를 저장할 수 있다.
  • 저장된 위치는 ‘AxmMoveGetCapturePos’ 함수를 이용하여 확인할 수 있다.
  • AxmStatusReadInMotion 함수에 의해 모션 중인지 확인할 수 있다.
  • AxmSignalSetInpos 함수를 사용하는 경우에는 Inposition 입력신호가 Enable 로 설정되어 있다면 Command 펄스 출력이 완료되어도 INP 입력이 ON 되기 전까지는 모션이 완료되지 않은 것으로 간주되어 반환되지 않는다. (AxmSignalSetInpos 함수 참고)

주의 사항

  • lDetectSignal 이 PosEndLimit , NegEndLimit(0,1) 을 찾을 경우 신호의 레벨 Active 상태를 검출하게 된다.
  • SignalMethod 를 EMERGENCY_STOP(0)로 사용할 경우 가감속이 무시되며, 지정된 속도로 가속 급정지하게 된다.

예제 코드

// 0축의 Z상 신호 Falling Edge 검출 시 감속 정지하면서 Encoder 위치 저장.
AxmMoveSignalCapture(0, 100, 200, 5, 0, ACTUAL, 0);

AxmMoveGetCapturePos

Purpose

AxmMoveSignalCapture 함수에서 저장된 위치값을 확인하는 함수이다.

A Serviceable Product

BPHR / BPFR BEHR / BEFR PCI-Nx04 PCIe-Nx04
O O O O
PCI-Rxx04 PCIe-Rxx04-RTEX PCI-Rxx04-MLII PCI-Rxx00-MLIII
A4N A5N/A6N PM A4N A5N/A6N PM SGDV SGDV SGD7 PM
O O
PCI-Rxx04-SIIIH PCIe-Rxx04-SIIIH PCIe-Rxx05-MLIII PCIe-RxxIF-ECAT
MR-J4-B PM MR-J4-B PM SGDV SGD7 PM Servo PM
O O O O O O O O O
PCIe-Rxx05-ECAT PCIe-Rxx05-ECAT-E
Servo PM Servo PM
O O O O

Format

C++
DWORD AxmMoveGetCapturePos(long lAxisNo, double *dpCapPos);
C#
uint AxmMoveGetCapturePos(int lAxisNo, ref double dpCapPos);

Parameters

[in/out] Name [Init Value] Explanation
[in]lAxisNo 채널(축) 번호(0 ~ (최대 축 수 - 1))
[out]dpCapPos 신호 검출 시 위치값

Return Values

[0000] AXT_RT_SUCCESS : 함수 실행 성공
[4053] AXT_RT_MOTION_NOT_INITIAL_AXIS_NO : 해당 축 모션 초기화 실패
[4162] AXT_RT_NOT_CAPTURED : 위치가 저장되지 않았을 때

Description

  • AxmMoveSignalCapture 구동 함수에서 지정한 신호가 검출되면 H/W 버퍼에 자동저장되고 그 저장된 위치값을 확인하는 함수이다.
  • 최초 실행 시 AxmMoveSignalCapture 에 의해 성공적으로 위치값이 저장되어 있다면 AXT_RT_SUCCESS를 리턴하며 유효한 위치값이 반환되지만, 만약 그렇지 않다면 AXT_RT_NOT_CAPTURED를 리턴하므로 함수 실행 결과를 확인하여야 한다.
  • AxmStatusReadInMotion 함수에 의해 모션 중인지 확인할 수 있다.
  • AxmSignalSetInpos 함수를 사용하는 경우에는 Inposition 입력 신호가 Enable 로 설정되어 있다면 Command 펄스 출력이 완료되어도 INP 입력이 ON 되기 전까지는 모션이 완료되지 않은 것으로 간주되어 반환되지 않는다. 이 내용은 AxmSignalSetInpos 함수를 참고하기 바란다.

주의 사항

  • 이 함수는 H/W 버퍼에서 위치값을 읽어오며, 한번 읽으면 H/W 버퍼는 초기화 된다.

예제 코드

// Z상 검출 시 위치 확인.
double dPos;
AxmMoveGetCapturePos (0, &dPos);

AxmHomeSetSignalLevel

Purpose

지정 축의 Home 입력 신호의 출력 레벨을 설정한다.

A Serviceable Product

BPHR / BPFR BEHR / BEFR PCI-Nx04 PCIe-Nx04
O O O O
PCI-Rxx04 PCIe-Rxx04-RTEX PCI-Rxx04-MLII PCI-Rxx00-MLIII
A4N A5N/A6N PM A4N A5N/A6N PM SGDV SGDV SGD7 PM
O O O O O O O O O
PCI-Rxx04-SIIIH PCIe-Rxx04-SIIIH PCIe-Rxx05-MLIII PCIe-RxxIF-ECAT
MR-J4-B PM MR-J4-B PM SGDV SGD7 PM Servo PM
O O O O O O O
PCIe-Rxx05-ECAT PCIe-Rxx05-ECAT-E
Servo PM Servo PM
O O O O

Format

C++
DWORD AxmHomeSetSignalLevel(long lAxisNo, DWORD uLevel);
C#
uint AxmHomeSetSignalLevel(int lAxisNo, uint uLevel);

Parameters

[in/out] Name [Init Value] Explanation
[in]lAxisNo 채널(축) 번호(0 ~ (최대 축 수 - 1))
[in]uLevel [01h]Home 신호의 Active Level: AXT_MOTION_LEVEL_MODE_DEF
- [00h] B 접점(Normal Close)
- [01h] A 접점(Normal Open)

Return Values

[0000] AXT_RT_SUCCESS : 함수 실행 성공
[4053] AXT_RT_MOTION_NOT_INITIAL_AXIS_NO : 해당 축 모션 초기화 실패
[4101] AXT_RT_MOTION_INVALID_AXIS_NO : 해당 축이 존재하지 않음

Description

사용자가 지정한 축의 Home 입력 레벨을 설정한다. 범용 입력 0 을 Home 신호로 사용한다. 현재의 Home 신호 Level 을 읽기 위해서는 AxmHomeReadSignal 함수를 사용하여 확인할 수 있다.

주의 사항

원점 레벨을 잘못 설정할 경우 현재의 홈 상태에 따라 -방향으로 설정해도 +방향으로 동작할 수 있으며, 홈을 찾는데 있어서 문제가 될 수 있다.
Mechatrolink-II Slave 모듈인 SGDV 및 PL2910 은 원점 레벨 변경을 지원하지 않으며, A 접점으로만 동작한다.

예제 코드

// 0 축에 홈 입력 신호 레벨을 설정한다.
AxmHomeSetSignalLevel(0, HIGH);

// 0축의 Home 입력 신호 레벨 값을 확인.
DWORD uState;
AxmHomeGetSignalLevel(0, &uState);

AxmHomeGetSignalLevel

Purpose

지정 축의 Home 신호의 출력 레벨 설정을 반환한다.

A Serviceable Product

BPHR / BPFR BEHR / BEFR PCI-Nx04 PCIe-Nx04
O O O O
PCI-Rxx04 PCIe-Rxx04-RTEX PCI-Rxx04-MLII PCI-Rxx00-MLIII
A4N A5N/A6N PM A4N A5N/A6N PM SGDV SGDV SGD7 PM
O O O O O O O O O
PCI-Rxx04-SIIIH PCIe-Rxx04-SIIIH PCIe-Rxx05-MLIII PCIe-RxxIF-ECAT
MR-J4-B PM MR-J4-B PM SGDV SGD7 PM Servo PM
O O O O O O O
PCIe-Rxx05-ECAT PCIe-Rxx05-ECAT-E
Servo PM Servo PM
O O O O

Format

C++
DWORD AxmHomeGetSignalLevel(long lAxisNo, DWORD *upLevel);
C#
uint AxmHomeGetSignalLevel(int lAxisNo, ref uint upLevel);

Parameters

[in/out] Name [Init Value] Explanation
[in]lAxisNo 채널(축) 번호(0 ~ (최대 축 수 - 1))
[out]upLevel [01h]Home 신호의 Active Level: AXT_MOTION_LEVEL_MODE_DEF
- [00h] B 접점(Normal Close)
- [01h] A 접점(Normal Open)

Return Values

[0000] AXT_RT_SUCCESS : 함수 실행 성공
[4053] AXT_RT_MOTION_NOT_INITIAL_AXIS_NO : 해당 축 모션 초기화 실패
[4101] AXT_RT_MOTION_INVALID_AXIS_NO : 해당 축이 존재하지 않음

Description

AxmHomeSetSignalLevel로 설정한 Home 입력 레벨을 반환한다.

예제 코드

// 0 축에 홈 입력 신호 레벨을 설정한다.
AxmHomeSetSignalLevel(0, HIGH);

// 0축의 Home 입력 신호 레벨 값을 확인.
DWORD uState;
AxmHomeGetSignalLevel(0, &uState);

AxmHomeReadSignal

Purpose

지정 축의 Home 신호의 입력 상태를 반환한다.

A Serviceable Product

BPHR / BPFR BEHR / BEFR PCI-Nx04 PCIe-Nx04
O O O O
PCI-Rxx04 PCIe-Rxx04-RTEX PCI-Rxx04-MLII PCI-Rxx00-MLIII
A4N A5N/A6N PM A4N A5N/A6N PM SGDV SGDV SGD7 PM
O O O O O O O O O O
PCI-Rxx04-SIIIH PCIe-Rxx04-SIIIH PCIe-Rxx05-MLIII PCIe-RxxIF-ECAT
MR-J4-B PM MR-J4-B PM SGDV SGD7 PM Servo PM
O O O O O O O O O
PCIe-Rxx05-ECAT PCIe-Rxx05-ECAT-E
Servo PM Servo PM
O O O O

Format

C++
DWORD AxmHomeReadSignal(long lAxisNo, DWORD *upStatus);
C#
uint AxmHomeReadSignal(int lAxisNo, ref uint upStatus);

Parameters

[in/out] Name [Init Value] Explanation
[in]lAxisNo 채널(축) 번호(0 ~ (최대 축 수 - 1))
[out]upStatus 신호의 입력 상태: AXT_MOTION_SIGNAL_LEVEL_DEF
- [00h]비활성화
- [01h]활성화

Return Values

[0000] AXT_RT_SUCCESS : 함수 실행 성공
[4053] AXT_RT_MOTION_NOT_INITIAL_AXIS_NO : 해당 축 모션 초기화 실패
[4101] AXT_RT_MOTION_INVALID_AXIS_NO : 해당 축이 존재하지 않음

Description

현재 Home 신호의 입력 상태를 반환한다.

예제 코드

// 0축에 Home 신호의 입력 확인.
DWORD upStatus;
AxmHomeReadSignal (0, &upStatus);

AxmHomeSetMethod

Purpose

해당 축의 원점 검색을 수행하기 위해서는 반드시 원점 검색 관련 파라미터들이 설정되어 있어야 한다. 만약 AxmMotLoadParaAll 함수를 이용하여 초기화가 정상적으로 수행되었다면 별도의 설정은 필요하지 않다. 원점 검색 방법 설정에는 검색 진행 방향, 원점으로 사용할 신호, 원점 센서 Active Level, 엔코더 Z 상 검출 여부 등이 있다. (자세한 내용은 AxmMotLoadParaAll 설명 부분 참조)

A Serviceable Product

BPHR / BPFR BEHR / BEFR PCI-Nx04 PCIe-Nx04
O O O O
PCI-Rxx04 PCIe-Rxx04-RTEX PCI-Rxx04-MLII PCI-Rxx00-MLIII
A4N A5N/A6N PM A4N A5N/A6N PM SGDV SGDV SGD7 PM
O O O O O O O O O O
PCI-Rxx04-SIIIH PCIe-Rxx04-SIIIH PCIe-Rxx05-MLIII PCIe-RxxIF-ECAT
MR-J4-B PM MR-J4-B PM SGDV SGD7 PM Servo PM
O O O O O O O O O
PCIe-Rxx05-ECAT PCIe-Rxx05-ECAT-E
Servo PM Servo PM
O O O O

Format

C++
DWORD AxmHomeSetMethod(long lAxisNo, long lHmDir, DWORD uHomeSignal,
    DWORD uZphas, double dHomeClrTime, double dHomeOffset);
C#
uint AxmHomeSetMethod(int lAxisNo, int lHmDir, uint uHomeSignal, uint
    uZphas, double dHomeClrTime, double dHomeOffset);

Parameters

[in/out] Name [Init Value] Explanation
[in]lAxisNo 채널(축) 번호(0 ~ (최대 축 수 - 1))
[in]lHmDir [00h]원점 검색을 초기에 진행할 방향 설정: AXT_MOTION_MOVE_DIR_DEF
- [00h]반시계 방향
- [01h]시계 방향
[in]uHomeSignal [04h]원점 검색에 사용할 신호 설정: AXT_MOTION_HOME_DETECT_SIGNAL_DEF
- [00h]+Elm(End limit) +방향 리미트 센서 신호
- [01h]-Elm(End limit) -방향 리미트 센서 신호
- [04h]IN0(ORG) 원점 센서 신호
[in]uZphas [00h]1차 원점 검색 완료 후 엔코더 Z상 검출 유무 설정
- [00h]Z상 검출 사용하지 않음
- [01h]Z상 검출 +방향 사용
- [02h]Z상 검출 –방향 사용
[in]dHomeClrTime [1000.0]원점 검색 완료 후 지령 위치와 Encoder 위치를 Clear하기 위해 대기하는 시간설정
[mSec단위]
[in]dHomeOffset [0.0]원점 검색이 완료된 후 기구 원점으로 이동 후 원점 재설정할 위치

Return Values

[0000] AXT_RT_SUCCESS : 함수 실행 성공
[4053] AXT_RT_MOTION_NOT_INITIAL_AXIS_NO : 해당 축 모션 초기화 실패
[4152] AXT_RT_MOTION_ERROR_IN_MOTION : 모션 구동 중에 다른 모션 구동 함수를 실행함

Description

해당 축의 원점 검색을 수행하기 위해서는 반드시 원점 검색 관련 파라미터들이 설정되어 있어야 한다. 만약 AxmMotLoadParaAll 설정 파일을 이용하여 초기화가 정상적으로 수행되었다면 별도의 설정은 필요하지 않다. 원점 검색 방법 설정에는 검색 진행 방향, 원점으로 사용할 신호, 엔코더 Z 상 검출 여부 등이 있다. 원점 센서 Active Level 은 AxmHomeSetSignalLevel 함수를 사용하여 별도로 설정한다. (자세한 내용은 AxmMotLoadParaAll 설명 부분 참조)

주의 사항

원점 레벨을 잘못 설정할 경우 현재의 홈 상태에 따라 -방향으로 설정해도 +방향으로 동작할 수 있으며, 홈을 찾는데 있어 문제가 될 수 있다.

예제 코드

long lHmDir = 1; DWORD uHmsig = 4;
DWORD uZphas = 0; double dHClrTim = 2000.0, dHOffset = 0.0;
AxmHomeSetMethod(0, lHmDir, uHmsig, uZphas, dHClrTim, dHOffset);
AxmHomeSetVel(0,10000, 5000, 500, 50, 40000, 10000);
AxmHomeSetStart(0);

// (-)방향으로 원점 검색, Home Sensor 이용, Home Sensor Type A 접점, Z상 검출 사용 안함, Offset 이동 안 함으로 설정.
AxmHomeGetMethod(0, &lHmDir, &uHmsig, &uZphas, &dHClrTim, & dHOffset);

AxHomeGetMethod

Purpose

해당 축의 원점 검색을 수행하기 위해서는 반드시 원점 검색 관련 파라미터들이 설정되어 있어야 한다. 만약 AxmMotLoadParaAll 설정 파일을 이용하여 초기화가 정상적으로 수행되었다면 별도의 설정은 필요하지 않다. 원점 검색 방법 설정에는 검색 진행 방향, 원점으로 사용할 신호, 엔코더 Z 상 검출 여부 등이 있고, 본 함수를 통해 해당 값을 읽어올 수 있다. (자세한 내용은 AxmMotLoadParaAll 설명 부분 참조)

A Serviceable Product

BPHR / BPFR BEHR / BEFR PCI-Nx04 PCIe-Nx04
O O O O
PCI-Rxx04 PCIe-Rxx04-RTEX PCI-Rxx04-MLII PCI-Rxx00-MLIII
A4N A5N/A6N PM A4N A5N/A6N PM SGDV SGDV SGD7 PM
O O O O O O O O O O
PCI-Rxx04-SIIIH PCIe-Rxx04-SIIIH PCIe-Rxx05-MLIII PCIe-RxxIF-ECAT
MR-J4-B PM MR-J4-B PM SGDV SGD7 PM Servo PM
O O O O O O O O O
PCIe-Rxx05-ECAT PCIe-Rxx05-ECAT-E
Servo PM Servo PM
O O O O

Format

C++
DWORD AxmHomeGetMethod(long lAxisNo, long *lpHmDir, DWORD *upHomeSignal, DWORD *upZphas, double *dpHomeClrTime, double *dpHomeOffset);
C#
uint AxmHomeGetMethod(int lAxisNo, ref int lpHmDir, ref uint upHomeSignal, ref uint upZphas, ref double dpHomeClrTime, ref double dpHomeOffset);

Parameters

[in/out] Name [Init Value] Explanation
[in]lAxisNo 채널(축) 번호(0 ~ (최대 축 수 - 1))
[out]lpHmDir [00h]원점 검색을 초기에 진행할 방향 설정: AXT_MOTION_MOVE_DIR_DEF
- [00h]반시계 방향
- [01h]시계 방향
[out]upHomeSignal [04h]원점 검색에 사용할 신호 설정: AXT_MOTION_HOME_DETECT_SIGNAL_DEF
- [00h]+Elm(End limit) +방향 리미트 센서 신호
- [01h]-Elm(End limit) -방향 리미트 센서 신호
- [04h]IN0(ORG) 원점 센서 신호
[out]upZphas [00h]1차 원점 검색 완료 후 엔코더 Z상 검출 유무 설정
- [00h]Z상 검출 사용하지 않음
- [01h]Z상 검출 +방향 사용
- [02h]Z상 검출 –방향 사용
[out]dpHomeClrTime [1000.0]원점 검색 완료 후 지령 위치와 Encoder위치를 Clear하기 위해 대기하는 시간설정 [mSec단위]
[out]dpHomeOffset [0.0]원점 검색이 완료된 후 기구 원점으로 이동 후 원점을 재설정할 위치

Return Values

[0000] AXT_RT_SUCCESS : 함수 실행 성공
[4053] AXT_RT_MOTION_NOT_INITIAL_AXIS_NO : 해당 축 모션 초기화 실패
[4101] AXT_RT_MOTION_INVALID_AXIS_NO : 해당 축이 존재하지 않음

Description

해당 축의 원점 검색을 수행하기 위해서는 반드시 원점 검색 관련 파라미터들이 설정되어 있어야 한다. 만약 AxmMotLoadParaAll 설정 파일을 이용하여 초기화가 정상적으로 수행되었다면 별도의 설정은 필요하지 않다. 원점 검색 방법 설정에는 검색 진행 방향, 원점으로 사용할 신호 엔코더 Z 상 검출 여부 등이 있고, 본 함수를 통해 해당 값을 읽어 올 수 있다. 원점 센서 Active Level 은 AxmSignalGetHomeLevel 함수를 사용하여 별도로 읽어온다. (자세한 내용은 AxmMotLoadParaAll 설명 부분 참조).

예제 코드

long lHmDir = 1;
DWORD uHmsig = 4;
DWORD uZphas = 0;
double dHClrTim = 2000.0, dHOffset = 0.0;
AxmHomeSetMethod(0, lHmDir, uHmsig, uZphas, dHClrTim, dHOffset);
AxmHomeSetVel(0,10000, 5000, 500, 50, 40000, 10000);
AxmHomeSetStart(0);

// (-)방향으로 원점 검색, Home Sensor 이용, Home Sensor Type A 접점, Z상 검출 사용 안함, Offset 이동 안 함으로 설정.
AxmHomeGetMethod(0, &lHmDir, &uHmsig, &uZphas, &dHClrTim, &dHOffset);

AxmHomeSetFineAdjust

Purpose

해당 축의 원점 검색 방법 미세조정 파라미터를 설정한다.

A Serviceable Product

BPHR / BPFR BEHR / BEFR PCI-Nx04 PCIe-Nx04
O O O O
PCI-Rxx04 PCIe-Rxx04-RTEX PCI-Rxx04-MLII PCI-Rxx00-MLIII
A4N A5N/A6N PM A4N A5N/A6N PM SGDV SGDV SGD7 PM
O O O O O O O O O O
PCI-Rxx04-SIIIH PCIe-Rxx04-SIIIH PCIe-Rxx05-MLIII PCIe-RxxIF-ECAT
MR-J4-B PM MR-J4-B PM SGDV SGD7 PM Servo PM
O O O O O O O O O
PCIe-Rxx05-ECAT PCIe-Rxx05-ECAT-E
Servo PM Servo PM
O O O O

Format

C++
DWORD AxmHomeSetFineAdjust(long lAxisNo, double dHomeDogLength, long lLevelScanTime, DWORD uFineSearchUse, DWORD uHomeClrUse);
C#
uint AxmHomeSetFineAdjust(int lAxisNo, double dHomeDogLength, uint lLevelScanTime, uint uFineSearchUse, uint uHomeClrUse);

Parameters

[in/out] Name [Init Value] Explanation
[in]lAxisNo 채널(축) 번호(0 ~ (최대 축 수 - 1))
[in]dHomeDogLength 첫번째 Step에서 HomeDog가 센서를 지나쳤는지 확인하기 위한 Dog 길이를 설정.
[단위는 AxmMotSetMoveUnitPerPulse 함수로 설정한 단위]
[in]lLevelScanTime 두번째 Step(원점 센서를 빠져나가는 동작)에서 Level 상태를 확인할 Scan 시간 을 설정.
[msec단위]
[in]uFineSearchUse 기본 원점 검색 시 5Step을 사용하는데 3Step만 사용하도록 설정
- [00h] USE (3 Step 사용)
- [01h] UNUSE (5 Step 사용)
[in]uHomeClrUse 원점 검색 후 지령 값과 Encoder 값을 0으로 자동 설정하는지 선택
- [00h] USE
- [01h] UNUSE

Return Values

[0000] AXT_RT_SUCCESS : 함수 실행 성공
[4053] AXT_RT_MOTION_NOT_INITIAL_AXIS_NO : 해당 축 모션 초기화 실패
[4152] AXT_RT_MOTION_ERROR_IN_MOTION : 모션 구동 중에 다른 모션 구동 함수를 실행함

Description

해당 축의 원점 검색 방법에 관련된 미세조정 파라미터를 설정한다. 기본 값은 다음과 같으며 설정 하지 않아도 무방하다. HomeDogLenth : 500, SanTime : 100msec, FineSearchUse : USE, HomeClrUse : USE

예제 코드

// Dog 길이 500 pulse, Scan Time 100msec, 3 Step 사용, 지령 값 및 Encoder 값 0으로 자동 설정.
long lLevelScanTime = 100;
DWORD uFineSearchUse = 0, uHomeClrUse = 0;
double dHomeDogLength = 500.0;
AxmHomeSetFineAdjust(0, dHomeDogLength, lLevelScanTime, uFineSearchUse, uHomeClrUse);

AxmHomeGetFineAdjust

Purpose

해당 축에 설정되어 있는 원점 검색 관련 미세조정 파라미터들을 반환한다.

A Serviceable Product

BPHR / BPFR BEHR / BEFR PCI-Nx04 PCIe-Nx04
O O O O
PCI-Rxx04 PCIe-Rxx04-RTEX PCI-Rxx04-MLII PCI-Rxx00-MLIII
A4N A5N/A6N PM A4N A5N/A6N PM SGDV SGDV SGD7 PM
O O O O O O O O O O
PCI-Rxx04-SIIIH PCIe-Rxx04-SIIIH PCIe-Rxx05-MLIII PCIe-RxxIF-ECAT
MR-J4-B PM MR-J4-B PM SGDV SGD7 PM Servo PM
O O O O O O O O O
PCIe-Rxx05-ECAT PCIe-Rxx05-ECAT-E
Servo PM Servo PM
O O O O

Format

C++
DWORD AxmHomeGetFineAdjust(long lAxisNo, double *dpHomeDogLength, long *lpLevelScanTime, DWORD *upFineSearchUse, DWORD *upHomeClrUse);
C#
uint AxmHomeGetFineAdjust(int lAxisNo, ref double dpHomeDogLength, ref uint lpLevelScanTime, ref uint upFineSearchUse, ref uint upHomeClrUse);

Parameters

[in/out] Name [Init Value] Explanation
[in]lAxisNo 채널(축) 번호(0 ~ (최대 축 수 - 1))
[out]dpHomeDogLength 첫번째 Step에서 HomeDog가 센서를 지나쳤는지 확인하기 위한 Dog 길이를 설정.
[단위는 AxmMotSetMoveUnitPerPulse 함수로 설정한 단위]
[out]lpLevelScanTime 두번째 Step(원점 센서를 빠져나가는 동작)에서 Level 상태를 확인할 Scan 시 간을 설정.
[msec단위]
[out]upFineSearchUse 기본 원점 검색 시 5 Step을 사용하는데 3 Step만 사용하도록 설정
- [00h] USE (3 Step 사용)
- [01h] UNUSE (5 Step 사용)
[out]upHomeClrUse 원점 검색 후 지령 값과 Encoder 값을 0으로 자동 설정하는지 선택
- [00h] USE
- [01h] UNUSE

Return Values

[0000] AXT_RT_SUCCESS : 함수 실행 성공
[4053] AXT_RT_MOTION_NOT_INITIAL_AXIS_NO : 해당 축 모션 초기화 실패
[4101] AXT_RT_MOTION_INVALID_AXIS_NO : 해당 축이 존재하지 않음

Description

해당 축의 원점 검색 방법에 관련된 미세조정 파라미터 값들을 반환한다.

예제 코드

// 원점 검색 관련 미세조정 파라미터의 값을 읽어온다.
DWORD *upFineSearchUse, *upHomeClrUse;
double *dpHomeDogLength;
long *lpLevelScanTime;
AxmHomeSetFineAdjust(0, dpHomeDogLength,lpLevelScanTime,upFineSearchUse,upHomeClrUse);

AxmHomeSetVel

Purpose

원점을 빠르고 정밀하게 검색하기 위해 여러 단계의 스텝으로 원점을 검색한다. 이때 각 스텝에 사용 될 속도를 설정한다. 이 속도들의 설정 값에 따라 원점 검색 시간과, 원점 검색 정밀도가 결정된다. 각 스텝 별 속도 설정은 장비에 맞게 적절히 바꿔가면서 각 축의 원점 검색 속도를 설정하면 된다.
(자세한 내용은 AxmMotLoadParaAll 함수 설명 부분 참조)

A Serviceable Product

BPHR / BPFR BEHR / BEFR PCI-Nx04 PCIe-Nx04
O O O O
PCI-Rxx04 PCIe-Rxx04-RTEX PCI-Rxx04-MLII PCI-Rxx00-MLIII
A4N A5N/A6N PM A4N A5N/A6N PM SGDV SGDV SGD7 PM
O O O O O O O O O O
PCI-Rxx04-SIIIH PCIe-Rxx04-SIIIH PCIe-Rxx05-MLIII PCIe-RxxIF-ECAT
MR-J4-B PM MR-J4-B PM SGDV SGD7 PM Servo PM
O O O O O O O O O
PCIe-Rxx05-ECAT PCIe-Rxx05-ECAT-E
Servo PM Servo PM
O O O O

Format

C++
DWORD AxmHomeSetVel(long lAxisNo, double dVelFirst, double dVelSecond, double dVelThird, double dVelLast, double dAccFirst, double dAccSecond);
C#
uint AxmHomeSetVel(int lAxisNo, double dVelFirst, double dVelSecond, double dVelThird, double dvelLast, double dAccFirst, double dAccSecond);

Parameters

[in/out] Name [Init Value] Explanation
[in]lAxisNo 채널(축) 번호(0 ~ (최대 축 수 - 1))
[in]dVelFirst [100.0]원점 센서가 감지되어 있지 않을 때 원점 검색 진행 방향으로 구동할 속도
[in]dVelSecond [100.0]원점 센서가 감지되어 있을 때 원점 검색 진행 반대 방향으로 구동할 속도
[in]dVelThird [20.0]1차 원점 센서 검출 후 재검색할 때 사용될 구동 속도
[in]dvelLast [1.0]마지막 원점 검출 시 사용될 구동 속도(Z상 검출 사용 시 속도, 원점 센서 정밀 검출 속도)
[in]dAccFirst [400.0]원점 센서가 감지되어 있지 않을 때 원점 검색 진행 방향으로 구동할 때 사용될 가속/감속도
(감속도의 단위는 Unit/pulse를 1/1로 한 경우에 PPS[Pulses/sec])
[in]dAccSecond [400.0]원점 센서가 감지되어 있을 때 원점 검색 진행 반대 방향으로 구동할 때 사용될 가속/감속도
(감속도의 단위는 Unit/pulse를 1/1로 한 경우에 PPS[Pulses/sec])

Return Values

[0000] AXT_RT_SUCCESS : 함수 실행 성공
[4152] AXT_RT_MOTION_ERROR_IN_MOTION : 모션 구동 중에 다른 모션 구동 함수를 실행함
[4253] AXT_RT_MOTION_VELOCITY_OUTOFBOUND : 구동 속도값이 0 으로 설정됨

Description

원점을 빠르고 정밀하게 검색하기 위해 여러 단계의 스텝으로 원점을 검색한다. 이때 각 스텝에 사용될 속도를 설정한다. 이 속도들의 설정 값에 따라 원점 검색 시간과, 원점 검색 정밀도가 결정된다. 각 스텝 별 속도들을 적절히 바꿔가면서 각 축의 원점 검색 속도를 설정하면 된다.
(자세한 내용은 AxmMotLoadParaAll 함수 설명 부분 참조)

예제 코드

long lHmDir = 1;
DWORD uHmsig = 4;
DWORD uZphas = 0;
double dHClrTim = 2000.0, dHOffset = 0.0;
AxmHomeSetMethod(0, lHmDir, uHmsig, uZphas, dHClrTim, dHOffset);
AxmHomeSetVel(0,10000, 5000, 500, 50, 40000, 10000);
AxmHomeSetStart(0);

// (-)방향으로 원점 검색, Home Sensor 이용, Home Sensor Type A 접점, Z상 검출 사용 안 함, Offset 이동 안 함으로 설정.
AxmHomeGetMethod (0, &lHmDir, &uHmsig, &uZphas, &dHClrTim, &dHOffset);

AxmHomeGetVel

Purpose

원점을 빠르고 정밀하게 검색하기 위해 여러 단계의 스텝으로 원점을 검출한다. 이때 각 스텝에 사용될 속도를 반환한다.

A Serviceable Product

BPHR / BPFR BEHR / BEFR PCI-Nx04 PCIe-Nx04
O O O O
PCI-Rxx04 PCIe-Rxx04-RTEX PCI-Rxx04-MLII PCI-Rxx00-MLIII
A4N A5N/A6N PM A4N A5N/A6N PM SGDV SGDV SGD7 PM
O O O O O O O O O O
PCI-Rxx04-SIIIH PCIe-Rxx04-SIIIH PCIe-Rxx05-MLIII PCIe-RxxIF-ECAT
MR-J4-B PM MR-J4-B PM SGDV SGD7 PM Servo PM
O O O O O O O O O
PCIe-Rxx05-ECAT PCIe-Rxx05-ECAT-E
Servo PM Servo PM
O O O O

Format

C++
DWORD AxmHomeGetVel(long lAxisNo, double *dpVelFirst, double *dpVelSecond, double *dpVelThird, double *dpVelLast, double *dpAccFirst, double *dpAccSecond);
C#
uint AxmHomeGetVel(int lAxisNo, ref double dpVelFirst, ref double dpVelSecond, ref double dpVelThird, ref double dpVelLast, ref double dpAccFirst, ref double dpAccSecond);

Parameters

[in/out] Name [Init Value] Explanation
[in]lAxisNo 채널(축) 번호(0 ~ (최대 축 수 - 1))
[out]dpVelFirst [100.0]원점 센서가 감지되어 있지 않을 때 원점 검색 진행 방향으로 구동할 속도
[out]dpVelSecond [100.0]원점 센서가 감지되어 있을 때 원점 검색 진행 반대 방향으로 구동할 속도
[out]dpVelThird [20.0]1차 원점 센서 검출 후 재검색할 때 사용될 구동 속도
[out]dpVelLast [1.0]마지막 원점 검출 시 사용될 구동 속도(Z상 검출 사용 시 속도, 원점 센서 정밀 검출 속도)
[out]dpAccFirst [400.0]원점 센서가 감지되어 있지 않을 때 원점 검색 진행 방향으로 구동할 때 사용될 가속/감속도(감속도의 단위는 Unit/pulse를 1/1로 한 경우에 PPS[Pulses/sec])
[out]dpAccSecond [400.0]원점 센서가 감지되어 있을 때 원점 검색 진행 반대 방향으로 구동할 때 사용될 가속/감속도(감속도의 단위는 Unit/pulse를 1/1로 한 경우에 PPS[Pulses/sec])

Return Values

[0000] AXT_RT_SUCCESS : 함수 실행 성공
[4053] AXT_RT_MOTION_NOT_INITIAL_AXIS_NO : 해당 축 모션 초기화 실패
[4101] AXT_RT_MOTION_INVALID_AXIS_NO : 해당 축이 존재하지 않음

Description

원점을 빠르고 정밀하게 검색하기 위해 여러 단계의 스텝으로 검출한다. 이때 각 스텝에 사용 될 속도를 설정한다. 이 속도들의 설정 값에 따라 원점 검색 시간과, 원점 검색 정밀도가 결정된다. 각 스텝 별 속도들을 적절히 바꿔가면서 각 축의 원점 검색 속도를 설정하면 된다.
(자세한 내용은 AxmMotLoadParaAll 함수 설명 부분 참조)

참고 사항

필요한 데이터만 가지고 올 경우 필요하지 않는 변수에 NULL 을 넣어 사용 가능하다.

예제 코드

long lHmDir = 1;
DWORD uHmsig = 4;
DWORD uZphas = 0;
double dHClrTim = 2000.0, dHOffset = 0.0;
AxmHomeSetMethod(0, lHmDir, uHmsig, uZphas, dHClrTim, dHOffset);
AxmHomeSetVel(0,10000, 5000, 500, 50, 40000, 10000);
AxmHomeSetStart(0);

// (-)방향으로 원점 검색, Home Sensor 이용, Home Sensor Type A 접점, Z상 검출 사용 안함, Offset 이동 안 함으로 설정.
AxmHomeGetMethod (0, &lHmDir, &uHmsig, &uZphas, &dHClrTim, &dHOffset);
AxmHomeGetVel(0, & dVelFirst, & dVelSecond, & dVelThird, & dVelLast, &dAccFirst, & dAccSecond);

AxmHomeSetStart

Purpose

원점 검색 시작 함수를 사용하면 라이브러리 내부에서 해당 축의 원점 검색을 순차적으로 수행한 후 자동 종료된다.

A Serviceable Product

BPHR / BPFR BEHR / BEFR PCI-Nx04 PCIe-Nx04
O O O O
PCI-Rxx04 PCIe-Rxx04-RTEX PCI-Rxx04-MLII PCI-Rxx00-MLIII
A4N A5N/A6N PM A4N A5N/A6N PM SGDV SGDV SGD7 PM
O O O O O O O O O O
PCI-Rxx04-SIIIH PCIe-Rxx04-SIIIH PCIe-Rxx05-MLIII PCIe-RxxIF-ECAT
MR-J4-B PM MR-J4-B PM SGDV SGD7 PM Servo PM
O O O O O O O O O
PCIe-Rxx05-ECAT PCIe-Rxx05-ECAT-E
Servo PM Servo PM
O O O O

Format

C++
DWORD AxmHomeSetStart(long lAxisNo);
C#
uint AxmHomeSetStart(int lAxisNo);

Parameters

[in/out] Name [Init Value] Explanation
[in]lAxisNo 채널(축) 번호(0 ~ (최대 축 수 - 1)) (0 ~ n-1)

Return Values

[0000] AXT_RT_SUCCESS : 함수 실행 성공
[4053] AXT_RT_MOTION_NOT_INITIAL_AXIS_NO : 해당 축 모션 초기화 실패
[4152]AXT_RT_MOTION_ERROR_IN_MOTION : 모션 구동 중에 다른 모션 구동 함수를 실행함

Description

원점 검색 시작 함수를 사용하면 라이브러리 내부에서 해당 축의 원점 검색을 순차적으로 수행한 후 자동 종료된다.

주의 사항

진행 방향과 반대 방향의 리미트 센서가 들어와도 진행 방향의 센서가 ACTIVE 되지 않으면 동작한다. 원점 검색이 시작되어 진행 방향의 리미트 센서가 들어오면 리미트 센서가 감지되었다고 간주되어 다음 단계로 진행된다.

예제 코드

DWORD uHomeResult;

if(AxmHomeSetStart (0) == AXT_RT_SUCCESS) // 원점 검색 시작 함수 실행.
    printf(0 원점 검색을 시작한다.);
else{
AxmHomeGetResult(0, & uHomeResult);
    printf(0 원점 검색을 시작할  없습니다. [에러 코드:%d], uHomeResult);
}

AxmHomeSetResult

Purpose

원점 검색 함수를 이용하여 원점 검색이 성공적으로 수행되고 나면 검색 결과를 출력한다.
원점 검색 함수를 이용하여 원점 검색이 성공적으로 수행되고 나면 검색 결과가 HOME_SUCCESS로 설정된다. 이 함수는 사용자가 원점 검색을 수행하지 않고 결과를 임의로 설정할 수 있다. 실제 원점 검색 완료 후 예외 상황이 발생하면 원점 검색을 다시 수행해야 한다.(위치가 틀어지게 될 경우).
장비 프로그램에서 원점 검색 결과를 보고 이동을 판단할 경우 이 함수를 이용하여 HOME_SUCCESS 외의 값으로 설정하여 원점 검색을 다시 수행하도록 해야 한다.

A Serviceable Product

BPHR / BPFR BEHR / BEFR PCI-Nx04 PCIe-Nx04
O O O O
PCI-Rxx04 PCIe-Rxx04-RTEX PCI-Rxx04-MLII PCI-Rxx00-MLIII
A4N A5N/A6N PM A4N A5N/A6N PM SGDV SGDV SGD7 PM
O O O O O O O O O O
PCI-Rxx04-SIIIH PCIe-Rxx04-SIIIH PCIe-Rxx05-MLIII PCIe-RxxIF-ECAT
MR-J4-B PM MR-J4-B PM SGDV SGD7 PM Servo PM
O O O O O O O O O
PCIe-Rxx05-ECAT PCIe-Rxx05-ECAT-E
Servo PM Servo PM
O O O O

Format

C++
DWORD AxmHomeSetResult(long lAxisNo, DWORD uHomeResult);
C#
uint AxmHomeSetResult(int lAxisNo, uint uHomeResult);

Parameters

[in/out] Name [Init Value] Explanation
[in]lAxisNo 원점 검색 결과를 임의로 설정할 채널(축) 번호(0 ~ (최대 축 수 - 1))
[in]uHomeResult 원점 검색 결과: AXT_MOTION_HOME_RESULT_DEF
- [01h] 원점 검색이 성공적으로 종료됐을 경우
- [02h] 현재 원점 검색이 진행 중일 경우
- [10h] 겐트리 구동 축의 Master축과 Slave축의 원점 검색 결과가 설정한 Offset Range를 벗어났을 경우
- [11h] 원점 검색 중 사용자가 정지 명령을 실행했을 경우
- [12h] 원점 검색 속도 설정 값 중 한 개라도 0보다 작거나 같을 경우
- [13h] 원점 검색 중 서보팩 알람이 발생할 경우
- [14h] (+)방향으로 원점 센서 검출 중 (-)리미트 센서가 감지될 경우
- [15h] (-)방향으로 원점 센서 검출 중 (+)리미트 센서가 감지될 경우
- [16h] 원점 센서가 감지되지 않을 경우
- [FFh] 알 수 없는 채널(축) 번호(0 ~ (최대 축 수 - 1))로 원점 검색을 시작하려 했을 경우

Return Values

[0000] AXT_RT_SUCCESS : 함수 실행 성공
[4053] AXT_RT_MOTION_NOT_INITIAL_AXIS_NO : 해당 축 모션 초기화 실패
[4152] AXT_RT_MOTION_ERROR_IN_MOTION : 모션 구동 중에 다른 모션 구동 함수를 실행함

Description

원점 검색 함수를 이용하여 성공적으로 원점 검색이 수행되고 나면 검색 결과가 HOME_SUCCESS로 설정된다. 이 함수는 사용자가 원점 검색을 수행하지 않고 결과를 임의로 설정할 수 있다. 실제 원점 검색 완료 후 정상 구동 중 예외 상황이 발생하면 원점 검색 결과를 HOME_ERR_USER_BREAK 등의 값으로 설정을 변경할 수 있다.

예제 코드

if(AxmHomeSetResult (0, HOME_ERR_USER_BREAK) == AXT_RT_SUCCESS)
{
    printf(0 원점 검색 결과를 사용자 BREAK로 설정하였습니다.);
}
else
{
    printf(0 원점 검색 결과 설정을 실패하였습니다.);
}

BOOL bRun = TRUE;
DWORD uHomeResult;

AxmHomeSetStart (0);
while(bRun)
{
    //원점 검색 함수를 이용하여 성공적으로 원점 검색이 수행되고 나면 검색 결과를 출력한다.
    AxmHomeGetResult(0, &uHomeResult);
    switch(uHomeResult)
    {
        case HOME_ERR_UNKNOWN:
        printf(  없는  번호임);
        bRun=FALSE;
        break;

        case HOME_ERR_GNT_RANGE:
        printf(Gantry Offset을 벗어났음);
        bRun=FALSE;
        break;

        case HOME_ERR_USER_BREAK:
        printf(원점 검색을 정지함);
        bRun=FALSE;
        break;

        case HOME_ERR_VELOCITY:
        printf(속도 설정이 되어있지 않음.);
        bRun=FALSE;
        break;

        case HOME_ERR_AMP_FAULT:
        printf(서보팩 알람이 발생했음);
        bRun = FALSE;
        break;

        case HOME_ERR_NEG_LIMIT:
        printf((-)리미트 센서가 검출됨);
        bRun = FALSE;
        break;

        case HOME_ERR_POS_LIMIT:
        printf((+)리미트 센서가 검출됨);
        bRun = FALSE;
        break;

        case HOME_SEARCHING:
        printf(현재 원점 검색 진행 중임);
        Sleep(100);
        break;

        case HOME_SUCCESS:
        printf(원점 검색 성공함);
        bRun = FALSE;
        break;
    }
}

AxmHomeGetResult

Purpose

원점 검색 함수의 검색 결과를 확인한다. 원점 검색이 시작되면 곧바로 HOME_SEARCHING으로 설정되며 원점 검색에 실패하면 실패 원인이 설정된다. 실패 원인을 제거한 후 다시 원점 검색을 진행하면 된다.

A Serviceable Product

BPHR / BPFR BEHR / BEFR PCI-Nx04 PCIe-Nx04
O O O O
PCI-Rxx04 PCIe-Rxx04-RTEX PCI-Rxx04-MLII PCI-Rxx00-MLIII
A4N A5N/A6N PM A4N A5N/A6N PM SGDV SGDV SGD7 PM
O O O O O O O O O O
PCI-Rxx04-SIIIH PCIe-Rxx04-SIIIH PCIe-Rxx05-MLIII PCIe-RxxIF-ECAT
MR-J4-B PM MR-J4-B PM SGDV SGD7 PM Servo PM
O O O O O O O O O
PCIe-Rxx05-ECAT PCIe-Rxx05-ECAT-E
Servo PM Servo PM
O O O O

Format

C++
DWORD AxmHomeGetResult(long lAxisNo, DWORD *upHomeResult);
C#
uint AxmHomeGetResult(int lAxisNo, ref uint upHomeResult);

Parameters

[in/out] Name [Init Value] Explanation
[in]lAxisNo 원점 검색 결과를 임의로 설정 할 채널(축) 번호(0 ~ (최대 축 수 - 1))
[out]upHomeResult 원점 검색 결과: AXT_MOTION_HOME_RESULT_DEF
- [01h] 원점 검색이 성공적으로 종료됐을 경우
- [02h] 현재 원점 검색이 진행 중일 경우
- [10h] 겐트리 구동 축의 Master축과 Slave축의 원점 검색 결과가 설정한 OffsetRange를 벗어났을 경우
- [11h] 원점 검색 중 사용자가 정지 명령을 실행했을 경우
- [12h] 원점 검색 속도 설정 값 중 한 개라도 0보다 작거나 같을 경우
- [13h] 원점 검색 중 서보팩 알람이 발생할 경우
- [14h] (+)방향으로 원점 센서 검출 중 (-)리미트 센서가 감지될 경우
- [15h] (-)방향으로 원점 센서 검출 중 (+)리미트 센서가 감지될 경우
- [16h] 원점 센서가 감지되지 않을 경우
- [FFh] 알 수 없는 채널(축) 번호(0 ~ (최대 축 수 - 1))로 원점 검색을 시작하려 했을 경우

원점 검색 성공 후 다시 원점 검색을 수행하게되면 원점 검색 결과가 초기화되어 재설정된다. 다시 진행 중 정지 명령(AxmMoveSStop)함수를 이용하여 정지하면 HOME_USER_BREAK 로 설정된다.

Return Values

[0000] AXT_RT_SUCCESS : 함수 실행 성공
[4053] AXT_RT_MOTION_NOT_INITIAL_AXIS_NO : 해당 축 모션 초기화 실패
[4101] AXT_RT_MOTION_INVALID_AXIS_NO : 해당 축이 존재하지 않음

Description

원점 검색 함수의 검색 결과를 확인한다. 원점 검색이 시작되면 HOME_SEARCHING 으로 설정되며 원점 검색에 실패하면 실패 원인이 설정된다. 실패 원인을 제거한 후 다시 원점 검색을 진행하면 된다. 검색 결과 값은 라이브러리가 Close 된 후, 다시 Open 시에도 값이 유지되지만, 서보드라이브가 Off 시 해당 값은 초기화된다.

예제 코드

if(AxmHomeSetResult (0, HOME_ERR_USER_BREAK) == AXT_RT_SUCCESS)
{
    printf(0 원점 검색 결과를 사용자 BREAK로 설정하였습니다.);
}else{
    printf(0 원점 검색 결과 설정을 실패하였습니다.);
}

BOOL bRun = TRUE;
DWORD uHomeResult;

AxmHomeSetStart (0);
while(bRun)
{
    // 원점 검색 결과 확인.
    AxmHomeGetResult(0, &uHomeResult);
    switch(uHomeResult)
    {
        case HOME_ERR_UNKNOWN:
        printf(  없는  번호임);
        bRun = FALSE;
        break;

        case HOME_ERR_GNT_RANGE:
        printf(Gantry Offset을 벗어났음);
        bRun = FALSE;
        break;

        case HOME_ERR_USER_BREAK:
        printf(원점 검색을 정지함);
        bRun = FALSE;
        break;

        case HOME_ERR_VELOCITY:
        printf(속도 설정이 되어있지 않음.);
        bRun = FALSE;
        break;

        case HOME_ERR_AMP_FAULT:
        printf(서보팩 알람이 발생했음);
        bRun = FALSE;
        break;

        case HOME_ERR_NEG_LIMIT:
        printf((-)리미트 센서가 검출됨);
        bRun = FALSE;
        break;

        case HOME_ERR_POS_LIMIT:
        printf((+)리미트 센서가 검출됨);
        bRun = FALSE;
        break;

        case HOME_SEARCHING:
        printf(현재 원점 검색 진행 중임);
        Sleep(100);
        break;

        case HOME_SUCCESS:
        printf(원점 검색 성공함);
        bRun = FALSE;
        break;
    }
}

AxmHomeGetRate

Purpose

원점 검색 시작되면 진행률을 확인할 수 있다. 원점 검색이 완료되면 성공 여부와 관계없이 100 을 반환하게 된다. 원점 검색 성공 여부는 AxmHomeGetResult 함수를 이용하여 확인할 수 있다.

A Serviceable Product

BPHR / BPFR BEHR / BEFR PCI-Nx04 PCIe-Nx04
O O O O
PCI-Rxx04 PCIe-Rxx04-RTEX PCI-Rxx04-MLII PCI-Rxx00-MLIII
A4N A5N/A6N PM A4N A5N/A6N PM SGDV SGDV SGD7 PM
O O O O O O O O O O
PCI-Rxx04-SIIIH PCIe-Rxx04-SIIIH PCIe-Rxx05-MLIII PCIe-RxxIF-ECAT
MR-J4-B PM MR-J4-B PM SGDV SGD7 PM Servo PM
O O O O O O O O O
PCIe-Rxx05-ECAT PCIe-Rxx05-ECAT-E
Servo PM Servo PM
O O O O

Format

C++
DWORD AxmHomeGetRate(long lAxisNo, DWORD *upHomeMainStepNumber, DWORD *upHomeStepNumber);
C#
uint AxmHomeGetRate(int lAxisNo, ref uint upHomeMainStepNumber, ref uint upHomeStepNumber);

Parameters

[in/out] Name [Init Value] Explanation
[in]lAxisNo 원점 검색 진행률을 확인할 채널(축) 번호(0부터 시작함)
[out]upHomeMainStepNumber Main Step 진행율( 0 – 100)
- 겐트리가 FALSE일 경우 upHomeMainStep Number이 0일 때면 선택 한 축만 진행 사항이고, 홈 진행률은 upHomeStepNumber로 알 수 있다.
- 겐트리가 TRUE일 경우 upHomeMainStep Number이 0일 때면 마스터 홈이 진행 사항이고, 마스터 홈 진행률은 upHomeStep Number로 알 수 있다.
- 겐트리가 TRUE일 경우 upHomeMainStep Number이 10일 때면 슬레이브 홈이 진행 사항이고, 마스터 홈 진행률은 upHomeStepNumber 로 알 수 있다.
[out]upHomeStepNumber 원점 검색 진행률을 확인
- [0]라이브러리가 초기화되어 있지 않을 경우, 유효하지 않은 채널(축) 번호(0 ~ (최대 축 수 - 1)) 일 경우 원점 검색이 진행 중이지 않을 경우(단위:%)
- [0~99]원점 검색 진행률(단위: %)
- [100]원점 검색이 완료됐을 경우(단위:%)

Return Values

[0000] AXT_RT_SUCCESS : 함수 실행 성공
[4053] AXT_RT_MOTION_NOT_INITIAL_AXIS_NO : 해당 축 모션 초기화 실패
[4101] AXT_RT_MOTION_INVALID_AXIS_NO : 해당 축이 존재하지 않음

Description

원점 검색이 시작되면 진행률을 확인할 수 있다. 원점 검색이 완료되면 성공 여부와 관계없이 진행률로 100 을 반환하게 된다. 원점 검색 성공 여부는 AxmHomeGetResult 함수를 이용하여 확인할 수 있다.

예제 코드

BOOL bRun = TRUE;
DWORD uHomeResult, uHomeStepNumber,uHomeMainStepNumber;

AxmHomeSetStart(0);
while(bRun)
{
    AxmHomeGetResult(0, &uHomeResult);
    switch(uHomeResult)
    {
        case HOME_ERR_UNKNOWN:
        printf(  없는  번호임);
        bRun = FALSE;
        break;

        case HOME_ERR_GNT_RANGE:
        printf(Gantry Offset을 벗어났음);
        bRun = FALSE;
        break;

        case HOME_ERR_USER_BREAK:
        printf(원검 검색을 정지함);
        bRun = FALSE;
        break;

        case HOME_ERR_VELOCITY:
        printf(속도 설정이 되어있지 않음.);
        bRun = FALSE;
        break;

        case HOME_ERR_AMP_FAULT:
        printf(서보팩 알람이 발생했음);
        bRun = FALSE;
        break;

        case HOME_ERR_NEG_LIMIT:
        printf((-)리미트 센서가 검출됨);
        bRun = FALSE;
        break;

        case HOME_ERR_POS_LIMIT:
        printf((+)리미트 센서가 검출됨);
        bRun = FALSE;
        break;

        case HOME_SEARCHING:
        // 진행률 확인 .
        AxmHomeGetRate( 0, &uHomeMainStepNumber , &uHomeStepNumber);
        printf(“\t현재 원점 검색 %d% 진행 , uHomeStepNumber);
        Sleep(100);
        break;

        case HOME_SUCCESS:
        printf(원점 검색 성공함);
        bRun = FALSE;
        break;
    }
}

AxmMoveStartTorque

Purpose

지정 축의 설정한 토크 및 속도값으로 모터를 구동한다.

A Serviceable Product

BPHR / BPFR BEHR / BEFR PCI-Nx04 PCIe-Nx04
PCI-Rxx04 PCIe-Rxx04-RTEX PCI-Rxx04-MLII PCI-Rxx00-MLIII
A4N A5N/A6N PM A4N A5N/A6N PM SGDV SGDV SGD7 PM
O O
PCI-Rxx04-SIIIH PCIe-Rxx04-SIIIH PCIe-Rxx05-MLIII PCIe-RxxIF-ECAT
MR-J4-B PM MR-J4-B PM SGDV SGD7 PM Servo PM
O O
PCIe-Rxx05-ECAT PCIe-Rxx05-ECAT-E
Servo PM Servo PM

Format

C++
DWORD AxmMoveStartTorque(long lAxisNo, double dTorque, double dVel, DWORD uAccFilterSel, DWORD uGainSel, DWORD uSpdLoopSel);
C#
uint AxmMoveStartTorque(int lAxisNo, double dTorque, double dVel, uint uAccFilterSel, uint uGainSel, uint uSpdLoopSel);

Parameters

[in/out] Name [Init Value] Explanation
[in]lAxisNo 채널(축) 번호(0 ~ (최대 축 수 - 1))
[in]dTorque 최대 출력 토크에 대한 %값
[in]dVel 최대 모터 구동 속도에 대한 %값
[in]uAccFilterSel 가속 모드 설정
- [00h] LINEAR_ACCDCEL
- [01h] EXPO_ACCELDCEL
- [02h] SCURVE_ACCELDECEL
[in]uSpdLoopSel 제어 Loop 설정
- [00h] PI_LOOP
- [01h] P_LOOP

Return Values

[0000] AXT_RT_SUCCESS : 함수 실행 성공
[4053] AXT_RT_MOTION_NOT_INITIAL_AXIS_NO : 해당 축 모션 초기화 실패
[4101] AXT_RT_MOTION_INVALID_AXIS_NO : 해당 축이 존재하지 않음

Description

설정한 토크 및 속도값으로 모터를 구동한다. PCI-R1604MLII 전용 함수이며 Sigma 5 전용 함수이다.
구동 방향은 dTorque 값이 양수이면 CW, 음수이면 CCW 로 구동한다.

예제 코드

// 0축을 최대 출력의 50% 토크와 50%의 속도로 CW구동, 구동이 시작되면 함수를 빠져나온다.
Double dTorduq = 50;
Double dVel = 50;
AxmMoveStartTorque(0, dTorduq, dVel, 0, 0, 0);

AxmMoveTorqueStop

Purpose

지정 축의 토크 구동을 정지한다.

A Serviceable Product

BPHR / BPFR BEHR / BEFR PCI-Nx04 PCIe-Nx04
PCI-Rxx04 PCIe-Rxx04-RTEX PCI-Rxx04-MLII PCI-Rxx00-MLIII
A4N A5N/A6N PM A4N A5N/A6N PM SGDV SGDV SGD7 PM
O O
PCI-Rxx04-SIIIH PCIe-Rxx04-SIIIH PCIe-Rxx05-MLIII PCIe-RxxIF-ECAT
MR-J4-B PM MR-J4-B PM SGDV SGD7 PM Servo PM
O O
PCIe-Rxx05-ECAT PCIe-Rxx05-ECAT-E
Servo PM Servo PM

Format

C++
DWORD AxmMoveTorqueStop(long lAxisNo, DWORD uMethod);
C#
uint AxmMoveTorqueStop(int lAxisNo, uint uMethod);

Parameters

[in/out] Name [Init Value] Explanation
[in]lAxisNo 채널(축) 번호(0 ~ (최대 축 수 - 1))
[in]uMethod 정지 모드 설정
- [00h] 1ST 또는 2ND의 일정한 리니어 감속률에 따른 정지
- [01h] 즉시 정지
- [02h] 정지를 위한 일정한 리니어 감속률에 따른 정지

Return Values

[0000] AXT_RT_SUCCESS : 함수 실행 성공
[4053] AXT_RT_MOTION_NOT_INITIAL_AXIS_NO : 해당 축 모션 초기화 실패
[4101] AXT_RT_MOTION_INVALID_AXIS_NO : 해당 축이 존재하지 않음

Description

현재 구동 중인 토크 구동을 정지하는 함수. AxmMoveStartTorque 후 반드시 AxmMoveTorqueStop 를 실행하여야 한다.

예제 코드

// 0축 토크 구동 정지.
AxmMoveTorqueStop(0, 0);

AxmMoveStop

Purpose

현재 구동 중인 모션 동작을 사용자가 준 감속율로 정지하는 함수이다.

A Serviceable Product

BPHR / BPFR BEHR / BEFR PCI-Nx04 PCIe-Nx04
O O O O
PCI-Rxx04 PCIe-Rxx04-RTEX PCI-Rxx04-MLII PCI-Rxx00-MLIII
A4N A5N/A6N PM A4N A5N/A6N PM SGDV SGDV SGD7 PM
O O O O O O O O O O
PCI-Rxx04-SIIIH PCIe-Rxx04-SIIIH PCIe-Rxx05-MLIII PCIe-RxxIF-ECAT
MR-J4-B PM MR-J4-B PM SGDV SGD7 PM Servo PM
O O O O O O O O O
PCIe-Rxx05-ECAT PCIe-Rxx05-ECAT-E
Servo PM Servo PM
O O O O

Format

C++
DWORD AxmMoveStop(long lAxisNo, double dDecel);
C#
uint AxmMoveStop(int lAxisNo, double dDecel);

Parameters

[in/out] Name [Init Value] Explanation
[in]lAxisNo 채널(축) 번호(0 ~ (최대 축 수 - 1))
[in]dDecel 정지 시 감속율 값

Return Values

[0000] AXT_RT_SUCCESS : 함수 실행 성공
[4053] AXT_RT_MOTION_NOT_INITIAL_AXIS_NO : 해당 축 모션 초기화 실패
[4101] AXT_RT_MOTION_INVALID_AXIS_NO : 해당 축이 존재하지 않음

Description

현재 구동 중인 모션 동작을 임의의 감속율로 중지하는 함수이다.

move-stop

예제 코드

// 0축 모션 구동 급정지.
AxmMoveStop(0, 0);

AxmMoveEStop

Purpose

현재 구동 중인 모션 동작을 급정지하는 함수이다.

A Serviceable Product

BPHR / BPFR BEHR / BEFR PCI-Nx04 PCIe-Nx04
O O O O
PCI-Rxx04 PCIe-Rxx04-RTEX PCI-Rxx04-MLII PCI-Rxx00-MLIII
A4N A5N/A6N PM A4N A5N/A6N PM SGDV SGDV SGD7 PM
O O O O O O O O O O
PCI-Rxx04-SIIIH PCIe-Rxx04-SIIIH PCIe-Rxx05-MLIII PCIe-RxxIF-ECAT
MR-J4-B PM MR-J4-B PM SGDV SGD7 PM Servo PM
O O O O O O O O O
PCIe-Rxx05-ECAT PCIe-Rxx05-ECAT-E
Servo PM Servo PM
O O O O

Format

C++
DWORD AxmMoveEStop(long lAxisNo);
C#
uint AxmMoveEStop(int nAxisNo);

Parameters

[in/out] Name [Init Value] Explanation
[in]lAxisNo 채널(축) 번호(0 ~ (최대 축 수 - 1))

Return Values

[0000] AXT_RT_SUCCESS : 함수 실행 성공
[4053] AXT_RT_MOTION_NOT_INITIAL_AXIS_NO : 해당 축 모션 초기화 실패
[4101] AXT_RT_MOTION_INVALID_AXIS_NO : 해당 축이 존재하지 않음

Description

현재 구동 중인 모션 동작을 감속없이 급정지하는 함수이다.

move-stop

예제 코드

// 0축 모션 구동 급정지.
AxmMoveEStop(0);

AxmMoveSStop

Purpose

현재 구동 중인 모션 동작을 감속 정지하는 함수이다.

A Serviceable Product

BPHR / BPFR BEHR / BEFR PCI-Nx04 PCIe-Nx04
O O O O
PCI-Rxx04 PCIe-Rxx04-RTEX PCI-Rxx04-MLII PCI-Rxx00-MLIII
A4N A5N/A6N PM A4N A5N/A6N PM SGDV SGDV SGD7 PM
O O O O O O O O O O
PCI-Rxx04-SIIIH PCIe-Rxx04-SIIIH PCIe-Rxx05-MLIII PCIe-RxxIF-ECAT
MR-J4-B PM MR-J4-B PM SGDV SGD7 PM Servo PM
O O O O O O O O O
PCIe-Rxx05-ECAT PCIe-Rxx05-ECAT-E
Servo PM Servo PM
O O O O

Format

C++
DWORD AxmMoveSStop(long lAxisNo);
C#
uint AxmMoveSStop(int lAxisNo);

Parameters

[in/out] Name [Init Value] Explanation
[in]lAxisNo 채널(축) 번호(0 ~ (최대 축 수 - 1))

Return Values

[0000] AXT_RT_SUCCESS : 함수 실행 성공
[4053] AXT_RT_MOTION_NOT_INITIAL_AXIS_NO : 해당 축 모션 초기화 실패
[4101] AXT_RT_MOTION_INVALID_AXIS_NO : 해당 축이 존재하지 않음

Description

현재 구동 중인 처음에 사용자가 입력한 가속도만큼 모션 동작을 감속하면서 정지하는 함수이다.

move-stop

예제 코드

// 0축 모션 구동 감속 정지.
AxmMoveSStop(0);

AxmMoveCoordStop

Purpose

Coordinate Motion 을 경로상에서 감속정지(dDecel) 시킨다.

A Serviceable Product

BPHR / BPFR BEHR / BEFR PCI-Nx04 PCIe-Nx04
PCI-Rxx04 PCIe-Rxx04-RTEX PCI-Rxx04-MLII PCI-Rxx00-MLIII
A4N A5N/A6N PM A4N A5N/A6N PM SGDV SGDV SGD7 PM
PCI-Rxx04-SIIIH PCIe-Rxx04-SIIIH PCIe-Rxx05-MLIII PCIe-RxxIF-ECAT
MR-J4-B PM MR-J4-B PM SGDV SGD7 PM Servo PM
O O O O O
PCIe-Rxx05-ECAT PCIe-Rxx05-ECAT-E
Servo PM Servo PM
O O O O

Format

C++
DWORD AxmMoveCoordStop(long lCoordNo, double dDecel);
C#
uint AxmMoveCoordStop(int lCoordNo, double dDecel);

Parameters

[in/out] Name [Init Value] Explanation
[in]lCoordNo 좌표계 번호(0~7)
[in]dDecel 감속도

Return Values

[0000] AXT_RT_SUCCESS : AXL 라이브러리 초기화 성공
[4111]AXT_RT_MOTION_INVALID_FILE_LOAD : 모션 설정 값이 저장된 파일의 로드가 안됨

Description

Coordinate Motion 을 경로상에서 감속정지(dDecel)시킨다.

예제 코드

long lAxis[2];
double dPos[2], dDecel = 1000;
long lPosSize = 2;
long lCoordNo = 0;

dPos[0] = 4000;
dPos[1] = 4000;
lAxis[0] = 0;
lAxis[1] = 1;

AxmContiWriteClear(lCoordNo);
AxmContiSetAxisMap(lCoordNo, lPosSize, lAxis);

//상대 위치 구동.
AxmContiSetAbsRelMode(lCoordNo, 1);

// 직선 보간 구동.
AxmLineMove(lCoordNo, dPos, 200, 400, 400);

//0번 좌표계를 감속도 1000으로 정지시킨다.
 AxmMoveCoordStop(lCoordNo, dDe

AxmMoveCoordEStop

Purpose

Coordinate Motion 을 경로상에서 급정지시킨다.

A Serviceable Product

BPHR / BPFR BEHR / BEFR PCI-Nx04 PCIe-Nx04
PCI-Rxx04 PCIe-Rxx04-RTEX PCI-Rxx04-MLII PCI-Rxx00-MLIII
A4N A5N/A6N PM A4N A5N/A6N PM SGDV SGDV SGD7 PM
PCI-Rxx04-SIIIH PCIe-Rxx04-SIIIH PCIe-Rxx05-MLIII PCIe-RxxIF-ECAT
MR-J4-B PM MR-J4-B PM SGDV SGD7 PM Servo PM
O O O O O
PCIe-Rxx05-ECAT PCIe-Rxx05-ECAT-E
Servo PM Servo PM
O O O O

Format

C++
DWORD AxmMoveCoordEStop(long lCoordNo);
C#
uint AxmMoveCoordEStop(int lCoordNo);

Parameters

[in/out] Name [Init Value] Explanation
[in]lCoordNo 좌표계 번호(0~7)

Return Values

[0000] AXT_RT_SUCCESS : AXL 라이브러리 초기화 성공
[4112] AXT_RT_MOTION_INVALID_FILE_SAVE : 모션 설정값을 저장하는 파일 저장에 실패함

Description

Coordinate Motion 을 경로상에서 급정지시킨다.

예제 코드

long lAxis[2];
double dPos[2], dDecel = 1000;
long lPosSize = 2;
long lCoordNo = 0;

dPos[0] = 4000;
dPos[1] = 4000;
lAxis[0] = 0;
lAxis[1] = 1;

AxmContiWriteClear(lCoordNo);
AxmContiSetAxisMap (lCoordNo, lPosSize, lAxis);

//상대위치 구동.
AxmContiSetAbsRelMode(lCoordNo, 1);

// 직선보간 구동.
AxmLineMove(lCoordNo, dPos, 200, 400, 400);

//0번 좌표계를 급정지시킨다.
 AxmMoveCoordEStop(lCoordNo);

AxmMoveCoordSStop

Purpose

Coordinate Motion 을 경로상에서 감속정지 시킨다.

A Serviceable Product

BPHR / BPFR BEHR / BEFR PCI-Nx04 PCIe-Nx04
PCI-Rxx04 PCIe-Rxx04-RTEX PCI-Rxx04-MLII PCI-Rxx00-MLIII
A4N A5N/A6N PM A4N A5N/A6N PM SGDV SGDV SGD7 PM
PCI-Rxx04-SIIIH PCIe-Rxx04-SIIIH PCIe-Rxx05-MLIII PCIe-RxxIF-ECAT
MR-J4-B PM MR-J4-B PM SGDV SGD7 PM Servo PM
O O O O O
PCIe-Rxx05-ECAT PCIe-Rxx05-ECAT-E
Servo PM Servo PM
O O O O

Format

C++
DWORD AxmMoveCoordSStop(long lCoordNo);
C#
uint AxmMoveCoordSStop(int lCoordNo);

Parameters

[in/out] Name [Init Value] Explanation
[in]lCoordNo 좌표계 번호(0~7)

Return Values

[0000] AXT_RT_SUCCESS : 함수 실행 성공
[4053] AXT_RT_MOTION_NOT_INITIAL_AXIS_NO : 해당 축 모션 초기화 실패
[4101] AXT_RT_MOTION_INVALID_AXIS_NO : 해당 축이 존재하지 않음

Description

Coordinate Motion 을 경로상에서 감속정지 시킨다. 감속도는 Motion 을 구동시킨 함수에서 설정한 값을 따른다.

예제 코드

long lAxis[2];
double dPos[2], dDecel = 1000;
long lPosSize = 2;
long lCoordNo = 0;

dPos[0] = 4000;
dPos[1] = 4000;
lAxis[0] = 0;
lAxis[1] = 1;

AxmContiWriteClear(lCoordNo);
AxmContiSetAxisMap(lCoordNo, lPosSize, lAxis);

//상대위치 구동.
AxmContiSetAbsRelMode(lCoordNo, 1);

// 직선보간 구동.
AxmLineMove(lCoordNo, dPos, 200, 400, 400);

//0번 좌표계를 감속정지시킨다.
 AxmMoveCoordSStop(lCoordNo);