Skip to content

다축 구동 (Multi Move)

일반적으로 장비에서의 구동시스템은 여러 축을 한꺼번에 일정한 위치로 이동시켜야 하거나, 일정한 패턴으로 각 축들이 서로 연관된 운동을 해야 하는 경우도 많이 있다. 이러한 구동을 위해서 다축구동 함수를 제공한다.

다축구동을 위한 설정은 앞에서 해왔던 단축 구동설정을 모든 축에 대해서 각각 설정 해주면 된다. 예를 들어 축이 2개가 있다면, 단축구동함수에서의 설정을 0축과 1축에 대해서 각각 설정해주면 되는 것이다.

다축구동 함수는 여러 축을 설정된 위치와 속도로 한꺼번에 움직이게 하는 다축 위치구동과 특정 위치까지의 두 축 보간구동, 일정한 위치까지 여러 축들을 일정한 경로를 따라 구동하게 하는 연속보간구동으로 나뉘어 진다.

1. 다축 위치 구동

다축위치구동은 단축구동에서의 위치구동이 두 축에서 동시에 이루어지는 것이라고 볼 수 있다. 현재 위치에 서 입력해준 각 축의 종료위치로 축들을 동시에 출발시키는데, 두 축의 이동 속도나 가속도 등은 개별 설정 이 가능하다. 이러한 다축 위치구동은 종점탈출 함수인 AxmMoveMultiPos 함수 시점탈출 함수인 AxmMoveStartMultiPos 함수가 있다

두 함수는 시점탈출인지 종점탈출인지의 차이만 있을 뿐 입력되는 인자는 동일하다. 여기서 축번호는 반드시 오름차순으로 순서대로 입력해야 한다. 아래의 예제는 0축과 1축이 각각 100과 50의 위치로 동일한 속도와 가속도로 이동하도록 하는 예제이다. 위치구동함수는 보간구동이 아니며, 각각의 축에 설정된 위치, 속도, 가 속도 등의 값에 따라 개별적으로 움직인다. 단지 출발만 동시에 한다는 것 외에 차이점이 없다. 당연히 1축 이 0축보다 목표지점에 먼저 도달하게 되며 1축은 정지된 상태에서 0축은 계속 움직이게 된다. 종점탈출함수 인 AxmMoveMultiPos 함수는 명령을 내린 모든 축이 정지해야 함수에서 빠져 나와 프로그램상의 다음 명령 을 실행한다.

//0축을상대좌표로 (100,50)위치까지대칭 S자구동모드로이동 (속도 100, 가속도 200)
DWORD uAbsRelMode = 0;
DWORD uProfileMode = 3;
AxmMotSetAbsRelMode(lAxisNo, uAbsRelMode);
AxmMotSetProfileMode(lAxisNo, uProfileMode);
long lArraySize = 2;
long lAxisNo[2] = {0,1};
double dPosition[2] = {100,50};
double dMaxVelocity[2] = {100,100};
double dMaxAccel[2] = {200,200};
double dMaxDecel[2] = {200,200};
AxmMoveMultiPos(lArraySize,lAxisNo,dPosition,dMaxVelocity,dMaxAccel,dMaxDecel);

시점탈출 함수인 AxmMoveStartMultiPos 함수를 사용하고자 한다면 다음과 같이 한다. 시점탈출이므로 구동 이 시작되고 바로 다음 함수가 실행되며, 구동의 종료여부를 확인하고자 한다면 각 축에 대해서 AxmStatusReadInMotion 함수를 사용한다.

//0축을상대좌표로 (100,50)위치까지대칭 S자구동모드로이동 (속도 100, 가속도 200)
DWORD uAbsRelMode = 0;
DWORD uProfileMode = 3;
AxmMotSetAbsRelMode(lAxisNo, uAbsRelMode);
AxmMotSetProfileMode(lAxisNo, uProfileMode);

long lArraySize = 2;
long lAxesNo[2] = {0,1};
double dPosition[2] = {100,50};
double dMaxVelocity[2] = {100,100};
double dMaxAccel[2] = {200,200};
double dMaxDecel[2] = {200,200};
AxmMoveStartMultiPos(lArraySize, lAxesNo, dPosition, dMaxVelocity, dMaxAccel,dMaxDecel);
//모션이모두종료될때까지기다린다.
BOOL WaitForDone = TRUE;
DWORD uStatus1, uStatus2;

while(WaitForDone) 
{
    AxmStatusReadInMotion(lAxesNo[0], &uStatus1);
    AxmStatusReadInMotion(lAxesNo[1], &uStatus2);
    If(uStatus1 == 0 &&uStatus2 == 0)
        WaitForDone = FALSE;
}
// Ex11_AXM_MultiPositionDrive.cpp:Defines the entry point for the console application.
// 2축기구부의원점을잡은후 (100,50)위치까지이동하다가다시원점으로복귀한다.
#include "stdafx.h"
#include "AXL.h"
#include <conio.h>
#include "stdio.h"

#define AXIS_0 0
#define AXIS_1 1

void main(void)
{
    // 라이브러리를초기화한다.
    // 7은 IRQ를뜻한다. PCI에서자동으로 IRQ가설정된다.
    DWORD Code = AxlOpen(7);

    if (Code == AXT_RT_SUCCESS)
    {
        printf("라이브러리가초기화되었습니다.\n");
        //모션모듈이있는지검사
        DWORD dwStatus;
        Code = AxmInfoIsMotionModule(&dwStatus);

        if (Code == AXT_RT_SUCCESS)
        {
            if (dwStatus == STATUS_EXIST)
            {
                printf("모션모듈이존재합니다.\n");
                for (int nAxisNo = 0; nAxisNo < 2; nAxisNo++)
                {
                    // 0축의 +End limit 과 -End limit 의 Active level 을 HIGH와급정지로설정한다.
                    long lArraySize = 2;
                    long lAxesNo[2] = { 0,1 };
                    double dPosition[2], dMaxVelocity[2], dMaxAccel[2], dMaxDecel[2];

                    printf("\n사다리꼴속도프로파일로 0축은 (+)100만큼, 1축은 (+)50만큼이동(종점탈출)\n");
                    printf("아무키나누르면구동을시작합니다.\n");

                    getch();

                    for (nAxisNo = 0; nAxisNo < 1; nAxisNo++) 
                    {
                        AxmMotSetAbsRelMode(nAxisNo, 1); //상대좌표로설정
                        AxmMotSetProfileMode(nAxisNo, 0); //대칭사다리꼴속도프로파일로설정
                    }

                    dPosition[0] = 100; dPosition[1] = 50;
                    dMaxVelocity[0] = 100; dMaxVelocity[1] = 100;
                    dMaxAccel[0] = 200; dMaxAccel[1] = 200;
                    dMaxDecel[0] = 200; dMaxDecel[1] = 200;
                    AxmMoveMultiPos(lArraySize, lAxesNo, dPosition, dMaxVelocity, dMaxAccel, dMaxDecel);

                    printf("구동을완료하였습니다.\n");
                    printf("S자속도프로파일로원점으로이동 (시점탈출)\n");
                    printf("아무키나누르면구동을시작합니다.");

                    getch();

                    for (nAxisNo = 0; nAxisNo < 1; nAxisNo++) 
                    {
                        AxmMotSetAbsRelMode(nAxisNo, 0); //절대좌표로설정
                        AxmMotSetProfileMode(nAxisNo, 3); //대칭 S자속도프로파일로설정
                    }

                    dPosition[0] = 0; dPosition[1] = 0;
                    dMaxVelocity[0] = 100; dMaxVelocity[1] = 100;
                    dMaxAccel[0] = 200; dMaxAccel[1] = 200;
                    dMaxDecel[0] = 200; dMaxDecel[1] = 200;
                    AxmMoveStartMultiPos(lArraySize, lAxesNo, dPosition, dMaxVelocity, dMaxAccel, dMaxDecel);

                    //모션이모두종료될때까지기다린다.
                    BOOL WaitForDone = TRUE;
                    DWORD uStatus0, uStatus1;

                    while (WaitForDone) 
                    {
                        AxmStatusReadInMotion(AXIS_0, &uStatus0);
                        AxmStatusReadInMotion(AXIS_1, &uStatus1);
                        if (uStatus0 == 0 && uStatus1 == 0)
                            WaitForDone = FALSE;
                    }
                    printf("구동을완료하였습니다.\n");

                    //Servo Off
                    AxmSignalServoOn(0, DISABLE);
                    AxmSignalServoOn(1, DISABLE);
                }
            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");
    }

1.1. 다축 위치 구동 함수 리스트

Function Description
AxmMoveMultiPos 지정 축들의 절대 좌표로 설정된 위치까지 설정된 속도와 가속율로 구동을 한다.속도 프로파일은 AxmMotSetProfileMode 함수에서 설정한다. 펄스가 출력되는 시점에서 함수를 벗어난다.
AxmMoveStartMultiPos 지정 축들의 절대 좌표로 설정된 위치까지 설정된 속도와 가속율로 구동을 한다.속도 프로파일은 AxmMotSetProfileMode 함수에서 설정한다. 펄스 출력이 종료되는 시점에서 함수를 벗어난다.

2. 보간 구동

단순 다축 위치구동은 두 축이 동시에 출발해서 각각의 동작을 수행하는 모션 구동인데 비하여 여러 축이 상 호 연관된 움직임을 통해 직선 또는 원호의 지정된 경로를 따라 이동해야 하는 경우 직선보간, 원호보간 구 동이 사용된다. 직선 및 원호 보간을 연속적으로 수행하여 다양한 이동 구간을 끊김없이 구동할수 있는 연속 보간구동 기능도 제공된다. AXL에서 지원하는 모션 제어기는 4축 단위로 보간 그룹을 만들 수 있다. 즉 각 모션 제어기의 제어 가능 축 들을 낮은 축번호 순으로 4개씩 그룹을 나누고 나누어진 그룹에 속한 4개의 축들 중 2축,3축,4축에 대하여 보간이 가능하다(원호보간의 경우 2축에 한함). 보간 함수를 실행하면 현재 위치로부터 입력된 종료점까지 특 정 속도 및 가속도로 두 축이 적절히 구동하는데 위치 경로를 생성하는 모션 제어기의 이동경로에 대한 오차 는 ±0.5 pulse이며, 모눈종이에 직선 또는 원호를 그리고, 그려진 경로와 가장 가까운 모눈종이 눈금을 따라 가는 선을 그렸을때 이동 경로가 가지는 오차와 동일하다. 보간 구동을 위해서는 보간 구동 축들에 대하여 좌표계를 생성하여야 하며, 각 좌표계에 대한 구동 모드등을 설정하여야한다. Note) 이러한 보간구동의 속도프로파일 및 절대/상대좌표 구동에 대한 설정은 보간구동되는 축들 중에 가장 축번호가 빠른 축을 따라 가도록 되어 있으므로 설정에 주의하기 바란다.

  • 직선 보간 구동

    직선 보간구동 함수는 AxmLineMove 함수를 사용하여 두 개의 축을 직선 보간구동 시킨다.

    //상대위치(100,50)까지 S자구동으로보간구동
    long lSize = 2;
    long lAxesNo = {0,1};
    double dPosition = {100,50};
    double dMaxVelocity = 100;
    double dMaxAccel = 200;
    double dMaxDecel = 200;
    long lCoordinate = 0;
    
    DWORD uAbsRelMode = 1; 
    DWORD uProfileMode = 3;
    
    AxmContiWriteClear(lCoordinate);
    AxmContiSetAxisMap(lCoordinate, lSize, lAxesNo);
    AxmContiSetAbsRelMode(lCoordinate, uAbsRelMode);// 상대위치구동으로설정
    
    AxmLineMove(lCoordinate, dPosition, dMaxVelocity, dMaxAccel, dMaxDecel);
    
  • 원호 보간 구동

    원호 보간구동은 현재 위치에서 지정된 위치까지 해당 설정에 따라 원호 경로로 보간구동하도록 되어 있는데, 이러한 원호 보간구동 함수들에는 중심위치로 원을 그리는 AxmCircleCenterMove 함수, 반지름을 이용한 AxmCircleRadiusMove 함수, 중심각을 이용하는 AxmCircleAngleMove 함수 그리고 중간지점을 이용한 AxmCirclePointMove 함수를 제공한다.

    ▶AxmCircleCenterMove

    MultiMove-AxmCircleCenterMove

    AxmCircleCenterMove 함수는 종료점(E)과 중심점(C)을 입력받아서 현재위치(S)에서부터 원호 보간구동을 한 다. 세 점의 위치를 이용하여 원호를 계산하는 방법이므로 정확한 중심점과 종료점을 입력하여야 원을 구성 할 수 있고, 함수가 작동된다. 만약 잘못된 좌표를 입력하였다면 함수가 작동되지 않고 FALSE를 반환한다. 현재 위치(0,0)에서 (100,100)위치까지 (0,100)을 중심으로 반시계방향으로 원호 보간 구동을 하고자 한다면, 아래와 같이 한다.

    // 현재위치(0,0)에서 (100,100)위치까지 (0,100)을중심으로원호보간을수행한다.
    long lSize = 2;
    long lAxesNo = {0,1};
    double dCenPos[2];
    double dEndPos[2];
    long lCoordinate = 0;
    DWORD uAbsRelMode = 1; 
    AxmContiWriteClear(lCoordinate);
    AxmContiSetAxisMap(lCoordinate, lSize, lAxesNo);
    AxmContiSetAbsRelMode(lCoordinate, uAbsRelMode);// 상대위치구동으로설정
    
    double dCenterXPosition = 0;
    double dCenterYPosition = 100;
    double dEndXPosition = 100;
    double dEndYPosition = 100;
    
    dCenPos[0] = dCenterXPosition;
    dCenPos[1] = dCenterYPosition;
    
    dEndPos[0] = dEndXPosition;
    dEndPos[1] = dEndYPosition;
    
    double dMaxVelocity = 100;
    double dMaxAccel = 200;
    double dMaxDecel = 200;
    DWORD uCWDir = 1; 
    
    //[0] Ccw방향, [1] Cw방향
    AxmCircleCenterMove(lCoordinate, lAxesNo, dCenPos, dEndPos, dMaxVelocity, dMaxAccel, dMaxDecel, uCWDir);
    

    ▶AxmCircleRadiusMove

    MultiMove-AxmCircleRadiusMove

    AxmCircleRadiusMove 함수는 종료점(E)과 반지름(r)을 입력받아서 현재위치(S)에서부터 원호 보간구동을 한 다. 두 점을 지나고 일정한 반지름을 가지는 호를 계산하는 방법이므로 두 개의 원을 구성할 수 있게 된다. 그래서 입력받는 반지름에 대해서 uShortDistance의 값이 0이면, 작게 도는 원(a)이 선택되고, 1이면 크게 도 는 원(b)이 선택된다. 현재 위치에서 (300,200)위치까지 반지름이 120인 시계방향으로 크게 도는 원호보간을 수행하고자 한다면 다음과 같이 한다

    // 현재위치에서 (300,200)위치까지반지름 120인크게도는원호보간을수행
    long lSize = 2;
    long lAxesNo = {0,1};
    double dEndPos[2];
    long lCoordinate = 0;
    
    DWORD uAbsRelMode = 1; 
    DWORD uProfileMode = 3;
    AxmContiWriteClear(lCoordinate);
    AxmContiSetAxisMap(lCoordinate, lSize, lAxesNo);
    AxmContiSetAbsRelMode(lCoordinate, uAbsRelMode); // 상대위치구동으로설정
    
    double dRadius = 120;
    double dEndXPosition = 300
    double dEndYPosition = 200;
    dEndPos[0] = dEndXPosition;
    dEndPos[1] = dEndYPosition;
    double dMaxVelocity = 100;
    double dMaxAccel = 200;
    double dMaxDecel = 200;
    DWORD uCWDir = 0; 
    DWORD uShortDistance = 1; 
    
    //[0] Cw방향, [1] Ccw방향
    //[0]: 작은(원)거리 ,[1] 큰(원)거리
    AxmCircleRadiusMove(lCoordinate, lAxesNo, dRadius, dEndPos, dMaxVelocity, dMaxAccel, dMaxDecel, uCWDir, uShortDistance);
    

    ▶AxmCircleAngleMove

    MultiMove-AxmCircleAngleMove

    AxmCircleAngleMove 함수는 중심점(C)과 회전각(θ)을 입력받아서 현재위치(S)에서부터 원호 보간구동을 한 다. 호의 반지름과 각도를 이용하여 원호를 구하는 방법으로 하나의 원이 구성된다. 현재 위치에서 (200,200)을 중점으로 200도 만큼의 원호보간을 수행하는데, 시계방향으로 보간구동 하고자 한다면 아래와 같이 한다

    // 현재위치에서 (200,200)을중심으로 200도만큼원호보간을수행한다.
    long lSize = 2;
    long lAxesNo = {0,1};
    double dCenPos[2];
    long lCoordinate = 0;
    
    DWORD uAbsRelMode = 1; 
    DWORD uProfileMode = 3;
    AxmContiWriteClear(lCoordinate);
    AxmContiSetAxisMap(lCoordinate, lSize, lAxesNo);
    AxmContiSetAbsRelMode (lCoordinate, uAbsRelMode); // 상대위치구동으로설정
    double dCenterXPosition = 200;
    double dCenterYPosition = 200;
    
    dCenPos[0] = dCenterXPosition;
    dCenPos[1] = dCenterYPosition;
    double dAngle = 200;
    double dMaxVelocity = 100;
    double dMaxAccel = 200;
    double dMaxDecel = 200;
    DWORD uCWDir = 0; 
    
    //[0] Cw방향, [1] Ccw방향
    AxmCircleAngleMove(lCoordinate, lAxesNo, dCenPos, dAngle, dMaxVelocity, dMaxAccel, dMaxDecel, uCWDir);
    

    ▶AxmCirclePointMove

    MultiMove-AxmCirclePointMove

    AxmCirclePointMove 함수는 중간점(M)과 종료점(E)을 입력받아서 현재위치(S)에서부터 원호 보간구동을 한 다. 세 점을 지나는 원호를 구하는 방법으로 하나의 원이 구성된다. 현재 위치에서 (100,50)을 지나면서 (150,150)까지 보간구동 하고자 한다면 아래와 같이 한다.

    // 현재위치에서 (100,50)을지나 (150,150)까지원호보간을수행한다.
    long lSize = 2;
    long lAxesNo = {0,1};
    double dMidPos[2];
    double dEndPos[2];
    long lCoordinate = 0;
    DWORD uAbsRelMode = 1; 
    DWORD uProfileMode = 3;
    AxmContiWriteClear(lCoordinate);
    AxmContiSetAxisMap(lCoordinate, lSize, lAxesNo);
    AxmContiSetAbsRelMode(lCoordinate, uAbsRelMode); // 상대위치구동으로설정
    
    double dMidXPosition = 100;
    double dMidYPosition = 50;
    double dEndXPosition = 150;
    double dEndYPosition = 150;
    
    dMidPos[0] = dMidXPosition;
    dMidPos[1] = dMidYPosition;
    
    dEndPos[0] = dEndXPosition;
    dEndPos[1] = dEndYPosition;
    
    double dMaxVelocity = 100;
    double dMaxAccel = 200;
    double dMaxDecel = 200;
    AxmCirclePointMove(lCoordinate, lAxesNo, dMidPos, dEndPos, dMaxVelocity, dMaxAccel, dMaxDecel);
    

    // Ex12_AXM_Interpolation.cpp : Defines the entry point for the console application.
    // 2축기구부의원점을잡은후보간구동을시작한다.
    #include "stdafx.h"
    #include "AXL.h"
    #include <conio.h>
    #include "stdio.h"
    
    #define AXIS_0 0
    #define AXIS_1 1
    
    void main(void)
    {
        // 라이브러리를초기화한다.
        // 7은 IRQ를뜻한다. PCI에서자동으로 IRQ가설정된다.
        DWORD Code = AxlOpen(7);
        if (Code == AXT_RT_SUCCESS)
        {
            printf("라이브러리가초기화되었습니다.\n");
    
            //모션모듈이있는지검사
            DWORD dwStatus;
            Code = AxmInfoIsMotionModule(&dwStatus);
    
            if (Code == AXT_RT_SUCCESS)
            {
                if (dwStatus == STATUS_EXIST)
                {
                    printf("모션모듈이존재합니다.\n");
                    for (int nAxisNo = 0; nAxisNo < 2; nAxisNo++)
                    {
                        // 0축의 +End limit 과 -End limit 의 Active level 을 HIGH와급정지로설정한다.
                        AxmSignalSetLimit(nAxisNo, 0, HIGH, HIGH);
    
                        // 0축의 Inpositon 신호의입력레벨을 HIGH로설정한다.
                        AxmSignalSetInpos(nAxisNo, HIGH);
    
                        // 0축의알람신호의입력레벨을 LOW로설정한다.
                        AxmSignalSetServoAlarm(nAxisNo, LOW);
    
                        // 0축의비상정지신호(ESTOP)의 Active 입력레벨을 HIGH로설정한다. 
                        AxmSignalSetStop(nAxisNo, 0, HIGH);
    
                        //0축지령값을 mm단위가되도록한다. 
                        AxmMotSetMoveUnitPerPulse(nAxisNo, 10, 10000);
    
                        //0축에초기속도를 1로설정한다. Default : 1
                        AxmMotSetMinVel(nAxisNo, 1);
    
                        //0축의펄스출력방식을 TwoCwCcwHigh로한다.
                        AxmMotSetPulseOutMethod(nAxisNo, TwoCcwCwHigh);
    
                        //지정축에 Encoder 입력방식을 4체배로설정한다. 
                        AxmMotSetEncInputMethod(nAxisNo, ObverseSqr4Mode);
    
                        // 원점검색방법을설정
                        AxmHomeSetMethod(nAxisNo, -1, HomeSensor, 1, 2000.0, 0.0);
    
                        // 원점검색시사용될속도를설정
                        AxmHomeSetVel(nAxisNo, 100, 20, 10, 10, 200, 40);
    
                        //Servo On
                        AxmSignalServoOn(nAxisNo, ENABLE);
    
                    }
                    //원점을검색한다.
                    printf("아무키나누르면원점검색을시작합니다.\n");
                    getch();
                    AxmHomeSetStart(AXIS_0);
                    AxmHomeSetStart(AXIS_1);
    
                    //현재원점검색진행률을확인
                    DWORD uHomeResult_0, uHomeResult_1;
                    DWORD uHomeMainStepNumber, uHomeStepNumber_0, uHomeStepNumber_1;
    
                    AxmHomeGetResult(AXIS_0, &uHomeResult_0);
                    AxmHomeGetResult(AXIS_1, &uHomeResult_1);
    
                    while (uHomeResult_0 == HOME_SEARCHING || uHomeResult_1 == HOME_SEARCHING)
                    {
                        AxmHomeGetResult(AXIS_0, &uHomeResult_0);
                        AxmHomeGetResult(AXIS_1, &uHomeResult_1);
                        AxmHomeGetRate(AXIS_0, &uHomeMainStepNumber, &uHomeStepNumber_0);
                        AxmHomeGetRate(AXIS_1, &uHomeMainStepNumber, &uHomeStepNumber_1);
                        printf("\r원점검색중... 0축 : %d%, 1축 : %d", uHomeStepNumber_0, uHomeStepNumber_1);
                    }
    
                    printf("\n상대위치(150,0)까지직선보간구동한다.\n");
                    printf("아무키나누르면구동을시작합니다.\n");
                    getch();
    
                    long lSize = 2;
                    long lpAxesNo[2] = { AXIS_0, AXIS_1 };
                    double dpPosition[2] = { 150, 0 };
                    double dMaxVelocity = 50;
                    double dMaxAccel = 100;
                    double dMaxDecel = 100;
                    long lCoordinate = 0;
                    double dCenPos[2], dMidPos[2], dEndPos[2];
    
                    AxmContiWriteClear(lCoordinate);
                    AxmContiSetAxisMap(lCoordinate, lSize, lpAxesNo);
                    AxmContiSetAbsRelMode(lCoordinate, 1); // 상대위치구동으로설정
    
                    AxmLineMove(lCoordinate, dpPosition, dMaxVelocity, dMaxAccel, dMaxDecel);
    
                    BOOL WaitForDone = TRUE;
                    DWORD uStatus0, uStatus1;
    
                    while (WaitForDone) 
                    {
                        AxmStatusReadInMotion(AXIS_0, &uStatus0);
                        AxmStatusReadInMotion(AXIS_1, &uStatus1);
                        if (uStatus0 == 0 && uStatus1 == 0)
                            WaitForDone = FALSE;
                    }
    
                    printf("\n상대위치(50,50)까지 (0,50)을중심으로 Ccw방향으로원호보간구동한다.\n");
                    printf("아무키나누르면구동을시작합니다.\n");
                    getch();
    
                    dCenPos[0] = 0; dCenPos[1] = 50;
                    dEndPos[0] = 50; dEndPos[1] = 50;
    
                    AxmCircleCenterMove(lCoordinate, lpAxesNo, dCenPos, dEndPos, dMaxVelocity, dMaxAccel, dMaxDecel, 1);
    
                    //모션이모두종료될때까지기다린다.
                    WaitForDone = TRUE;
    
                    while (WaitForDone) 
                    {
                        AxmStatusReadInMotion(AXIS_0, &uStatus0);
                        AxmStatusReadInMotion(AXIS_1, &uStatus1);
                        if (uStatus0 == 0 && uStatus1 == 0)
                            WaitForDone = FALSE;
                    }
    
                    printf("\n상대위치(0,100)까지직선보간구동한다.\n");
                    printf("아무키나누르면구동을시작합니다.\n");
                    getch();
    
                    dpPosition[0] = 0; dpPosition[1] = 100;
    
                    AxmLineMove(lCoordinate, dpPosition, dMaxVelocity, dMaxAccel, dMaxDecel);
    
                    //모션이모두종료될때까지기다린다.
                    WaitForDone = TRUE;
    
                    while (WaitForDone) 
                    {
                        AxmStatusReadInMotion(AXIS_0, &uStatus0);
                        AxmStatusReadInMotion(AXIS_1, &uStatus1);
                        if (uStatus0 == 0 && uStatus1 == 0)
                            WaitForDone = FALSE;
                    }
    
                    printf("\n상대위치(-50,50)까지 Ccw방향으로반지름이 50인작게도는원호보간구동한다.\n");
                    printf("아무키나누르면구동을시작합니다.\n");
                    getch();
    
                    dEndPos[0] = 50; dEndPos[1] = -50;
    
                    AxmCircleRadiusMove(lCoordinate, lpAxesNo, 50, dEndPos, dMaxVelocity, dMaxAccel, dMaxDecel, 0, 1);
    
                    //모션이모두종료될때까지기다린다.
                    WaitForDone = TRUE;
    
                    while (WaitForDone) 
                    {
                        AxmStatusReadInMotion(AXIS_0, &uStatus0);
                        AxmStatusReadInMotion(AXIS_1, &uStatus1);
                        if (uStatus0 == 0 && uStatus1 == 0)
                            WaitForDone = FALSE;
                    }
    
                    printf("\n상대위치(0,-150)을중심으로 Ccw방향으로 90'만큼원호보간구동한다.\n");
                    printf("아무키나누르면구동을시작합니다.\n");
                    getch();
    
                    //모션이모두종료될때까지기다린다.
                    dCenPos[0] = 0; dCenPos[1] = -150;
                    AxmCircleAngleMove(lCoordinate, lpAxesNo, dCenPos, 90, dMaxVelocity, dMaxAccel, dMaxDecel, 1);
    
                    //모션이모두종료될때까지기다린다.
                    WaitForDone = TRUE;
    
                    while (WaitForDone) 
                    {
                        AxmStatusReadInMotion(AXIS_0, &uStatus0);
                        AxmStatusReadInMotion(AXIS_1, &uStatus1);
                        if (uStatus0 == 0 && uStatus1 == 0)
                            WaitForDone = FALSE;
                    }
    
                    printf("\n상대위치(50,50)을중간점으로 Ccw방향으로 (100,0)만큼원호보간구동한다.\n");
                    printf("아무키나누르면구동을시작합니다.\n");
                    getch();
    
                    //모션이모두종료될때까지기다린다.
                    dMidPos[0] = 50; dMidPos[1] = 50;
                    dEndPos[0] = 100; dEndPos[1] = 0;
    
                    AxmCirclePointMove(lCoordinate, lpAxesNo, dMidPos, dEndPos, dMaxVelocity, dMaxAccel, dMaxDecel, 0);
                    WaitForDone = TRUE;
    
                    while (WaitForDone) 
                    {
                        AxmStatusReadInMotion(AXIS_0, &uStatus0);
                        AxmStatusReadInMotion(AXIS_1, &uStatus1);
                        if (uStatus0 == 0 && uStatus1 == 0)
                            WaitForDone = FALSE;
                    }
    
                    printf("\n원점까지직선보간구동한다.\n");
                    printf("아무키나누르면구동을시작합니다.\n");
                    getch();
    
                    dpPosition[0] = 0; dpPosition[1] = -50;
                    AxmLineMove(lCoordinate, dpPosition, dMaxVelocity, dMaxAccel, dMaxDecel);
    
                    //모션이모두종료될때까지기다린다.
                    WaitForDone = TRUE;
    
                    while (WaitForDone) 
                    {
                        AxmStatusReadInMotion(AXIS_0, &uStatus0);
                        AxmStatusReadInMotion(AXIS_1, &uStatus1);
                        if (uStatus0 == 0 && uStatus1 == 0)
                            WaitForDone = FALSE;
                    }
    
                    //Servo Off
                    AxmSignalServoOn(AXIS_0, ENABLE);
                    AxmSignalServoOn(AXIS_1, ENABLE);
                }
                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");
    }
    
    ※ 위의 보간구동 예제를 실행하면 다음과 같은 결과를 확인할 수 있다

    MultiMove-Example12-Result

2.1. 보간 구동 함수 리스트

Function Description
AxmLineMove 시작점과 종료점을 지정하여 다축 직선 보간 구동하는 함수이다. 구동 시작 후 함수를 벗어난다.AxmContiBeginNode, AxmContiEndNode와 같이사용시 지정된 좌표계에 시작점과 종료점을 지정하여 직선 보간하는Queue에 저장 함수다. 직선 프로파일 연속 보간 구동을 위해 내부Queue에 저장하여 AxmContiStart함수를 사용해서 시작한다.
AxmCircleCenterMove 시작점, 종료점과 중심점을 지정하여 원호 보간 구동하는 함수이다. 구동시작 후 함수를 벗어난다.AxmContiBeginNode, AxmContiEndNode, 와같이사용시 지정된 좌표계에 시작점, 종료점과 중심점을 지정하여 구동하는 원호 보간 Queue에 저장함수다. 프로파일 원호 연속 보간 구동을 위해 내부 Queue에 저장하여 AxmContiStart함수를 사용해서 시작한다.
AxmCirclePointMove 중간점, 종료점을 지정하여 원호 보간 구동하는 함수이다. 구동 시작 후함수를 벗어난다.AxmContiBeginNode, AxmContiEndNode와 같이사용시지정된 좌표계에 중간점, 종료점을 지정하여 구동하는 원호 보간 Queue에 저장함수다. 프로파일 원호 연속 보간 구동을 위해 내부 Queue에 저장하여 AxmContiStart함수를 사용해서 시작한다
AxmCirclePointMoveEx AxmCirclePointMove와 사용법은 동일하며 삼차원 이상의 원/원호 보간을지원한다.
AxmCircleRadiusMove 시작점, 종료점과 반지름을 지정하여 원호 보간 구동하는 함수이다. 구동시작 후 함수를 벗어난다.AxmContiBeginNode, AxmContiEndNode와 같이사용시 지정된 좌표계에 시작점, 종료점과 반지름을 지정하여 원호 보간하는 Queue에 저장함수다. 프로파일 원호 연속 보간 구동을 위해 내부Queue에 저장하여 AxmContiStart함수를 사용해서 시작한다.
AxmCircleAngleMove 시작점, 회전각도와 반지름을 지정하여 원호 보간 구동하는 함수이다. 구동 시작 후 함수를 벗어난다.AxmContiBeginNode, AxmContiEndNode와같이사용시 지정된 좌표계에 시작점, 회전각도와 반지름을 지정하여 원호보간하는 Queue에 저장함수다. 프로파일 원호 연속 보간 구동을 위해 내부 Queue에 저장하여 AxmContiStart함수를 사용해서 시작한다.

3. 연속 보간 구동

  • 직선 연속 보간 구동

    연속 보간구동 함수는 직선 및 원호 보간구동을 연속적으로 이어서 구동하도록 하는 함수로서 구동을 시작하고 가속 된 후 등속으로 지정된 위치들을 통과하여 마지막에 다시 감속하여 정지하는 구동을 하는 함수이다.

    연속보간 함수에서 특이할 만한 점은 연속보간에 이용할 축들을 새로운 좌표계로 매핑하는 과정을 거친 후 “연속보간큐” 라는 메모리 영역에 연속으로 보간구동 할 명령들을 저장하고 나중에 연속보간 시작 명령을 실 행하면 저장된 연속보간 데이터들이 하나씩 사용되어 연속적으로 보간구동을 하게 된다.

    연속보간구동을 하기 위해서는 우선 연속보간에 사용할 축들을 매핑하는 과정을 거쳐야 한다. 연속보간에 사 용되는 보간구동함수들은 직선 4축이내 구동, 원호 2축 보간구동들의 조합이 되지만, 축을 매핑 한 후 사용 하고자 하는 축을 모두 포함하는 하나의 좌표계로 매핑하여야 한다. 예를 들어 0,1,2 세 축을 사용하여 한번 은 0,1축의 보간구동을 하고 이어서 1,2축을 이용한 보간구동을 연속해서 하고자 한다면 반드시 0,1,2축을 하나의 좌표계로 매핑 하여야 한다. 좌표계를 매핑 한 후에는 해당 좌표계에서 사용할 속도프로파일을 설정 하고, 절대/상대위치 모드를 설정한다.

    // 0,1,2축을연속보간구동에사용할 0번좌표계로매핑한다.
    long lCoordinate = 0;
    long lSize = 3;
    long lRealAxesNo = {0,1,2};
    AxmContiSetAxisMap(lCoordinate, lSize, lRealAxesNo);
    //0번좌표계를상대위치구동으로설정한다.
    DWORD uAbsRelMode = 1; //[0] : 절대위치구동, [1] : 상대위치구동
    AxmContiSetAbsRelMode(lCoordinate, uAbsRelMode);
    

    연속보간구동 큐에 직선 연속보간 데이터를 입력하기 위해서는 먼저 AxmContiBeginNode 함수를 호출하고, AxmLineMove 함수를 실행하여 보간 노드를 입력한다. 모든 노드가 입력된 후 AxmContiEndNode 를 호출 하 여 보간 노드 입력을 완료한다. 원호 연속보간 데이터를 입력하기 위해서는 AxmCircleCenterMove, AxmCirclePointMove, AxmCircleRadiusMove, AxmCircleAngleMove 함수를 사용하여 보간 노드를 입력한다.

    //보간큐에 (100,150,0)까지선형보간구동하라는데이터를입력한다. (속도 : 100, 가속도 : 200) 
    long lCoordinate = 0;
    double dPosition = {100,150,0};
    double dMaxVelocity = 100;
    double dMaxAccel = 200;
    double dMaxDecel = 200;
    AxmContiBeginNode(lCoordinate);
    AxmLineMove(lCoordinate, dPosition, dMaxVelocity, dMaxAccel, dMaxDecel);
    AxmContiEndNode(lCoordinate);
    
    // 보간큐에 0축과 1축을이용하여현재위치(0,0)에서 (100,100)위치까지 (0,100)을중심으로원호보간하는
    // 데이터를입력
    long lSize = 2;
    long lAxesNo = {0,1};
    double dCenPos[2];
    double dEndPos[2];
    long lCoordinate = 0;
    double dCenterXPosition = 0;
    double dCenterYPosition = 100;
    double dEndXPosition = 100;
    double dEndYPosition = 100;
    double dMaxVelocity = 100;
    double dMaxAccel = 200;
    double dMaxDecel = 200;
    
    dCenPos[0] = dCenterXPosition;
    dCenPos[1] = dCenterYPosition;
    
    dEndPos[0] = dEndXPosition;
    dEndPos[1] = dEndYPosition;
    DWORD uCWDir = 1; //[0] Ccw방향, [1] Cw방향
    AxmContiWriteClear(lCoordinate);
    AxmContiSetAxisMap(lCoordinate, lSize, lAxesNo);
    AxmContiBeginNode(lCoordinate);
    AxmCircleCenterMove(lCoordinate, lAxesNo, dCenPos, dEndPos,, dMaxVelocity, dMaxAccel, 
    dMaxDecel, uCWDir);
    AxmContiEndNode(lCoordinate);
    
    // 보간큐에 1축과 2축을이용하여현재위치에서 (300,200)위치까지반지름 120인크게도는
    // 원호보간을수행하는데이터를입력
    long lSize = 2;
    long lAxesNo = {1,2};
    double dEndPos[2];
    long lCoordinate = 0;
    double dRadius = 120;
    double dEndXPosition = 300
    double dEndYPosition = 200;
    double dMaxVelocity = 100;
    double dMaxAccel = 200;
    double dMaxDecel = 200;
    DWORD uCWDir = 0; //[0] Ccw방향, [1] Cw방향
    DWORD uShortDistance = 1; //[0]: 작은(원)거리 ,[1] 큰(원)거리
    AxmContiWriteClear(lCoordinate);
    AxmContiSetAxisMap(lCoordinate, lSize, lAxesNo);
    AxmContiBeginNode(lCoordinate);
    AxmCircleRadiusMove(lCoordinate, lAxesNo, dRadius, dEndPos, dMaxVelocity, dMaxAccel, 
    dMaxDecel, uCWDir, uShortDistance);
    AxmContiEndNode(lCoordinate);
    
    // 보간큐에 0축과 2축을이용하여현재위치에서 (200,200)을중심으로 200도만큼원호보간을수행하는데이터
    // 를입력한다.
    long lSize = 2;
    long lAxesNo = {0,2};
    double dCenPos[2];
    long lCoordinate = 0;
    double dCenterXPosition = 200;
    double dCenterYPosition = 200;
    dCenPos[0] = dCenterXPosition;
    dCenPos[1] = dCenterYPosition;
    double dAngle = 200;
    double dMaxVelocity = 100;
    double dMaxAccel = 200;
    double dMaxDecel = 200;
    DWORD uCWDir = 0; //[0] Ccw방향, [1] Cw방향
    AxmContiBeginNode(lCoordinate);
    AxmCircleAngleMove(lCoordinate, lAxesNo, dCenPos, dAngle, dMaxVelocity, dMaxAccel, 
    dMaxDecel, uCWDir);
    AxmContiEndNode(lCoordinate);
    
    // 보간큐에 0축과 1축을이용하여현재위치에서 (100,50)을지나 (150,150)까지원호보간을수행하는데이터
    // 를입력한다.
    long lSize = 2;
    long lAxesNo = {0,1};
    double dMidPos[2];
    double dEndPos[2];
    long lCoordinate = 0;
    double dMidXPosition = 100;
    double dMidYPosition = 50;
    double dEndXPosition = 150;
    double dEndYPosition = 150;
    dMidPos[0] = dMidXPosition;
    dMidPos[1] = dMidYPosition;
    dEndPos[0] = dEndXPosition;
    dEndPos[1] = dEndYPosition;
    double dMaxVelocity = 100;
    double dMaxAccel = 200;
    double dMaxDecel = 200;
    AxmContiWriteClear(lCoordinate);
    AxmContiSetAxisMap(lCoordinate, lSize, lAxesNo);
    AxmContiBeginNode(lCoordinate);
    AxmCirclePointMove(lCoordinate, lAxesNo, dMidPos, dEndPos,dEndXPosition, dEndYPosition, 
    dMaxVelocity, dMaxAccel, dMaxDecel);
    AxmContiEndNode(lCoordinate);
    

    이렇게 보간큐에 데이터를 입력하고 나서 AxmContiStart 함수를 호출하면 저장된 데이터를 이용하여 연속보간 구동을 시작한다. 여기서 연속보간 구동중의 속도프로파일 모드를 지정할 수 있는데, 속도지정 보간모드와 노 드 가감속 보간모드, 자동 가감속 보간모드가 있다.

    속도지정 보간모드는 구동이 시작하고 가속되어 지정한 속도에 이르면 지속적으로 속도를 유지하면서 연속보 간구동이 진행되는 일반적인 연속 보간구동을 의미한다. 노드 가감속 보간모드는 연속보간의 각 노드에서마 다 가감속이 이루어지는 모드 이며, 자동 가감속 보간모드는 연속적인 경로를 따라갈 때는 속도의 변화가 없 지만, 급커브가 발생하는 구간에서는 자동으로 가감속을 하게 되는 보간모드 이다.

    //저장된보간데이터들을이용하여연속보간을시작한다.
    long lCoordinate = 0; 
    DWORD dwProfileset = 0; //(0): 속도지정보간모드
    //(1): 노드가감속보간모드
    //(2): 자동가감속보간모드
    AxmContiStart(lCoordinate, dwProfileset, 0);
    

    이렇게 시작된 연속보간을 임의로 종료하고자 한다면 AxmMoveSStop 함수를 사용하면 된다.

    MultiMove-Conti

    //연속보간구동을종료한다.
    long lCoordinate = 0
    AxmMoveSStop(lCoordinate); // lCoordinate의마스터축을인자에넣어준다
    

    앞에서 언급한 함수들 외에도 연속보간시 좀더 다양한 구동을 하기 위해서 아래의 여러 가지 함수들을 추가 적으로 제공한다. 먼저 현재 보간구동 큐가 비어있는지 여부를 확인하기 위한 함수로 AxmContiReadFree 함 수를 제공하고, 보간큐에서 현재 몇 번째 데이터가 모션제어기로 예약되었는지 확인하기 위한 함수로 AxmContiReadIndex 함수를 제공한다.

    //보간구동큐가비어있는지여부를확인한다.
    long lCoordinate = 0; 
    DWORD uQueueFree;
    AxmContiReadFree(lCoordinate, &uQueueFree);
    if(uQueueFree) { printf(보간큐가비어있습니다.); }
    else { printf(보간큐가비어있지않다.); }
    
    //현재몇번째데이터가칩에입력되었는지확인한다.
    long lCoordinate = 0; 
    long lQueueIndex;
    AxmContiReadIndex(lCoordinate, &lQueueIndex);
    printf(현재보간구동중인 Index : %d \n ,lQueueIndex); 
    

    현재 구동중인 노드의 번호를 확인하는 AxmContiGetNodeNum 함수가 있는데, 이것은 실제 구동중인 데이터 의 번호가 반환된다. 또한 보간구동 큐에 들어있는 데이터가 총 몇 개인지를 확인하기 위해서는 AxmContiGetTotalNodeNum 함수를 사용한다. 현재 총 몇 개의 보간구동 노드중에 몇 번째 노드가 실행 중 인지를 확인하고자 한다면 다음과 같이 한다

    //현재몇번째노드가구동되고있는지확인한다.
    long lCoordinate = 0; 
    long lNodeNum, lNodeTotal;
    AxmContiGetNodeNum(lCoordinate, &lNodeNum);
    AxmContiGetTotalNodeNum(lCoordinate, &lNodeTotal);
    printf(현재총 %d 개중에 %d 번째노드가보간구동중입니다. \n , lNodeTotal, lNodeNum);
    

    연속보간구동이 현재 진행 중인지 여부를 확인하기 위해서는 AxmContiIsMotion 함수를 사용한다.

    //현재보간구동중인지를확인한다.
    long lCoordinate = 0; 
    DWORD uInMotion;
    AxmContiIsMotion(lCoordinate, &uInMotion);
    if(uInMotion) { printf(연속보간구동중입니다.); }
    else { printf(연속보간구동중이아닙니다.); }
    

    연속보간구동을 종료 시키면 자동으로 보간큐가 비워지지만, 상황에 따라서 보간구동 중에 보간 큐를 클리어 해야 할 필요가 있을 때가 있다. 그런 경우에 사용하는 함수가 AxmContiWriteClear 함수이다.

    //보간큐의데이터를클리어한다.
    long lCoordinate = 0; 
    AxmContiWriteClear(lCoordinate);
    

    // Ex13_AXM_ContiInterpolation.cpp:Defines the entry point for the console application.
    // 2축기구부의원점을잡은후연속보간구동을시작한다.
    #include "stdafx.h"
    #include "AXL.h"
    #include <conio.h>
    #include "stdio.h"
    
    #define AXIS_0 0
    #define AXIS_1 1
    
    void main(void)
    {
        // 라이브러리를초기화한다.
        // 7은 IRQ를뜻한다. PCI에서자동으로 IRQ가설정된다.
        long lNodeTotal;
        DWORD Code = AxlOpen(7);
        if (Code == AXT_RT_SUCCESS)
        {
            printf("라이브러리가초기화되었습니다.\n");
    
            //모션모듈이있는지검사
            DWORD dwStatus;
            Code = AxmInfoIsMotionModule(&dwStatus);
    
            if (Code == AXT_RT_SUCCESS)
            {
                if (dwStatus == STATUS_EXIST)
                {
                    printf("모션모듈이존재합니다.\n");
    
                    for (int nAxisNo = 0; nAxisNo < 2; nAxisNo++)
                    {
                        // 0축의 +End limit 과 -End limit 의 Active level 을 HIGH와급정지로설정한다.
                        AxmSignalSetLimit(nAxisNo, 0, HIGH, HIGH);
    
                        // 0축의 Inpositon 신호의입력레벨을 HIGH로설정한다.
                        AxmSignalSetInpos(nAxisNo, HIGH);
    
                        // 0축의알람신호의입력레벨을 LOW로설정한다.
                        AxmSignalSetServoAlarm(nAxisNo, LOW);
    
                        // 0축의비상정지신호(ESTOP)의 Active 입력레벨을 HIGH로설정한다.
                        AxmSignalSetStop(nAxisNo, 0, HIGH);
    
                        //0축지령값을 mm단위가되도록한다. 
                        AxmMotSetMoveUnitPerPulse(nAxisNo, 10, 10000);
    
                        //0축에초기속도를 1로설정한다. Default : 1
                        AxmMotSetMinVel(nAxisNo, 1);
    
                        //0축의펄스출력방식을 TwoCwCcwHigh로한다.
                        AxmMotSetPulseOutMethod(nAxisNo, TwoCcwCwHigh);
    
                        //지정축에 Encoder 입력방식을 4체배로설정한다.
                        AxmMotSetEncInputMethod(nAxisNo, ObverseSqr4Mode);
    
                        //상대좌표구동으로설정
                        AxmMotSetAbsRelMode(nAxisNo, 1);
    
                        //대칭 S자속도프로파일로설정
                        AxmMotSetProfileMode(nAxisNo, 3);
    
                        // 원점검색방법을설정
                        AxmHomeSetMethod(nAxisNo, -1, HomeSensor, 1, 2000.0, 0.0);
    
                        // 원점검색시사용될속도를설정
                        AxmHomeSetVel(nAxisNo, 100, 20, 10, 10, 200, 40);
    
                        //Servo On
                        AxmSignalServoOn(nAxisNo, ENABLE);
    
                    }
                    //원점을검색한다.
                    printf("아무키나누르면원점검색을시작합니다.\n");
                    getch();
    
                    AxmHomeSetStart(AXIS_0);
                    AxmHomeSetStart(AXIS_1);
    
                    //현재원점검색진행률을확인
                    DWORD uHomeResult_0, uHomeResult_1;
                    DWORD uHomeMainStepNumber, uHomeStepNumber_0, uHomeStepNumber_1;
    
                    AxmHomeGetResult(AXIS_0, &uHomeResult_0);
                    AxmHomeGetResult(AXIS_1, &uHomeResult_1);
    
                    while (uHomeResult_0 == HOME_SEARCHING || uHomeResult_1 == HOME_SEARCHING)
                    {
                        AxmHomeGetResult(AXIS_0, &uHomeResult_0);
                        AxmHomeGetResult(AXIS_1, &uHomeResult_1);
                        AxmHomeGetRate(AXIS_0, &uHomeMainStepNumber, &uHomeStepNumber_0);
                        AxmHomeGetRate(AXIS_1, &uHomeMainStepNumber, &uHomeStepNumber_1);
                        printf("\r원점검색중... 0축 : %d%, 1축 : %d % ", uHomeStepNumber_0, uHomeStepNumber_1);
                    }
    
                    printf("\n상대위치(50,25)까지직선보간구동으로이동합니다.");
    
                    // 0,1축을연속보간구동에사용할 0번좌표계로매핑한다.
                    long lCoordinate = 0;
                    long lSize = 2;
                    long lRealAxesNo[2] = { 0,1 };
                    double dCenPos[2]; double dEndPos[2]; double dMidPos[2];
                    AxmContiSetAxisMap(lCoordinate, lSize, lRealAxesNo);
    
                    //기존의연속보간데이터들은삭제한다.
                    AxmContiWriteClear(lCoordinate);
    
                    //0번좌표계를상대위치구동으로설정한다.
                    AxmContiSetAbsRelMode(lCoordinate, 1);
                    double dpPosition[2] = { 50,25 };
                    AxmLineMove(lCoordinate, dpPosition, 100, 200, 200);
    
                    //모션이모두종료될때까지기다린다.
                    BOOL WaitForDone = TRUE;
                    DWORD uStatus0, uStatus1;
    
                    while (WaitForDone) {
                        AxmStatusReadInMotion(AXIS_0, &uStatus0);
                        AxmStatusReadInMotion(AXIS_1, &uStatus1);
                        if (uStatus0 == 0 && uStatus1 == 0)
                            WaitForDone = FALSE;
                    }
    
                    //상대위치로연속구동할데이터를보간큐에입력한다.
                    for (int i = 0; i < 5; i++) //5회반복한다.
                    {
                        //보간큐에 (100,0)까지이동하라는데이터를입력 (속도 : 100, 가속도 : 200)
                        AxmContiBeginNode(lCoordinate);//보간큐등록시작
                        dpPosition[0] = 100; dpPosition[1] = 0;
                        AxmLineMove(lCoordinate, dpPosition, 100, 200, 200);
                        dCenPos[0] = 0; dCenPos[1] = 25;
                        dEndPos[0] = 25; dEndPos[1] = 25;
    
                        //보간큐에 (25,25)까지 (0,25)을중심으로반시계방향으로원호보간하라는데이터를입력
                        AxmCircleCenterMove(lCoordinate, lRealAxesNo, dCenPos, dEndPos, 100, 200, 200, 0);
    
                        //보간큐에 (0,100)까지이동하라는데이터를입력
                        dpPosition[0] = 0; dpPosition[1] = 100;
                        AxmLineMove(lCoordinate, dpPosition, 100, 200, 200);
                        dEndPos[0] = 25; dEndPos[1] = -25;
    
                        //보간큐에 (-25,25)까지반지름 25로반시계방향으로원호보간하라는데이터를입력
                        AxmCircleRadiusMove(lCoordinate, lRealAxesNo, 25, dEndPos, 100, 200, 200, 0, 0);
    
                        //보간큐에 (-100,0)까지이동하라는데이터를입력
                        dpPosition[0] = -100; dpPosition[1] = 0;
                        AxmLineMove(lCoordinate, dpPosition, 100, 200, 200);
                        dCenPos[0] = 0; dCenPos[1] = -25;
    
                        //보간큐에 90각도로 (0,-25)을중심으로반시계방향으로원호보간하라는데이터를입력
                        AxmCircleAngleMove(lCoordinate, lRealAxesNo, dCenPos, 90, 100, 200, 200, 0);
    
                        //보간큐에 (0,-100)까지이동하라는데이터를입력
                        dpPosition[0] = 0; dpPosition[1] = -100;
                        AxmLineMove(lCoordinate, dpPosition, 100, 200, 200);
                        dMidPos[0] = 7; dMidPos[1] = -18;
                        dEndPos[0] = 25; dEndPos[1] = -25;
    
                        //보간큐에 (7,-18)를지나면서 (25,-25)까지원호보간하라는데이터를입력
                        AxmCirclePointMove(lCoordinate, lRealAxesNo, dMidPos, dEndPos, 100, 200, 200, 0);
    
                        AxmContiEndNode(lCoordinate); //보간큐등록끝
                    }
    
                    AxmContiGetTotalNodeNum(lCoordinate, &lNodeTotal);
                    printf("\n현재총 %d 개의노드가저장되었습니다.", lNodeTotal);
                    printf("\n아무키나누르면, 저장된보간데이터들을이용하여속도지정모드로연속보간을시작합니다.");
                    getch();
    
                    AxmContiStart(lCoordinate, 0, 0);
                    printf("\n아무키나누르면연속구동을즉시정지한다.");
                    getch();
    
                    AxmMoveSStop(0);// lCoordinate의마스터축을정지시킨다.
                    getch();
                }
                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");
    }
    
    ※ 위의 보간구동 예제를 실행하면 다음과 같은 결과를 확인할 수 있다

    MultiMove-Example13

3.1. 연속 보간 구동 함수 리스트

Function Description
AxmContiSetAxisMap 지정된 좌표계에 연속보간 축 맵핑을 설정한다.
AxmMotSetWorkCoordinate 작업 좌표계를 설정한다.
AxmMotGetWorkCoordinate 설정된 작업 좌표계를 확인한다.
AxmContiGetAxisMap 지정된 좌표계에 연속보간 축 맵핑을 반환한다.
AxmContiSetAbsRelMode 지정된 좌표계에 연속보간 축 절대/상대 모드를 설정한다.
AxmContiGetAbsRelMode 지정된 좌표계에 연속보간 축 절대/상대 모드를 반환한다.
AxmContiBeginNode 지정된 좌표계에 연속보간에서 수행할 작업들의 등록을 시작한다. 이 함수를 호출한 후, AxmContiEndNode함수가 호출되기 전까지 수행되는 모든모션작업은 실제 모션을 수행하는 것이 아니라 연속보간 모션으로 등록되는 것이며, AxmContiStart 함수가 호출될 때 비로소 등록된 모션이 실제로 수행된다
AxmContiEndNode 지정된 좌표계에서 연속보간을 수행할 작업들의 등록을 종료한다.
AxmContiReadFree 지정된 좌표계에 보간 구동을 위한 내부 Queue가 비어 있는지 확인하는함수이다.
AxmContiReadIndex 지정된 좌표계에 보간 구동을 위한 내부 Queue에 저장되어 있는 보간 구동 개수를 확인하는 함수이다.
AxmContiWriteClear 지정된 좌표계에 연속 보간 구동을 위해 저장된 내부 Queue를 모두 삭제하는 함수이다.
AxmContiStart 지정된 좌표계에 저장된 내부 연속 보간 Queue의 구동을 시작하는 함수이다.
AxmContiIsMotion 지정된 좌표계에 연속 보간 구동 중인지 확인하는 함수이다.
AxmContiGetNodeNum 지정된 좌표계에 연속 보간 구동 중 현재 구동중인 연속 보간 인덱스 번호를 확인하는 함수이다.
AxmContiGetTotalNodeNum 지정된 좌표계에 설정한 연속 보간 구동 총 인덱스 갯수를 확인하는 함수이다.
AxmContiQBegin 실시간 Conti Queue 모션을 시작한다. (Conti Queue = 128)
AxmContiQEnd 실시간 Conti Queue 모션을 종료한다.
AxmContiQGetStatus 현재 Queue의 상태를 반환한다.
AxmContiQWriteClear 지정된 좌표계에 연속 보간 구동을 위해 저장된 내부 Queue를 모두 삭제한다.

4. 다축 구동 함수 소개

AxmMoveMultiPos

Purpose

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

Format

C++
DWORD AxmMoveMultiPos(long lArraySize, long *lpAxisNo, double *dpPos, 
double *dpVel, double *dpAccel, double *dpDecel);
Visual Basic
Function AxmMoveMultiPos(ByVal lArraySize As Long, ByRef lpAxisNo As 
Long, ByRef dpPos As Double, ByRef dpVel As Double, ByRef dpAccel As 
Double, ByRef dpDecel As Double) As Long
Delphi
function AxmMoveMultiPos(lArraySize : LongInt; lpAxisNo : PLongInt; 
dpPos : PDouble; dpVel : PDouble; dpAccel : PDouble; dpDecel : 
PDouble) : DWord; stdcall;

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: 속도, 가속도, 저크, 프로파일설정이 잘못 됨
* See error code Table for more information on status error codes

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);
Visual Basic
‘절대좌표로 2000만큼 100의속도와 200의가속율로사다리꼴구동,구동이시작되면기다렸다함수를
‘빠져나온다
Dim Distance(0 To 2) As Double
Dim velocities(0 To 2) As Double
Dim accelerations(0 To 2) As Double
Dim axis(0 To 2) As Long
Dim i As Long
StopMode = 1; ‘스톱모드감속정지설정
For i = 0 To 2
    AxmMotSetProfileMode i, 3
    AxmMotSetAbsRelMode i, 1
     axis(i) = i
     Distance(i) = 2000
     velocities(i) = 100
     accelerations(i) = 200
Next i
AxmMoveMultiPos 2 , axis(0), Distance(0), velocities(0), accelerations(0), accelerations(0)

Delphi
{ 절대좌표로 2000만큼 100의속도와 200의가속율로사다리꼴구동, 구동이시작되면기다렸다함수를빠져나온다. }
var
    i : LongInt;
    lAxis : array [0..1] of Longint;
     dPos : array [0..1] of Double;
     dVel : array [0..1] of Double;
    dAccel: array [0..1] of Double;

begin
    uStopMode = 1; { 스톱모드감속정지설정}
    for i := 0 to 2 do
    begin
        AxmMotSetProfileMode(i, 3);
        AxmMotSetAbsRelMode(i, 1);
        dPos[i] := 2000;
        dVel[i] := 100;
        dAccel[i] := 200;
    lAxis[i] := i;
    end;
    AxmMoveMultiPos (2, @lAxis, @dPos, @dVel, @ dAccel, @dAccel);
end;

AxmMoveStartMultiPos

Purpose

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

Format

C++
DWORD AxmMoveStartMultiPos( long lArraySize, long *lpAxisNo, double 
*dpPos, double *dpVel, double *dpAccel, double *dpDecel);
Visual Basic
Function AxmMoveStartMultiPos( ByVal lArraySize As Long, ByRef 
lpAxisNo As Long, ByRef dpPos As Double, ByRef dpVel As Double, ByRef 
dpAccel As Double, ByRef dpDecel As Double) As Long
Delphi
function AxmMoveStartMultiPos(lArraySize : LongInt; lpAxisNo : 
PLongInt; dpPos : PDouble; dpVel : PDouble; dpAccel : PDouble; 
dpDecel : PDouble) : DWord; stdcall;

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: 속도, 가속도, 저크, 프로파일설정이 잘못 됨
* See error code Table for more information on status error codes

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);
Visual Basic
‘절대좌표로 2000만큼 100의속도와 200의가속율로사다리꼴구동,구동이시작되면기다렸다함수를
‘빠져나온다.
Dim Distance(0 To 2) As Double
Dim velocities(0 To 2) As Double
Dim accelerations(0 To 2) As Double
Dim axis(0 To 2) As Long Dim i As Long
For i = 0 To 2
    AxmMotSetProfileMode i, 3
    AxmMotSetAbsRelMode i, 1
     axis(i) = i
    Distance(i) = 2000
    velocities(i) = 100
    accelerations(i) = 200
Next i
AxmMoveStartMultiPos 2 , axis(0), Distance(0), velocities(0), accelerations(0), accelerations(0)

Delphi
{ 절대좌표로 2000만큼 100의속도와 200의가속율로사다리꼴구동, 구동이시작되면기다렸다함수를빠져나온다. }
var
    i : LongInt;
    lAxis : array [0..1] of Longint;
    dPos : array [0..1] of Double;
    dVel : array [0..1] of Double;
    dAccel: array [0..1] of Double;
    uStopMode : DWORD;

Begin
    for i := 0 to 2 do
    begin
    AxmMotSetProfileMode(i, 3);
        AxmMotSetAbsRelMode (i, 1);
        dPos[i] := 2000;
        dVel[i] := 100;
        dAccel[i] := 200;
    lAxis[i] := i;
    end;
    AxmMoveStartMultiPos (2, @lAxis, @dPos, @dVel, @ dAccel, @dAccel);
end;

AxmLineMove

Purpose

지정된 좌표계에 시작점과 종료점을 지정하여 다축 직선 보간 구동하는 함수이다.

Format

C++
DWORD AxmLineMove(long lCoord, double *dpPos, double dVel, double 
dAccel, double dDecel);
Visual Basic
Function AxmLineMove(ByVal lCoord As Long, ByRef dpPosAs Double, 
ByVal dVel As Double, ByVal dAccel As Double, ByVal dDecel As Double)
As Long
Delphi
function AxmLineMove(lCoord : LongInt; dpPos: PDouble; dVel : Double; 
dAccel : Double; dDecel : Double) : DWord; stdcall;

Parameters

[in/out] Name [Init Value] Explanation
[in]lCoord 좌표계 변호(0 ~ (최대축수 -1))
[in]dpPos 위치 배열
[in]dVel 구동 속도값 (+방향: 0 이상값 , -방향: 0이하값,
구동속도의 단위는 Unit/pulse를 1/1로 한경우에 PPS[Pulses/sec])
[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 : 함수 실행 성공
[1054] AXT_RT_NOT_SUPPORT_VERSION : 지원하지 않는 하드웨어 일 경우
[4160] AXT_RT_ERROR_NOT_SAME_BOARD : 똑같은 보드 내에 있지 않을 경우
[4166] AXT_ERROR_CONTI_INVALID_MAP_NO: 연속 보간 맵핑 번호가 비워있을 때
[4201] AXT_RT_MOTION_HOME_SEARCHING: 보간구동 할 축 중 원점 구동중인 축이 있을 때
* See error code Table for more information on status error codes

Description

  • 구동 시작 후 함수를 벗어난다. AxmContiBeginNode, AxmContiEndNode 와 같이사용시 지정된 좌표계에 시작점과 종료점을 지정하여 직선 보간 구동하는 Queue 에 저장된다. 직선 프로파일 연속 보간 구동을 위해 내부 Queue 에 저장하여 AxmContiStart 함수를 사용해서 시작한다. 2 -4 축까지 가능하다. 이 함수를 수행하기 전에 AxmContiSetAxisMap 함수는 보간작업을 수행할 축들을 맵번호로 축맵핑한다. 연속보간 뿐만 아니라 일반보간제어에 관련된 함수들도 파라미터의 전달이 간편하므로 적용된다. 따라서 일반보간제어에 관련된 함수들을 사용하기 전에 가장 먼저 이 함수를 사용하여 사용할 축들을 맵핑한다.

▶주의사항: AxmContiSetAxisMap 함수를 이용하여 축 맵핑을 하며 축은 낮은 순서부터 맵핑을 한다. 원호보간의 경우에 반드시 낮은 축부터 배열에 넣어야 한다.

▶주의사항: +LIMIT, -LIMIT 신호가 입력된 상태에서는 구동되지 않는다.

▶ AxmContiIsMotion 함수에 의해 모션 중인지 확인할 수 있다.

▶ AxmSignalSetInpos 함수를 사용하는 경우에는 Inposition 입력신호가 Enable 로 설정되어 있다면 Command 펄스 출력이 완료해도 INP 입력이 ON 되기 전까지는 모션이 완료되지 않은 것으로 간주되어 반환 되지 않는다. (AxmSignalSetInpos 함수 참고)

▶ 주의사항: 보간하는축은 Unit/Pulse 를 동일하게 설정한다. Unit/Pulse 를 똑같이 맞추지 않으면 단위가 틀려 지므로 반드시 똑같이 맞추어 보간제어를 하여야 한다.

▶ 4 축 이상을 구성하였을 때

다축 모션보드는 Axis 0 – 3 의 4 개의 축이 축그룹 1 로 구분되고 Axis4 – 7 4 개의 축이 축그룹 2 로 구분되고 Axis8 – 11 4 개의 축이 축그룹 3 으로 ….. 구분된다. 동일 그룹에 속하는 축들간의 직선보간 구동, 원호보간구동을 사용할 수 있지만, 서로 다른 축그룹에 속한 축들간의 직선보간구동과 원호보간구동은 사용할 수 없다. Coordinate 를 지정할 때 주의하여야 한다.

예제코드

C++
long lAxis[2];
double dPos[2];
long lPosSize = 2;
long lCoordinate = 0;
dPos[0] = 4000;
dPos[1] = 4000;
lAxis[0] = 0;
lAxis[1] = 1;
AxmContiWriteClear(lCoordinate);
AxmContiSetAxisMap(lCoordinate, lPosSize, lAxis);
//상대위치구동.
AxmContiSetAbsRelMode(lCoordinate, 1);
// 직선보간구동.
AxmLineMove(lCoordinate, dPos, 200, 400, 400);
Visual Basic
Dim lCoordinate As Long
Dim Distance(0 To 2) As Double
Dim axes(0 To 2) As Long
Dim i As Long
lCoordinate = 0 

For i = 0 To 2
    axes(i) = i
Next i

Distance(0) = 4000
Distance(1) = 4000
AxmContiWriteClear lCoordinate
AxmContiSetAxisMap lCoordinate, 2, axes(0)

‘상대위치구동.
AxmContiSetAbsRelMode lCoordinate, 1

‘직선보간구동.
AxmLineMove lCoordinate, Distance(0), 200, 400, 400

Delphi
var
    i : LongInt;
    lCoordinate : LongInt;
    lAxis : array [0..1] of Longint;
    dPos : array [0..1] of Double;
    lPosSize : LongInt;

begin
    lCoordinate := 0;
    lPosSize := 2;
        for i := 0 to 1 do
            begin
                lAxis[i] := i;
            end;
    dPos[0] := 4000;
    dPos[1] := 4000;
    AxmContiWriteClear(lCoordinate);
    AxmContiSetAxisMap(lCoordinate, lPosSize, @lAxis);

    { 상대위치구동. }
    AxmContiSetAbsRelMode(lCoordinate, 1);

    { 직선보간구동. }
    AxmLineMove(lCoordinate, @dPos, 200, 400, 400);
end;

예제코드 : 연속보간구동함수

직선 연속 보간 구동을 위해 내부 Queue 에 저장하는 함수이다. 연속 보간 구동을 사용시 내부 Queue 에 보간 명령을 저장하기 위해 이 함수를 사용한다. 연속 보간 구동 중 직선 보간 구동을 저장하기 위해 이 함수를 사용한다. 내부 Queue 에 연속으로 구동할 보간 동작들을 저장한 후 ‘AxmContiStart’ 함수를 실행하면 저장된 모든 보간 구동을 연속적으로 실행할 수 있다.

C++
long lAxis[2];
double dPos[2];
long lPosSize = 2;
long lCoordinate = 0;
double dVelocity = 200, dAccel = 400;
lAxis[0] = 0;
lAxis[1] = 1;
AxmContiWriteClear(lCoordinate);
AxmContiSetAxisMap(lCoordinate, lPosSize, lAxis);
//절대위치구동등록.
AxmContiSetAbsRelMode(lCoordinate, 0);
AxmContiBeginNode(lCoordinate);
dPos[0] = 100 , dPos[1] = 100;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel); 
dPos[0] = 200 , dPos[1] = 200;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel); 
dPos[0] = 300 , dPos[1] = 300;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel); 
dPos[0] = 400 , dPos[1] = 400;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel); 
dPos[0] = 500 , dPos[1] = 500;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel); 
dPos[0] = 600 , dPos[1] = 600;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel); 
dPos[0] = 700 , dPos[1] = 700;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel);
dPos[0] = 800 , dPos[1] = 800;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel); 
dPos[0] = 900 , dPos[1] = 900;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel); 
dPos[0] = 1000 , dPos[1] = 1000;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel); 
dPos[0] = 1100 , dPos[1] = 1100;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel);
AxmContiEndNode(lCoordinate);
//절대위치구동시작.
AxmContiSetAbsRelMode(lCoordinate, 0);
// 연속보간구동시작.
AxmContiStart(lCoordinate, 0, 0);
Visual Basic
Dim dVelocity As Double
Dim dAccel As Double
Dim lPosSize As Long
Dim lCoordinate As Long 
Dim dPos(0 To 1) As Double
Dim axes(0 To 1) As Long
Dim i As Long
dVelocity = 200
dAccel = 400
lPosSize = 2
lCoordinate = 0 
For i = 0 To 1
 axes(i) = i
Next i 

AxmContiWriteClearlCoordinate
AxmContiSetAxisMaplCoordinate, lPosSize, axes(0)
‘절대위치구동등록시작.
AxmContiSetAbsRelModelCoordinate, 0
AxmContiBeginNodelCoordinate
dPos(0) = 100: dPos(1) = 100
AxmLineMove lCoordinate, dPos(0), dVelocity, dAccel, dAccel
dPos(0) = 200: dPos(1) = 200
AxmLineMove lCoordinate, dPos(0), dVelocity , dAccel, dAccel
dPos(0) = 300: dPos(1) = 300
AxmLineMove lCoordinate, dPos(0), dVelocity , dAccel, dAccel
dPos(0) = 400: dPos(1) = 400
AxmLineMove lCoordinate, dPos(0), dVelocity , dAccel, dAccel
dPos(0) = 500: dPos(1) = 500
AxmLineMove lCoordinate, dPos(0), dVelocity , dAccel, dAccel
dPos(0) = 600: dPos(1) = 600
AxmLineMove lCoordinate, dPos(0), dVelocity , dAccel, dAccel
dPos(0) = 700: dPos(1) = 700
AxmLineMove lCoordinate, dPos(0), dVelocity , dAccel, dAccel
AxmContiEndNodelCoordinate

‘절대위치구동시작.
AxmContiSetAbsRelModelCoordinate, 0
‘연속보간구동시작.
AxmContiStart lCoordinate, 0, 0

Delphi
var
    i : LongInt;
    dVelocity, dAccel : Double;
    lAxis : array [0..1] of LongInt;
    dPos : array [0..1] of Double;
    lCoordinate : LongInt;
    lPosSize : LongInt;


begin
    dVelocity := 200;
    dAccel := 400;
    lPosSize := 2;
    lCoordinate := 0;
    {절대위치구동등록. }
    AxmContiSetAbsRelMode(lCoordinate, 0);
    for i := 0 to 1 do
    begin
        lAxis[i] := i;
    end;
    AxmContiWriteClear(lCoordinate);
    AxmContiSetAxisMap(lCoordinate, 2, @lAxis);
    AxmContiBeginNode(lCoordinate);
    dPos[0] := 100 ; dPos[1] := 100;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dPos[0] := 200 ; dPos[1] := 200;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dPos[0] := 300 ; dPos[1] := 300;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dPos[0] := 400 ; dPos[1] := 400;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dPos[0] := 500 ; dPos[1] := 500;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dPos[0] := 600 ; dPos[1] := 600;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dPos[0] := 700 ; dPos[1] := 700;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    AxmContiEndNode(lCoordinate);
    {절대위치구동시작. }
    AxmContiSetAbsRelMode(lCoordinate, 0);
    { 연속보간구동시작. }
    AxmContiStart(lCoordinate, 0, 0);
end;

AxmCircleCenterMove

Purpose

지정된 좌표계에 시작점, 종료점과 중심점을 지정하여 원호 보간 구동하는 함수이다, 구동 시작 후 함수를 벗어난다.

Format

C++
DWORD AxmCircleCenterMove(long lCoord, long *lAxisNo, double 
*dCenterPos, double *dEndPos, double dVel, double dAccel, double 
dDecel, DWORD uCWDir);
Visual Basic
Function AxmCircleCenterMove(ByVal lCoord As Long, ByRef lAxisNo As 
Long, ByRef dCenterPos As Double, ByRef dEndPosAs Double, ByVal dVel 
As Double, ByVal dAccel As Double, ByVal dDecel As Double, ByVal 
uCWDir As Long) As Long
Delphi
function AxmCircleCenterMove(lCoord : LongInt; lAxisNo : PLongInt; 
dCenterPos: PDouble; dEndPos: PDouble; dVel : Double; dAccel : 
Double; dDecel : Double; uCWDir : DWord) : DWord; stdcall;

Parameters

[in/out] Name [Init Value] Explanation
[in]lCoord 좌표계 변호(0 ~ (최대축수 -1))
[in]AxisNo 보간에 사용되는 채널(축) 번호(0 ~ (최대축수 - 1)) 배열
[in]dCenterPos X 축 원점 위치값, Y 축 원점 위치값 배열
[in]dEndPos X 축 종료 위치값, Y 축 종료 위치값 배열
[in]dVel 구동 속도값 (+방향: 0 이상값 , -방향: 0이하값,
구동속도의 단위는 Unit/pulse를 1/1로 한경우에 PPS[Pulses/sec])
[in]dpAccel 가속도 (가속도의 단위는 Unit/pulse를 1/1로 한경우에 PPS[Pulses/sec^2]) 배열
[in]dpDecel 감속도(감속도의 단위는 Unit/pulse를 1/1로 한경우에 PPS[Pulses/sec^2]) 배열
[in]uCWDir 원호 방향: AXT_MOTION_MOVE_DIR_DEF
- [00h]반시계방향
- [01h]시계방향

Return Values

[0000] AXT_RT_SUCCESS : 함수 실행 성공
[1054] AXT_RT_NOT_SUPPORT_VERSION : 지원하지 않는 하드웨어 일 경우
[4158] AXT_RT_MOTION_INVALID_POSITION : 위치값 입력이 잘못 되었을 때
[4160] AXT_RT_ERROR_NOT_SAME_BOARD : 똑같은 보드 내에 있지 않을 경우
[4166] AXT_ERROR_CONTI_INVALID_MAP_NO: 연속 보간 맵핑 번호가 비워있을 때
[4201] AXT_RT_MOTION_HOME_SEARCHING: 보간구동 할 축 중 원점 구동중인 축이 있을 때
* See error code Table for more information on status error codes

Description

원호보간은 임의의 두 축에 대해서 적용된다. 맵핑된 두 축을 X,Y 축으로 간주하여 설명한다. 여기서 X 축은 맵핑된 두축중에서 축번호가 낮은 축을 의미하며 Y 축은 축번호가 높은 축을 의미한다. 예를 들어 Z,U 축이 맵핑된 두 축이라면 Z 축이 X 축에 해당되며 U 축이 Y 축에 해당한다.

AxmContiBeginNode, AxmContiEndNode, 와 같이사용시 지정된 좌표계에 시작점, 종료점과 중심점을 지정하여 구동하는 원호 보간 Queue 에 저장함수이다. 프로파일 원호 연속 보간 구동을 위해 내부 Queue 에 저장하여 AxmContiStart 함수를 사용해서 시작한다. 이 함수를 수행하기 전에 AxmContiSetAxisMap 함수는 보간작업을 수행할 축들을 맵번호로 축맵핑한다. 연속보간 뿐만 아니라 일반보간제어에 관련된 함수들도 파라미터의 전달이 간편하므로 적용된다. 따라서 일반보간제어에 관련된 함수들을 사용하기 전에 가장 먼저 이 함수를 사용하여 사용할 축들을 맵핑한다.

현재 위치는 원호 구동의 시작점이 되며 설정한 중점과 종점을 기준으로 원호 구동을 한다.

MultiMove-AxmCircleCenterMove

▶주의사항: AxmContiSetAxisMap 함수를 이용하여 축 맵핑을 하며 축은 낮은 순서부터 맵핑을 한다. 원호보간의 경우에 반드시 낮은 축부터 배열에 넣어야 한다.

▶주의사항: +LIMIT, -LIMIT 신호가 입력된 상태에서는 구동되지 않는다.

▶ AxmSStop, AxmEstop 함수에 의해 모션감속정지, 모션급정지할수있다. 인자는 반드시 Coordinate 의 첫번째 축(가장 낮은 실제 축번호)을 넣어서 정지시킨다.

▶ AxmContiIsMotion 함수에 의해 모션 중인지 확인할 수 있다.

▶ AxmSignalSetInpos 함수를 사용하는 경우에는 Inposition 입력신호가 Enable 로 설정되어 있다면 Command 펄스 출력이 완료해도 INP 입력이 ON 되기 전까지는 모션이 완료되지 않은 것으로 간주되어 반환 되지 않는다. (AxmSignalSetInpos 함수 참고)

▶ 주의사항: 보간하는축은 Unit/Pulse 를 동일하게 설정한다. Unit/Pulse 를 똑같이 맞추지 않으면 단위가 틀려 지므로 반드시 똑같이 맞추어 보간제어를 하여야 한다.

▶ 4 축 이상을 구성하였을 때

다축 모션보드는 Axis 0 – 3 의 4 개의 축이 축그룹 1 로 구분되고 Axis4 – 7 4 개의 축이 축그룹 2 로 구분되고 Axis8 – 11 4 개의 축이 축그룹 3 으로 ….. 구분된다. 동일 그룹에 속하는 축들간의 직선보간 구동, 원호보간구동을 사용할 수 있지만, 서로 다른 축그룹에 속한 축들간의 직선보간구동과 원호보간구동은 사용할 수 없다. Coordinate 를 지정할 때 주의하여야 한다.

예제코드 : 일반 보간

C++
long lAxis[2];
double dCenPos[2];
double dEndPos[2];
long lPosSize = 2;
long lCoordinate = 0;
lAxis[0] = 0;
lAxis[1] = 1;
dCenPos[0] = 500;
dCenPos[1] = 500;
dEndPos[0] = 1000;
dEndPos[1] = 0;
AxmContiWriteClear(lCoordinate);
AxmContiSetAxisMap(lCoordinate, lPosSize, lAxis);
AxmContiSetAbsRelMode(lCoordinate, 1); //상대위치구동.
// CW 방향으로원호보간구동.
AxmCircleCenterMove(lCoordinate, lAxis, dCenPos, dEndPos, 200, 400, 400, DIR_CW);
Visual Basic
Dim Distance(0 To 2) As Double
Dim CenDistance(0 To 2) As Double
Dim axes(0 To 2) As Long
Dim i As Long
Dim lCoordinate As Long
CenDistance(0) = 500
CenDistance(1) = 500
Distance(0) = 1000
Distance(1) = 0
lCoordinate = 0 

For i = 0 To 2
    axes(i) = i
Next i

AxmContiWriteClearlCoordinate
AxmContiSetAxisMap lCoordinate, 2, axes(0)
AxmContiSetAbsRelModelCoordinate, 1
' CW 방향으로원호보간구동.
AxmCircleCenterMove lCoordinate, axes(0), CenDistance(0), Distance(0), 200, 400, 400, DIR_CW

Delphi
var
    i : LongInt;
    lCoordinate : LongInt;
    lAxis : array [0..1] of Longint;
    dCenPos : array [0..1] of Double;
    dEndPos : array [0..1] of Double;
    lPosSize : LongInt;


begin
    dCenPos[0] := 500;
    dCenPos[1] := 500;
    dEndPos[0] := 1000;
    dEndPos[1] := 0;
    lCoordinate := 0;
    lPosSize := 2;

    for i := 0 to 1 do
        begin
            lAxis[i] := i;
        end;

    AxmContiWriteClear(lCoordinate);
    AxmContiSetAxisMap(lCoordinate, lPosSize, @lAxis);
    AxmContiSetAbsRelMode(lCoordinate, 1); {상대위치구동. }
    AxmCircleCenterMove(lCoordinate, @lAxis, @dCenPos, @dEndPos, 200, 400, 400, DIR_CW);

end;

예제코드 : 연속보간구동함수

C++
long lAxis[2];
double dPos[2];
long lPosSize = 2;
long lCoordinate = 0;

double dCenPos[2];
double dEndPos[2];
double dVelocity = 200;
double dAccel = 400;

for(int i=0; i<lPosSize; i++)
{
    lAxis[i] = i;
}

AxmContiWriteClear(lCoordinate);
AxmContiSetAxisMap(lCoordinate, lPosSize, lAxis);
//상대위치구동.
AxmContiSetAbsRelMode(lCoordinate, 1);
AxmContiBeginNode(lCoordinate); 
dPos[0] = 100 , dPos[1] = 100;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel);
dPos[0] = 200 , dPos[1] = 200;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel);
dCenPos[0] = 300 , dCenPos[1] = 300; dEndPos[0] = 400; dEndPos[1] = 400;
AxmCircleCenterMove(lCoordinate, lAxis, dCenPos, dEndPos, dVelocity, dAccel, dAccel, 
DIR_CCW);
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel);
dPos[0] = 400 , dPos[1] = 400;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel);
dCenPos[0] = 500 , dCenPos[1] = 500; dEndPos[0] = 600; dEndPos[1] = 600;
AxmCircleCenterMove(lCoordinate, lAxis, dCenPos, dEndPos, dVelocity, dAccel, dAccel, 
DIR_CCW);
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel);
dPos[0] = 600 , dPos[1] = 600;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel);
dPos[0] = 700 , dPos[1] = 700;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel);
AxmContiEndNode(lCoordinate);
//상대위치구동.
AxmContiSetAbsRelMode(lCoordinate, 1);
AxmContiStart(lCoordinate, 0, 0);
Visual Basic
Dim dVelocity As Double
Dim dAccel As Double
Dim lPosSize As Long
Dim dPos(0 To 1) As Double
Dim dCenPos(0 To 1) As Double
Dim lCoordinate As Long
Dim axes(0 To 1) As Long
Dim i As Long
lPosSize = 2
lCoordinate = 0 

For i = 0 To 1
    axes(i) = i
Next i

dVelocity = 200
dAccel = 400
AxmContiWriteClearlCoordinate
AxmContiSetAxisMap lCoordinate, lPosSize, axes(0)
‘상대위치구동.
AxmContiSetAbsRelModelCoordinate, 1
AxmContiBeginNode lCoordinate
dPos(0) = 100: dPos(1) = 100
AxmLineMove lCoordinate, dPos(0), dVelocity, dAccel, dAccel
dPos(0) = 200: dPos(1) = 200
AxmLineMove lCoordinate, dPos(0), dVelocity , dAccel, dAccel
dPos(0) = 300: dPos(1) = 300
AxmLineMove lCoordinate, dPos(0), dVelocity, dAccel, dAccel
AxmCircleCenterMove lCoordinate, axes(0), dCenPos(0), dPos(0), dVelocity, dAccel, 
dAccel, DIR_CCW
dPos(0) = 400: dPos(1) = 400
AxmLineMove lCoordinate, dPos(0), dVelocity, dAccel, dAccel
AxmCircleCenterMove lCoordinate, axes(0), dCenPos(0), dPos(0), dVelocity, dAccel, 
dAccel, DIR_CCW
dPos(0) = 500: dPos(1) = 500
AxmLineMove lCoordinate, dPos(0), dVelocity , dAccel, dAccel
dPos(0) = 600: dPos(1) = 600
AxmLineMove lCoordinate, dPos(0), dVelocity, dAccel, dAccel
dPos(0) = 700: dPos(1) = 700
AxmLineMove lCoordinate, dPos(0), dVelocity , dAccel, dAccel
AxmContiEndNodelCoordinate
AxmContiSetAbsRelModelCoordinate, 1
AxmContiStart lCoordinate, 0, 0

Delphi
var
    i : LongInt;
    dVelocity, dAccel : Double;
    lAxis : array [0..1] of LongInt;
    dPos : array [0..1] of Double;
    dCenPos : array [0..1] of Double;
    dEndPos : array [0..1] of Double;
    lCoordinate : LongInt;
    lPosSize : LongInt;

begin
    dVelocity := 200;
    dAccel := 400;
    lPosSize := 2;
    lCoordinate := 0;
    for i := 0 to 1 do
        begin
            lAxis[i] := i;
        end;

    {상대좌표로등록. }
    AxmContiWriteClear(lCoordinate);
    AxmContiSetAxisMap(lCoordinate, 2, @lAxis);
    AxmContiSetAbsRelMode(lCoordinate, 1);
    AxmContiBeginNode(lCoordinate);
    dPos[0] := 100 ; dPos[1] := 100;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dPos[0] := 200 ; dPos[1] := 200;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dPos[0] := 300 ; dPos[1] := 300;
    dCenPos[0] := 300; dCenPos[1] := 300; dEndPos[0] := 400; dEndPos[1] := 400;
    AxmCircleCenterMove(lCoordinate, @lAxis, @dCenPos, @dEndPos, dVelocity, dAccel, 
    dAccel, 0);
    dPos[0] := 400 ; dPos[1] := 400;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dPos[0] := 500 ; dPos[1] := 500;
    dCenPos[0] := 500; dCenPos[1] := 500; dEndPos[0] := 600; dEndPos[1] := 600;
    AxmCircleCenterMove(lCoordinate, @lAxis, @dCenPos, @dEndPos, dVelocity, dAccel, 
    dAccel, 0);
    dPos[0] := 600 ; dPos[1] := 600;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dPos[0] := 700 ; dPos[1] := 700;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    AxmContiEndNode(lCoordinate);
    {상대좌표로구동. }
    AxmContiSetAbsRelMode(lCoordinate, 1);
    AxmContiStart(lCoordinate, 0, 0);
end;

AxmCirclePointMove

Purpose

지정된 좌표계에 중간점, 종료점을 지정하여 이차원 원호 보간을 하는 함수이다. 구동 시작 후 함수를 벗어난다.

Format

C++
DWORD AxmCirclePointMove(long lCoord, long *lAxisNo, double *dMidPos, 
double *dEndPos, double dVel, double dAccel, double dDecel, long 
lArcCircle);
Visual Basic
Function AxmCirclePointMove(ByVal lCoord As Long, ByRef lAxisNo As 
Long, ByRef dMidPos As Double, ByRef dEndPos As Double, ByVal dVel As 
Double, ByVal dAccel As Double, ByVal dDecel As Double, ByVal 
lArcCircle As Long) As Long
Delphi
function AxmCirclePointMove(lCoord : LongInt; lAxisNo : PLongInt; 
dMidPos : PDouble; dEndPos : PDouble; dVel : Double; dAccel : Double; 
dDecel : Double; lArcCircle: LongInt) : DWord; stdcall;

Parameters

[in/out] Name [Init Value] Explanation
[in]lCoord 좌표계 변호(0 ~ (최대축수 -1))
[in]AxisNo 보간에 사용되는 채널(축) 번호(0 ~ (최대축수 - 1)) 배열
[in]dCenterPos X 축 원점 위치값, Y 축 원점 위치값 배열
[in]dEndPos X 축 종료 위치값, Y 축 종료 위치값 배열
[in]dVel 구동 속도값 (+방향: 0 이상값 , -방향: 0이하값,
구동속도의 단위는 Unit/pulse를 1/1로 한경우에 PPS[Pulses/sec])
[in]dpAccel 가속도 (가속도의 단위는 Unit/pulse를 1/1로 한경우에 PPS[Pulses/sec^2]) 배열
[in]dpDecel 감속도(감속도의 단위는 Unit/pulse를 1/1로 한경우에 PPS[Pulses/sec^2]) 배열
[in]lArcCircle 원호 종류:
- [00h] Arc
- [01h] Circle

Return Values

[0000] AXT_RT_SUCCESS : 함수 실행 성공
[1054] AXT_RT_NOT_SUPPORT_VERSION : 지원하지 않는 하드웨어 일 경우
[4158] AXT_RT_MOTION_INVALID_POSITION : 위치값 입력이 잘못 되었을 때
[4160] AXT_RT_ERROR_NOT_SAME_BOARD : 똑같은 보드 내에 있지 않을 경우
[4166] AXT_ERROR_CONTI_INVALID_MAP_NO: 연속 보간 맵핑 번호가 비워있을 때
[4201] AXT_RT_MOTION_HOME_SEARCHING: 보간구동 할 축 중 원점 구동중인 축이 있을 때
* See error code Table for more information on status error codes

Description

원호보간은 임의의 두 축에 대해서 적용된다. 맵핑된 두 축을 X,Y 축으로 간주하여 설명한다. 여기서 X 축은 맵핑된 두축중에서 축번호가 낮은 축을 의미하며 Y 축은 축번호가 높은 축을 의미한다.

예를 들어 Z,U 축이 맵핑된 두 축이라면 Z 축이 X 축에 해당되며 U 축이 Y 축에 해당한다.

AxmContiBeginNode, AxmContiEndNode 와 같이사용시 지정된 좌표계에 중간점, 종료점을 지정하여 구동하는 원호 보간 Queue 에 저장함수이다.프로파일 원호 연속 보간 구동을 위해 내부 Queue 에 저장하여 AxmContiStart 함수를 사용해서 시작한다. 이 함수를 수행하기 전에 AxmContiSetAxisMap 함수는 보간작업을 수행할 축들을 맵번호로 축맵핑한다. 연속보간 뿐만 아니라 일반보간제어에 관련된 함수들도 파라미터의 전달이 간편하므로 적용된다. 따라서 일반보간제어에 관련된 함수들을 사용하기 전에 가장 먼저 이 함수를 사용하여 사용할 축들을 맵핑한다.

현재 위치는 원호 구동의 시작점이 되며 중간점을 지나는 원호 구동을 한다

MultiMove-AxmCirclePointMove

▶주의사항: AxmContiSetAxisMap 함수를 이용하여 축 맵핑을 하며 축은 낮은 순서부터 맵핑을 한다. 원호보간의 경우에 반드시 낮은 축부터 배열에 넣어야 한다.

▶주의사항: +LIMIT, -LIMIT 신호가 입력된 상태에서는 구동되지 않는다.

▶ AxmSStop, AxmEstop 함수에 의해 모션감속정지, 모션급정지할수있다. 인자는 반드시 Coordinate 의 첫번째 축(가장 낮은 실제 축번호)을 넣어서 정지시킨다.

▶ AxmContiIsMotion 함수에 의해 모션 중인지 확인할 수 있다.

▶ AxmSignalSetInpos 함수를 사용하는 경우에는 Inposition 입력신호가 Enable 로 설정되어 있다면 Command 펄스 출력이 완료해도 INP 입력이 ON 되기 전까지는 모션이 완료되지 않은 것으로 간주되어 반환 되지 않는다. (AxmSignalSetInpos 함수 참고)

▶ 주의사항: 보간하는축은 Unit/Pulse 를 동일하게 설정한다. Unit/Pulse 를 똑같이 맞추지 않으면 단위가 틀려 지므로 반드시 똑같이 맞추어 보간제어를 하여야 한다.

▶ 4 축 이상을 구성하였을 때

다축 모션보드는 Axis 0 – 3 의 4 개의 축이 축그룹 1 로 구분되고 Axis4 – 7 4 개의 축이 축그룹 2 로 구분되고 Axis8 – 11 4 개의 축이 축그룹 3 으로 ….. 구분된다. 동일 그룹에 속하는 축들간의 직선보간 구동, 원호보간구동을 사용할 수 있지만, 서로 다른 축그룹에 속한 축들간의 직선보간구동과 원호보간구동은 사용할 수 없다. Coordinate 를 지정할 때 주의하여야 한다.

예제코드 : 일반 보간

C++
long lAxis[2];
double dMidPos[2];
double dEndPos[2];
long lPosSize = 2;
long lCoordinate = 0;
double dVelocity = 200;
double dAccel = 400;
lAxis[0] = 0;
lAxis[1] = 1;
dMidPos[0] = 500;
dMidPos[1] = 500;
dEndPos[0] = 1000;
dEndPos[1] = 0;
AxmContiWriteClear(lCoordinate);
AxmContiSetAxisMap(lCoordinate, lPosSize, lAxis);
AxmContiSetAbsRelMode(lCoordinate, 1);
AxmCirclePointMove(lCoordinate, lAxis, dMidPos, dEndPos, dVelocity, dAccel, dAccel, 0);
Visual Basic
Dim dVelocity As Double
Dim dAccel As Double
Dim Distance(0 To 2) As Double
Dim MidDistance(0 To 2) As Double
Dim axes(0 To 2) As Long
Dim i As Long
Dim lCoordinate As Long
Distance(0) = 1000
Distance(1) = 0
MidDistance(0) = 500
MidDistance(1) = 500
dVelocity = 200
dAccel = 400
lCoordinate = 0 
For i = 0 To 2
    axes(i) = i
Next i
AxmContiWriteClearlCoordinate
AxmContiSetAxisMaplCoordinate, 2, axes(0)
AxmContiSetAbsRelModelCoordinate, 1
AxmCirclePointMovelCoordinate, axes(0), MidDistance(0), Distance(0), dVelocity, dAccel, dAccel, 0

Delphi
var
    velocity, accel : Double;
    i : LongInt;
    lCoordinate : LongInt;
    lAxis : array [0..1] of Longint;
    dPos : array [0..1] of Double;
    dMidPos : array [0..1] of Double;
    dEndPos : array [0..1] of Double;
    lPosSize : LongInt;

begin
    dMidPos[0] := 500;
    dMidPos[1] := 500;
    dEndPos[0] := 1000;
    dEndPos[1] := 0;
    velocity := 200;
    accel := 400;
    lCoordinate := 0;
    lPosSize := 2;
    for i := 0 to 1 do
    begin
        lAxis[i] := i;
    end;

    AxmContiWriteClear(lCoordinate);
    AxmContiSetAxisMap(lCoordinate, lPosSize, @lAxis);
    AxmContiSetAbsRelMode(lCoordinate, 1);
    AxmCirclePointMove(lCoordinate, @lAxis, @dMidPos, @dEndPos, velocity, accel, accel, 0);
end;

예제코드 : 연속보간구동함수

2 축 원호 보간 구동 시작 함수이다.

현재 위치는 원호 구동의 시작점이 되며 중간점을 기준으로 원호 구동을 한다

C++
long lAxis[2];
double dPos[2];
long lPosSize = 2;
long lCoordinate = 0;
double dMidPos[2];
double dEndPos[2];
double dVelocity = 200;
double dAccel = 400;
for(int i=0; i<lPosSize; i++)
{
    lAxis[i] = i;
}
AxmContiWriteClear(lCoordinate);
AxmContiSetAxisMap(lCoordinate, lPosSize, lAxis);
AxmContiSetAbsRelMode(lCoordinate, 1);
AxmContiBeginNode(lCoordinate); 
dPos[0] = 100 , dPos[1] = 100;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel);
dPos[0] = 200 , dPos[1] = 200;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel);
dMidPos [0] = 300 , dMidPos [1] = 300; dEndPos[0] = 400; dEndPos[1] = 300;
AxmCirclePointMove(lCoordinate, lAxis, dMidPos, dEndPos, dVelocity, dAccel, dAccel, DIR_CCW);
dPos[0] = 400 , dPos[1] = 400;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel);
dMidPos[0] = 500 , dMidPos[1] = 500; dEndPos[0] = 600; dEndPos[1] = 500;
AxmCirclePointMove(lCoordinate, lAxis, dMidPos, dEndPos, dVelocity, dAccel, dAccel, DIR_CCW);
dPos[0] = 600 , dPos[1] = 600;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel);
dPos[0] = 700 , dPos[1] = 700;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel);
AxmContiEndNode(lCoordinate);
AxmContiSetAbsRelMode(lCoordinate, 1);
AxmContiStart(lCoordinate, 0, 0);
Visual Basic
Dim dVelocity As Double
Dim dAccel As Double
Dim lPosSize As Long
Dim lCoordinate As Long
Dim dPos(0 To 1) As Double
Dim dMidPos(0 To 1) As Double
Dim dEndPos(0 To 1) As Double
Dim axes(0 To 1) As Long
Dim i As Long
lPosSize = 2
lCoordinate = 0 
For i = 0 To 1
    axes(i) = i
Next i
dVelocity = 200
dAccel = 400
AxmContiWriteClearlCoordinate
AxmContiSetAxisMaplCoordinate, lPosSize, axes(0)
AxmContiSetAbsRelModelCoordinate, 1
AxmContiBeginNode lCoordinate
dPos(0) = 100: dPos(1) = 100
AxmLineMovelCoordinate, dPos(0), dVelocity, dAccel, dAccel
dPos(0) = 200: dPos(1) = 200
AxmLineMovelCoordinate, dPos(0), dVelocity, dAccel, dAccel
dPos(0) = 300: dPos(1) = 300
AxmLineMovelCoordinate, dPos(0), dVelocity, dAccel, dAccel
dMidPos(0) = 300 : dMidPos(1) = 300 : dEndPos(0) = 400 :dEndPos(1) = 300
AxmCirclePointMovelCoordinate, axes(0), dMidPos(0), dEndPos(0), dVelocity, dAccel, dAccel, DIR_CCW
dPos(0) = 400: dPos(1) = 400
AxmLineMovelCoordinate, dPos(0), dVelocity, dAccel, dAccel
dMidPos(0) = 500: dMidPos(1) = 500 :dEndPos(0) = 600 :dEndPos(1) = 500
AxmCirclePointMovelCoordinate, axes(0), dMidPos(0), dEndPos(0), dVelocity, dAccel, dAccel, DIR_CCW
dPos(0) = 500: dPos(1) = 500
AxmLineMovelCoordinate, dPos(0), dVelocity, dAccel, dAccel
dPos(0) = 600: dPos(1) = 600
AxmLineMovelCoordinate, dPos(0), dVelocity, dAccel, dAccel
dPos(0) = 700: dPos(1) = 700
AxmLineMovelCoordinate, dPos(0), dVelocity, dAccel, dAccel
AxmContiEndNode lCoordinate
AxmContiSetAbsRelModelCoordinate, 1
AxmContiStart lCoordinate, 0, 0

Delphi
var
    i : LongInt;
    dVelocity, dAccel : Double;
    lAxis : array [0..1] of LongInt;
    dPos : array [0..1] of Double;
    dMidPos : array [0..1] of Double;
    dEndPos : array [0..1] of Double;
    lCoordinate : LongInt;
    lPosSize : LongInt;

begin
    dVelocity := 200;
    dAccel := 400;
    lPosSize := 2;
    lCoordinate := 0;
    AxmContiSetAbsRelMode(lCoordinate, 1);
    for i := 0 to 1 do
        begin
            lAxis[i] := i;
        end;
    AxmContiWriteClear(lCoordinate);
    AxmContiSetAxisMap(lCoordinate, 2, @lAxis);
    AxmContiBeginNode(lCoordinate);
    dPos[0] := 100 ; dPos[1] := 100;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dPos[0] := 200 ; dPos[1] := 200;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dPos[0] := 300 ; dPos[1] := 300;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dMidPos[0] := 300; dMidPos[1] := 300; dEndPos[0] := 400; dEndPos[1] := 300;
    AxmCirclePointMove(lCoordinate, @lAxis, @dMidPos, @dEndPos, dVelocity, dAccel, dAccel, DIR_CCW);
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dPos[0] := 400 ; dPos[1] := 400;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dPos[0] := 500 ; dPos[1] := 500;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dMidPos[0] := 500; dMidPos[1] := 500; dEndPos[0] := 600; dEndPos[1] := 500;
    AxmCirclePointMove(lCoordinate, @lAxis, @dMidPos, @dEndPos, dVelocity, dAccel, dAccel, DIR_CCW);
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dPos[0] := 600 ; dPos[1] := 600;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dPos[0] := 700 ; dPos[1] := 700;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    AxmContiEndNode(lCoordinate);
    AxmContiSetAbsRelMode(lCoordinate, 1);
    AxmContiStart(lCoordinate, 0, 0);
end;

AxmCirclePointMoveEx

Purpose

AxmCirclePointMove 와 사용법은 동일하며 삼차원 이상의 원/원호 보간을 지원한다.

Format

C++
DWORD AxmCirclePointMove(long lCoordNo, long *lAxisNo, double 
*dMidPos, double *dEndPos, double dVel, double dAccel, double dDecel, 
long lArcCircle, long lArraySize);
Visual Basic
Function AxmCirclePointMove(ByVal lCoordNo As Long, ByRef lAxisNo As 
Long, ByRef dMidPos As Double, ByRef dEndPos As Double, ByVal dVel As 
Double, ByVal dAccel As Double, ByVal dDecel As Double, ByVal 
lArcCircle As Long, ByVal lArraySize As Long) As Long
Delphi
function AxmCirclePointMove(lCoordNo: LongInt; lAxisNo : PLongInt; 
dMidPos : PDouble; dEndPos : PDouble; dVel : Double; dAccel : Double; 
dDecel : Double; lArcCircle: LongInt; lArraySize: LongInt) : DWord; 
stdcall;

Parameters

[in/out] Name [Init Value] Explanation
[in]lCoord 좌표계 변호(0 ~ (최대축수 -1))
[in]AxisNo 보간에 사용되는 채널(축) 번호(0 ~ (최대축수 - 1)) 배열
[in]dMidPos 중간 위치값 배열
[in]dEndPos 종료 위치값 배열
[in]dVel 구동 속도값 (‘+’값만 사용하여야 함.)
[in]dpAccel 가속도 (가속도의 단위는 Unit/pulse를 1/1로 한경우에 PPS[Pulses/sec^2]) 배열
[in]dpDecel 감속도(감속도의 단위는 Unit/pulse를 1/1로 한경우에 PPS[Pulses/sec^2]) 배열
[in]lArcCircle 원호 종류:
- [00h] Arc
- [01h] Circle
[in]lArraySize 보간에 사용되는 채널(축) 개수

Return Values

[0000] AXT_RT_SUCCESS : 함수 실행 성공
[1054] AXT_ERROR_CONTI_EMPTY_MAP_NO : 연속보간 맵핑 번호가 비워 있을 때
[4158] AXT_RT_MOTION_INVALID_POSITION : 위치 값 입력이 잘못 되었을 때
* See error code Table for more information on status error codes

Description

AxmCirclePointMove 는 이차원에서의 원호보간 함수이며 AxmCirclePointMoveEx 는 삼차원 이상의 원호보간을 지원한다.

지정된 좌표계에서의 현재위치, 중간위치, 종료위치를 사용하여 원호보간을 한다. AxmContiQBegin 함수와 함께 사용하여 연속 보간 구동을 할 수 있다.

MultiMove-AxmCirclePointMove

▶주의사항: AxmContiSetAxisMap 함수를 이용하여 축 맵핑을 하며 축은 낮은 순서부터 맵핑을 한다. 원호보간의 경우에 반드시 낮은 축부터 배열에 넣어야 한다.

▶주의사항: +LIMIT, -LIMIT 신호가 입력된 상태에서는 구동되지 않는다.

▶ AxmSStop, AxmEstop 함수에 의해 모션감속정지, 모션급정지할수있다. 인자는 반드시 Coordinate 의 첫번째 축(가장 낮은 실제 축번호)을 넣어서 정지시킨다.

▶ AxmMoveCoordStop, AxmMoveCoordEStop, AxmMoveCoordSStop 를 사용하여 감속정지 및 급정지를 할 수 있다.

▶ AxmSignalSetInpos 함수를 사용하는 경우에는 Inposition 입력신호가 Enable 로 설정되어 있다면 Command 펄스 출력이 완료해도 INP 입력이 ON 되기 전까지는 모션이 완료되지 않은 것으로 간주되어 반환 되지 않는다. (AxmSignalSetInpos 함수 참고)

▶ 주의사항: 보간하는축은 Unit/Pulse 를 동일하게 설정한다. Unit/Pulse 를 똑같이 맞추지 않으면 단위가 틀려 지므로 반드시 똑같이 맞추어 보간제어를 하여야 한다.

예제코드 : 일반 보간

C++
long lAxis[3];
double dMidPos[3];
double dEndPos[3];
long lPosSize = 3;
long lCoordinate = 0;
double dVelocity = 200;
double dAccel = 400;
long lArraySize = 3;
lAxis[0] = 0;
lAxis[1] = 1;
lAxis[2] = 2;
dMidPos[0] = 500;
dMidPos[1] = 500;
dMidPos[2] = 500;
dEndPos[0] = 1000;
dEndPos[1] = 1000;
dEndPos[2] = 0;
AxmContiSetAxisMap(lCoordinate, lPosSize, lAxis);
AxmCirclePointMove(lCoordinate, lAxis, dMidPos, dEndPos, dVelocity, dAccel, dAccel, 0, lArraySize);
Visual Basic
Dim dVelocity As Double
Dim dAccel As Double
Dim Distance(0 To 3) As Double
Dim MidDistance(0 To 3) As Double
Dim axes(0 To 3) As Long
Dim i As Long
Dim lCoordinate As Long
Dim lArraySize As Long
Distance(0) = 1000
Distance(1) = 1000
Distance(2) = 0
MidDistance(0) = 500
MidDistance(1) = 500
MidDistance(2) = 500
dVelocity = 200
dAccel = 400
lCoordinate = 0 
For i = 0 To 3
    axes(i) = i
Next i
AxmContiSetAxisMaplCoordinate, 3, axes(0)
AxmCirclePointMove lCoordinate, axes(0), MidDistance(0), Distance(0), dVelocity, dAccel, dAccel, 0, lArraySize

Delphi
var
    velocity, accel : Double;
    i : LongInt;
    lCoordinate : LongInt;
    lAxis : array [0..2] of Longint;
    dMidPos : array [0..2] of Double;
    dEndPos : array [0..2] of Double;
    lPosSize : LongInt;
    lArraySize: LongInt;

begin
    dMidPos[0] := 500;
    dMidPos[1] := 500;
    dMidPos[2] := 500;
    dEndPos[0] := 1000;
    dEndPos[1] := 1000;
    dEndPos[2] := 0;
    velocity := 200;
    accel := 400;
    lCoordinate := 0;
    lPosSize := 3;
    lArraySize := 3;
    for i := 0 to 2 do
    begin
        lAxis[i] := i;
    end;
    AxmContiSetAxisMap(lCoordinate, lPosSize, @lAxis);
    AxmCirclePointMove(lCoordinate, @lAxis, @dMidPos, @dEndPos, velocity, accel, accel, 0, lArraySize);
end;

예제코드 : 연속보간구동함수

2 축 원호 보간 구동 시작 함수이다.

현재 위치는 원호 구동의 시작위치가 되며 중간위치, 종료위치를 기준으로 원호 구동을 한다

C++
long lAxis[3];
double dPos[3];
long lPosSize = 3;
long lCoordinate = 0;
long lArraySize = 3;
double dMidPos[3];
double dEndPos[3];
double dVelocity = 200;
double dAccel = 400;
for(int i=0; i<lPosSize; i++)
{
    lAxis[i] = i;
}
AxmContiQWriteClear(lCoordinate);
AxmContiSetAxisMap(lCoordinate, lPosSize, lAxis);
AxmContiQBegin(lCoordinate, 0); 
dPos[0] = 100 , dPos[1] = 100, dPos[2] = 100;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel);
dPos[0] = 200 , dPos[1] = 200, dPos[2] = 200;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel);
dMidPos [0] = 300 , dMidPos [1] = 300, dMidPos [2] = 300; 
dEndPos[0] = 400, dEndPos[1] = 300, dEndPos[2] = 300;
AxmCirclePointMove(lCoordinate, lAxis, dMidPos, dEndPos, dVelocity, dAccel, dAccel, 0, lArraySize);
dPos[0] = 400 , dPos[1] = 400, dPos[2] = 400;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel);
dMidPos[0] = 500 , dMidPos[1] = 500, dMidPos[2] = 500; 
dEndPos[0] = 600, dEndPos[1] = 500, dEndPos[2] = 500;
AxmCirclePointMove(lCoordinate, lAxis, dMidPos, dEndPos, dVelocity, dAccel, dAccel, 0, lArraySize);
dPos[0] = 600 , dPos[1] = 600, dPos[2] = 600;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel);
dPos[0] = 700 , dPos[1] = 700, dPos[2] = 700;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel);
AxmContiQEnd(lCoordinate, 0);
Visual Basic
Dim dVelocity As Double
Dim dAccel As Double
Dim lPosSize As Long
Dim lCoordinate As Long
Dim lArraySize As Long
Dim dPos(0 To 2) As Double
Dim dMidPos(0 To 2) As Double
Dim dEndPos(0 To 2) As Double
Dim axes(0 To 2) As Long
Dim i As Long
lPosSize = 3
lArraySize = 3
lCoordinate = 0 
For i = 0 To 2
    axes(i) = i
Next i
dVelocity = 200
dAccel = 400
AxmContiQWriteClearlCoordinate
AxmContiSetAxisMaplCoordinate, lPosSize, axes(0)
AxmContiQBegin lCoordinate, 0
dPos(0) = 100: dPos(1) = 100: dPos(2) = 100
AxmLineMovelCoordinate, dPos(0), dVelocity, dAccel, dAccel
dPos(0) = 200: dPos(1) = 200: dPos(2) = 200
AxmLineMovelCoordinate, dPos(0), dVelocity, dAccel, dAccel
dPos(0) = 300: dPos(1) = 300: dPos(2) = 300
AxmLineMovelCoordinate, dPos(0), dVelocity, dAccel, dAccel
dMidPos(0) = 300 : dMidPos(1) = 300 : dMidPos(2) = 300
dEndPos(0) = 400 : dEndPos(1) = 300 : dEndPos(2) = 300
AxmCirclePointMovelCoordinate, axes(0), dMidPos(0), dEndPos(0), dVelocity, dAccel, dAccel, 0, lArraySize
dPos(0) = 400: dPos(1) = 400 : dPos(2) = 400
AxmLineMovelCoordinate, dPos(0), dVelocity, dAccel, dAccel
dMidPos(0) = 500 : dMidPos(1) = 500 : dMidPos(2) = 500
dEndPos(0) = 600 : dEndPos(1) = 500 :dEndPos(2) = 500
AxmCirclePointMovelCoordinate, axes(0), dMidPos(0), dEndPos(0), dVelocity, dAccel, dAccel, 0, lArraySize
dPos(0) = 500: dPos(1) = 500: dPos(2) = 500
AxmLineMovelCoordinate, dPos(0), dVelocity, dAccel, dAccel
dPos(0) = 600: dPos(1) = 600: dPos(2) = 600
AxmLineMovelCoordinate, dPos(0), dVelocity, dAccel, dAccel
dPos(0) = 700: dPos(1) = 700: dPos(2) = 700
AxmLineMovelCoordinate, dPos(0), dVelocity, dAccel, dAccel
AxmContiQEnd lCoordinate, 0

Delphi
var
    i : LongInt;
    dVelocity, dAccel : Double;
    lAxis : array [0..2] of LongInt;
    dPos : array [0..2] of Double;
    dMidPos : array [0..2] of Double;
    dEndPos : array [0..1] of Double;
    lCoordinate : LongInt;
    lPosSize : LongInt;
    lArraySize: LongInt;


begin
    dVelocity := 200;
    dAccel := 400;
    lPosSize := 3;
    lCoordinate := 0;
    lArraySize : = 3;
    for i := 0 to 1 do
        begin
            lAxis[i] := i;
        end;
    AxmContiQWriteClear(lCoordinate);
    AxmContiSetAxisMap(lCoordinate, 2, @lAxis);
    AxmContiQBegin(lCoordinate, 0);
    dPos[0] := 100 ; dPos[1] := 100; dPos[2] := 100;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dPos[0] := 200 ; dPos[1] := 200; dPos[2] := 200;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dPos[0] := 300 ; dPos[1] := 300; dPos[2] := 300;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dMidPos[0] := 300; dMidPos[1] := 300; dMidPos[2] := 300;
    dEndPos[0] := 400; dEndPos[1] := 300; dEndPos[2] := 300;
    AxmCirclePointMove(lCoordinate, @lAxis, @dMidPos, @dEndPos, dVelocity, dAccel, dAccel, 0, lArraySize);
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dPos[0] := 400 ; dPos[1] := 400; dPos[2] := 400;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dPos[0] := 500 ; dPos[1] := 500; dPos[2] := 500;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dMidPos[0] := 500; dMidPos[1] := 500; dMidPos[2] := 500; 
    dEndPos[0] := 600; dEndPos[1] := 500; dEndPos[2] := 500;
    AxmCirclePointMove(lCoordinate, @lAxis, @dMidPos, @dEndPos, dVelocity, dAccel, dAccel, 0, lArraySize);
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dPos[0] := 600 ; dPos[1] := 600; dPos[2] := 600;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dPos[0] := 700 ; dPos[1] := 700; dPos[2] := 700;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    AxmContiQEnd(lCoordinate, 0);
end;

AxmCircleRadiusMove

Purpose

지정된 좌표계에 시작점, 종료점과 반지름을 지정하여 원호 보간하는 함수이다. 구동 시작 후 함수를 벗어난다.

Format

C++
DWORD AxmCircleRadiusMove(long lCoord, long *lAxisNo, double dRadius, 
double *dEndPos, double dVel, double dAccel, double dDecel, DWORD 
uCWDir, DWORD uShortDistance);
Visual Basic
Function AxmCircleRadiusMove(ByVal lCoord As Long, ByRef lAxisNo As 
Long, ByVal dRadius As Double, ByRef dEndPosAs Double, ByVal dVel As 
Double, ByVal dAccel As Double, ByVal dDecel As Double, ByVal uCWDir 
As Long, ByVal uShortDistance As Long) As Long
Delphi
function AxmCircleRadiusMove(lCoord : LongInt; lAxisNo : PLongInt; 
dRadius : Double; dEndPos: PDouble; dVel : Double; dAccel : Double; 
dDecel : Double; uCWDir : DWord; uShortDistance : DWord) : DWord; 
stdcall;

Parameters

[in/out] Name [Init Value] Explanation
[in]lCoord 좌표계 변호(0 ~ (최대축수 -1))
[in]AxisNo 보간에 사용되는 채널(축) 번호(0 ~ (최대축수 - 1)) 배열
[in]dRadius 구동할 원호 반지름
[in]dEndPos X 축 종료 위치값, Y 축 종료 위치값 배열
[in]dVel 구동 속도값 (+방향: 0 이상값 , -방향: 0이하값,
구동속도의 단위는 Unit/pulse를 1/1로 한경우에 PPS[Pulses/sec])
[in]dpAccel 가속도 (가속도의 단위는 Unit/pulse를 1/1로 한경우에 PPS[Pulses/sec^2]) 배열
[in]dpDecel 감속도(감속도의 단위는 Unit/pulse를 1/1로 한경우에 PPS[Pulses/sec^2]) 배열
[in]uCWDir 원호 방향: AXT_MOTION_MOVE_DIR_DEF
- [00h]반시계방향
- [01h]시계방향
[in]uShortDistance 중점까지 가는 원의 이동 거리 크기 설정값: AXT_MOTION_RADIUS_DISTANCE_DEF
- [00h]짧은 거리의 원호 이동 <그림에서 a>
- [01h]긴 거리의 원호 이동 <그림에서 b>

Return Values

[0000] AXT_RT_SUCCESS : 함수 실행 성공
[1054] AXT_ERROR_CONTI_EMPTY_MAP_NO : 연속보간 맵핑 번호가 비워 있을 때
[4158] AXT_RT_MOTION_INVALID_POSITION : 위치 값 입력이 잘못 되었을 때
[4160] AXT_RT_ERROR_NOT_SAME_BOARD : 똑같은 보드 내에 있지 않을경우
[4166] AXT_ERROR_CONTI_INVALID_MAP_NO : 연속 보간 맵핑 번호가 비워 있을 때
[4201] AXT_RT_MOTION_HOME_SEARCHING : 보간구동할 축 중원점 구동 중인 축이 있을 때
* See error code Table for more information on status error codes

Description

원호보간은 임의의 두 축에 대해서 적용된다. 맵핑된 두축을 X,Y 축으로 간주하여 설명한다. 여기서 X 축은 맵핑된 두축중에서 축번호가 낮은 축을 의미하며 Y 축은 축번호가 높은 축을 의미한다.

예를 들어 Z,U 축이 맵핑된 두축이라면 Z 축이 X 축에 해당되며 U 축이 Y 축에 해당한다.

AxmContiBeginNode, AxmContiEndNode 와 같이사용시 지정된 좌표계에 시작점, 종료점과 반지름을 지정하여 원호 보간 구동하는 Queue 에 저장하는 함수이다.프로파일 원호 연속 보간 구동을 위해 내부 Queue 에 저장하여 AxmContiStart 함수를 사용해서 시작한다.이함수를 수행하기전에 AxmContiSetAxisMap 함수는 보간작업을 수행할 축들을 맵번호로 축맵핑한다. 연속보간 뿐만아니라 일반보간제어에 관련된 함수들도 파라미터의 전달이 간편하므로 적용된다. 따라서 일반보간제어에 관련된 함수들을 사용하기전에 가장 먼저 이 함수를 사용하여 사용할축들을 맵핑한다.

현재 위치는 원호 구동의 시작점이 되며 설정한 반지름과 종점을 기준으로 원호 구동을 한다.

시작점과 끝점을 연결하는 특정 반지름을 가진 원호를 정의하게 되면, 두개의 중심점이 나타나는데, 이로인해 같은 회전방향이라도 두개의 경로(a, b)가 정의될 수 있다.

MultiMove-AxmCircleRadiusMove

▶주의사항: AxmContiSetAxisMap 함수를 이용하여 축 맵핑을 하며 축은 낮은 순서부터 맵핑을 한다. 원호보간의 경우에 반드시 낮은 축부터 배열에 넣어야 한다.

▶주의사항: +LIMIT, -LIMIT 신호가 입력된 상태에서는 구동되지 않는다.

▶ AxmSStop, AxmEstop 함수에 의해 모션감속정지, 모션급정지할수있다. 인자는 반드시 Coordinate 의 첫번째 축(가장 낮은 실제 축번호)을 넣어서 정지시킨다.

▶ AxmContiIsMotion 함수에 의해 모션 중인지 확인할 수 있다.

▶ AxmSignalSetInpos 함수를 사용하는 경우에는 Inposition 입력신호가 Enable 로 설정되어 있다면 Command 펄스 출력이 완료해도 INP 입력이 ON 되기 전까지는 모션이 완료되지 않은 것으로 간주되어 반환 되지 않는다. (AxmSignalSetInpos 함수 참고).

▶ 주의사항: 보간하는축은 Unit/Pulse 를 동일하게 설정한다. Unit/Pulse 를 똑같이 맞추지 않으면 단위가 틀려 지므로 반드시 똑같이 맞추어 보간제어를 하여야 한다.

▶ 4 축 이상을 구성하였을 때

다축 모션보드는 Axis 0 – 3 의 4 개의 축이 축그룹 1 로 구분되고 Axis4 – 7 4 개의 축이 축그룹 2 로 구분되고 Axis8 – 11 4 개의 축이 축그룹 3 으로 ….. 구분된다. 동일 그룹에 속하는 축들간의 직선보간 구동, 원호보간구동을 사용할 수 있지만, 서로 다른 축그룹에 속한 축들간의 직선보간구동과 원호보간구동은 사용할 수 없다. Coordinate 를 지정할 때 주의하여야 한다.

예제코드 : 일반 보간

C++
long lAxis[2];
double dEndPos[2];
DWORD uShortDistance=0;
long lPosSize = 2;
longlCoordinate = 0;
double dRadius = 500;
double dVelocity = 200;
double dAccel = 400;
lAxis[0] = 0;
lAxis[1] = 1;
dEndPos[0] = 1000;
dEndPos[1] = 0;
AxmContiWriteClear(lCoordinate);
AxmContiSetAxisMap(lCoordinate, lPosSize, lAxis);
AxmContiSetAbsRelMode(lCoordinate, 1);
AxmCircleRadiusMove(lCoordinate, lAxis, dRadius, dEndPos, dVelocity, dAccel, dAccel, 1, uShortDistance);
Visual Basic
Dim dVelocity As Double
Dim dAccel As Double
Dim dRadiusAs Double
Dim Distance(0 To 2) As Double
Dim axes(0 To 2) As Long
Dim i As Long
Dim lCoordinate As Long
Dim uShortDistance As Long
uShortDistance = 0
Distance(0) = 1000
Distance(1) = 0
dRadius = 500
dVelocity = 200
dAccel = 400
lCoordinate = 0 
For i = 0 To 2
    axes(i) = i
Next i
AxmContiWriteClear lCoordinate
AxmContiSetAxisMap lCoordinate, 2, axes(0)
AxmContiSetAbsRelMode lCoordinate, 1
AxmCircleRadiusMovelCoordinate, axes(0), dRadius, Distance (0), dVelocity, dAccel, dAccel, 1, uShortDistance

Delphi
var
    xend, yend : Double;
    velocity, accel : Double;
    dRadius : Double;
    i : LongInt;
    lCoordinate : LongInt;
    lAxis : array [0..1] of Longint;
    dPos : array [0..1] of Double;
    dEndPos : array [0..1] of Double;
    lPosSize : LongInt;
    uShortDistance : DWord;

begin
    dEndPos[0] := 1000;
    dEndPos[1] := 0;
    dRadius := 500;
    velocity := 200;
    accel := 400;
    lCoordinate := 0;
    lPosSize := 2;
    uShortDistance := 0;
    for i := 0 to 1 do
        begin
        lAxis[i] := i;
        end;
    AxmContiWriteClear(lCoordinate);
    AxmContiSetAxisMap(lCoordinate, lPosSize, @lAxis);
    AxmContiSetAbsRelMode(lCoordinate, 1);
    AxmCircleRadiusMove(lCoordinate, @lAxis, dRadius, @dEndPos, velocity, accel, accel, 1, uShortDistance);
end;

예제코드 : 연속보간구동함수

2 축 원호 보간 구동 시작 함수이다.

현재 위치는 원호 구동의 시작점이 되며 설정한 반지름과 종점을 기준으로 원호 구동을 한다

C++
long lAxis[2];
double dPos[2];
long lPosSize = 2;
long lCoordinate = 0;
DWORD uShortDistance=0;
double dEndPos[2];
double dRadius = 150;
double dVelocity = 200;
double dAccel = 400;
for(int i=0; i<lPosSize; i++)
{
    lAxis[i] = i;
}
AxmContiWriteClear(lCoordinate);
AxmContiSetAxisMap(lCoordinate, lPosSize, lAxis);
AxmContiSetAbsRelMode(lCoordinate, 1);
AxmContiBeginNode(lCoordinate); 
dPos[0] = 100 , dPos[1] = 100;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel);
dPos[0] = 200 , dPos[1] = 200;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel);
dEndPos[0] = 300; dEndPos[1] = 0;
AxmCircleRadiusMove(lCoordinate, lAxis, dRadius, dEndPos, dVelocity, dAccel, dAccel, DIR_CCW, uShortDistance);
dPos[0] = 400 , dPos[1] = 400;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel);
dRadius = 250; dEndPos[0] = 500; dEndPos[1] = 0;
AxmCircleRadiusMove(lCoordinate, lAxis, dRadius, dEndPos, dVelocity, dAccel, dAccel, DIR_CCW, uShortDistance);
dPos[0] = 600 , dPos[1] = 600;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel);
dPos[0] = 700 , dPos[1] = 700;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel);
AxmContiEndNode(lCoordinate);
AxmContiSetAbsRelMode(lCoordinate, 1);
AxmContiStart(lCoordinate, 0, 0);
Visual Basic
Dim dVelocity As Double
Dim dAccel As Double
Dim lPosSize As Long
Dim dPos(0 To 1) As Double
Dim lCoordinate As Long
Dim axes(0 To 1) As Long
Dim uShortDistance As Long
Dim dRadiusAs Double
Dim i As Long
lPosSize = 2
lCoordinate = 0
uShortDistance = 0
For i = 0 To 1
    axes(i) = i
Next i 
dVelocity = 200
dAccel = 400
dRadius = 150
AxmContiWriteClearlCoordinate
AxmContiSetAxisMaplCoordinate, lPosSize, axes(0)
AxmContiSetAbsRelMode lCoordinate, 1
AxmContiBeginNode lCoordinate
dPos(0) = 100: dPos(1) = 100
AxmLineMovelCoordinate, dPos(0), dVelocity, dAccel, dAccel
dPos(0) = 200: dPos(1) = 200
AxmLineMovelCoordinate, dPos(0), dVelocity, dAccel, dAccel
dPos(0) = 300: dPos(1) = 300
AxmLineMovelCoordinate, dPos(0), dVelocity, dAccel, dAccel
dPos(0) = 300: dPos(1) = 0
AxmCircleRadiusMovelCoordinate, axes(0), dRadius, dPos(0), dVelocity, dAccel, dAccel, DIR_CCW, uShortDistance
dPos(0) = 400: dPos(1) = 400
AxmLineMovelCoordinate, dPos(0), dVelocity, dAccel, dAccel
dPos(0) = 300: dPos(1) = 0
AxmCircleRadiusMovelCoordinate, axes(0), dRadius, dPos(0), dVelocity, dAccel, dAccel, DIR_CCW, uShortDistance
dPos(0) = 500: dPos(1) = 500
AxmLineMovelCoordinate, dPos(0), dVelocity, dAccel, dAccel
dPos(0) = 600: dPos(1) = 600
AxmLineMovelCoordinate, dPos(0), dVelocity, dAccel, dAccel
dPos(0) = 700: dPos(1) = 700
AxmLineMovelCoordinate, dPos(0), dVelocity, dAccel, dAccel
AxmContiEndNode lCoordinate
AxmContiSetAbsRelMode lCoordinate, 1
AxmContiStartlCoordinate, 0, 0

Delphi
var
    i : LongInt;
    dVelocity, dAccel : Double;
    lAxis : array [0..1] of LongInt;
    dPos : array [0..1] of Double;
    uShortDistance : DWord;
    lCoordinate : LongInt;
    lPosSize : LongInt;
    dRadius : Double;

begin
    dVelocity := 200;
    dAccel := 400;
    lPosSize := 2;
    lCoordinate := 0;
    uShortDistance := 0;
    dRadius := 150;
    AxmContiSetAbsRelMode(lCoordinate, 1);
    for i := 0 to 1 do
        begin
            lAxis[i] := i;
        end;
    AxmContiWriteClear(lCoordinate);
    AxmContiSetAxisMap(lCoordinate, 2, @lAxis);
    AxmContiBeginNode(lCoordinate);
    dPos[0] := 100 ; dPos[1] := 100;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dPos[0] := 200 ; dPos[1] := 200;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dPos[0] := 300 ; dPos[1] := 0;
    AxmCircleRadiusMove(lCoordinate, @lAxis, dRadius, @dPos, dVelocity, dAccel, dAccel, DIR_CCW, uShortDistance);
    dPos[0] := 400 ; dPos[1] := 400;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dPos[0] := 300 ; dPos[1] := 0;
    AxmCircleRadiusMove(lCoordinate, @lAxis, dRadius, @dPos, dVelocity, dAccel, dAccel, 
    DIR_CCW, uShortDistance);
    dPos[0] := 600 ; dPos[1] := 600;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dPos[0] := 700 ; dPos[1] := 700;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    AxmContiEndNode(lCoordinate);
    AxmContiSetAbsRelMode(lCoordinate, 1);
    AxmContiStart(lCoordinate, 0, 0);
end;

AxmCircleAngleMove

Purpose

지정된 좌표계에 시작점, 회전각도와 반지름을 지정하여 원호 보간 하는 함수이다. 구동 시작 후 함수를 벗어난다.

Format

C++
DWORD AxmCircleAngleMove(long lCoord, long *lAxisNo, double 
*dCenterPos, double dAngle, double dVel, double dAccel, double dDecel, 
DWORD uCWDir);
Visual Basic
Function AxmCircleAngleMove(ByVal lCoord As Long, ByRef lAxisNo As 
Long, ByRef dCenterPosAsDouble, ByVal dAngle As Double, ByVal dVel As 
Double, ByVal dAccel As Double, ByVal dDecel As Double, ByVal uCWDir 
As Long) As Long
Delphi
function AxmCircleAngleMove(lCoord : LongInt; lAxisNo : PLongInt; 
dCenterPos: PDouble; dAngle : Double; dVel : Double; dAccel : Double; 
dDecel : Double; uCWDir : DWord) : DWord; stdcall;

Parameters

[in/out] Name [Init Value] Explanation
[in]lCoord 좌표계 변호(0 ~ (최대축수 -1))
[in]AxisNo 보간에 사용되는 채널(축) 번호(0 ~ (최대축수 - 1)) 배열
[in]dCenterPos X 축 중점 위치값, Y 축 중점 위치값 배열
[in]dAngle 구동할 원호 각도값. 단위는 ‘Degree(도)
[in]dVel 구동 속도값 (+방향: 0 이상값 , -방향: 0이하값,
구동속도의 단위는 Unit/pulse를 1/1로 한경우에 PPS[Pulses/sec])
[in]dpAccel 가속도 (가속도의 단위는 Unit/pulse를 1/1로 한경우에 PPS[Pulses/sec^2]) 배열
[in]dpDecel 감속도(감속도의 단위는 Unit/pulse를 1/1로 한경우에 PPS[Pulses/sec^2]) 배열
[in]uCWDir 원호 방향: AXT_MOTION_MOVE_DIR_DEF
- [00h]반시계방향
- [01h]시계방향

Return Values

[0000] AXT_RT_SUCCESS : 함수 실행 성공
[1054] AXT_ERROR_CONTI_EMPTY_MAP_NO : 연속보간 맵핑 번호가 비워 있을 때
[4158] AXT_RT_MOTION_INVALID_POSITION : 위치 값 입력이 잘못 되었을 때
[4160] AXT_RT_ERROR_NOT_SAME_BOARD : 똑같은 보드 내에 있지 않을경우
[4166] AXT_ERROR_CONTI_INVALID_MAP_NO : 연속 보간 맵핑 번호가 비워 있을 때
[4201] AXT_RT_MOTION_HOME_SEARCHING : 보간구동할 축 중원점 구동 중인 축이 있을 때
* See error code Table for more information on status error codes

Description

원호보간은 임의의 두 축에 대해서 적용된다. 맵핑된 두축을 X,Y 축으로 간주하여 설명한다. 여기서 X 축은 맵핑된 두축중에서 축번호가 낮은 축을 의미하며 Y 축은 축번호가 높은 축을 의미한다

예를 들어 Z,U 축이 맵핑된 두축이라면 Z 축이 X 축에 해당되며 U 축이 Y 축에 해당한다

AxmContiBeginNode, AxmContiEndNode 와 같이사용시 지정된 좌표계에 시작점, 회전각도와 반지름을 지정하여 원호 보간 구동하는 Queue 에 저장함수이다. 프로파일 원호 연속 보간 구동을 위해 내부 Queue 에 저장하여 AxmContiStart 함수를 사용해서 시작한다.이함수를 수행하기전에 AxmContiSetAxisMap 함수는 보간작업을 수행할 축들을 맵번호로 축맵핑한다. 연속보간 뿐만아니라 일반보간제어에 관련된 함수들도 파라미터의 전달이 간편하므로 적용된다. 따라서 일반보간제어에 관련된 함수들을 사용하기전에 가장 먼저 이 함수를 사용하여 사용할축들을 맵핑한다.

현재 위치는 원호 구동의 시작점이 되며 설정한 반지름과 종점을 기준으로 원호 구동을 한다.

MultiMove-AxmCircleAngleMove

▶주의사항: AxmContiSetAxisMap 함수를 이용하여 축 맵핑을 하며 축은 낮은 순서부터 맵핑을 한다. 원호보간의 경우에 반드시 낮은 축부터 배열에 넣어야 한다.

▶주의사항: +LIMIT, -LIMIT 신호가 입력된 상태에서는 구동되지 않는다.

▶ AxmSStop, AxmEstop 함수에 의해 모션감속정지, 모션급정지할수있다. 인자는 반드시 Coordinate 의 첫번째 축(가장 낮은 실제 축번호)을 넣어서 정지시킨다.

▶ AxmContiIsMotion 함수에 의해 모션 중인지 확인할 수 있다.

▶ AxmSignalSetInpos 함수를 사용하는 경우에는 Inposition 입력신호가 Enable 로 설정되어 있다면 Command 펄스 출력이 완료해도 INP 입력이 ON 되기 전까지는 모션이 완료되지 않은 것으로 간주되어 반환 되지 않는다. (AxmSignalSetInpos 함수 참고).

▶ 주의사항: 보간하는축은 Unit/Pulse 를 동일하게 설정한다. Unit/Pulse 를 똑같이 맞추지 않으면 단위가 틀려 지므로 반드시 똑같이 맞추어 보간제어를 하여야 한다.

▶ 4 축 이상을 구성하였을 때

다축 모션보드는 Axis 0 – 3 의 4 개의 축이 축그룹 1 로 구분되고 Axis4 – 7 4 개의 축이 축그룹 2 로 구분되고 Axis8 – 11 4 개의 축이 축그룹 3 으로 ….. 구분된다. 동일 그룹에 속하는 축들간의 직선보간 구동, 원호보간구동을 사용할 수 있지만, 서로 다른 축그룹에 속한 축들간의 직선보간구동과 원호보간구동은 사용할 수 없다. Coordinate 를 지정할 때 주의하여야 한다.

예제코드 : 일반 보간

C++
long lAxis[2];
double dCenPos[2];
double dAngle=90; 
DWORD uCWDir=0;
double dVelocity = 200;
double dAccel = 400;
long lPosSize = 2;
long lCoordinate = 0;
lAxis[0] = 0;
lAxis[1] = 1;
dCenPos[0] = 500;
dCenPos[1] = 500;
AxmContiWriteClear(lCoordinate);
AxmContiSetAxisMap(lCoordinate, lPosSize, lAxis);
AxmContiSetAbsRelMode(lCoordinate, 1);
AxmCircleAngleMove(lCoordinate, lAxis, dCenPos, dAngle, dVelocity, dAccel, dAccel, 1);
Visual Basic
Dim dVelocity As Double
Dim dAccel As Double
Dim dAngle As Double
Dim CenDistance(0 To 2) As Double
Dim axes(0 To 2) As Long
Dim i As Long
Dim lCoordinate As Long
CenDistance(0) = 500
CenDistance(0) = 500
dAngle = 90
dVelocity = 200
dAccel = 400
lCoordinate = 0 
For i = 0 To 2
    axes(i) = i
Next i
AxmContiWriteClear lCoordinate
AxmContiSetAxisMap lCoordinate, 2, axes(0)
AxmContiSetAbsRelMode lCoordinate, 1
AxmCircleAngleMovelCoordinate, axes(0), CenDistance(0), dAngle, dVelocity, dAccel, dAccel, 1

Delphi
var
    i : LongInt;
    lCoordinate : LongInt;
    lAxis : array [0..1] of Longint;
    dAngle : Double;
    dCenPos : array [0..1] of Double;
    lPosSize : LongInt;
    dVelocity, dAccel : Double;

begin
    dAngle := 90;
    dVelocity := 200;
    dAccel := 400;
    lCoordinate := 0;
    lPosSize := 2;
    for i := 0 to 1 do
        begin
            lAxis[i] := i;
        end;
    dCenPos[0] := 500;
    dCenPos[1] := 500;
    AxmContiWriteClear(lCoordinate);
    AxmContiSetAxisMap(lCoordinate, lPosSize, @lAxis);
    AxmContiSetAbsRelMode(lCoordinate, 1);
    AxmCircleAngleMove(lCoordinate, @lAxis, @dCenPos, dAngle, dVelocity, dAccel, dAccel, 1);
end;

예제코드 : 연속보간구동함수

2 축 원호 보간 구동 시작 함수이다.

현재 위치는 원호 구동의 시작점이 되며 종점을 기준으로 설정한 각도만큼 원호 구동을 한다

C++
long lAxis[2];
long lPosSize = 2;
long lCoordinate = 0;
double dCenPos[2];
double dAngle = 180;
double dPos[2];
double dVelocity = 200;
double dAccel = 400;
for(int i=0; i<lPosSize; i++)
{
    lAxis[i] = i;
}
AxmContiWriteClear(lCoordinate);
AxmContiSetAxisMap(lCoordinate, lPosSize, lAxis);
AxmContiSetAbsRelMode(lCoordinate, 1);
AxmContiBeginNode(lCoordinate); 
dPos[0] = 100 , dPos[1] = 100;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel);
dPos[0] = 200 , dPos[1] = 200;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel);
dCenPos[0] = 300 , dCenPos[1] = 300; 
AxmCircleAngleMove(lCoordinate, lAxis, dCenPos, dAngle, dVelocity, dAccel, dAccel, DIR_CCW); 
dPos[0] = 400 , dPos[1] = 400;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel);
dCenPos[0] = 500 , dCenPos[1] = 500;
AxmCircleAngleMove(lCoordinate, lAxis, dCenPos, dAngle, dVelocity, dAccel, dAccel, DIR_CCW);
dPos[0] = 600 , dPos[1] = 600;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel);
dPos[0] = 700 , dPos[1] = 700;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel);
AxmContiEndNode(lCoordinate);
AxmContiSetAbsRelMode(lCoordinate, 1);
AxmContiStart(lCoordinate, 0, 0);
Visual Basic
Dim dVelocity As Double
Dim dAccel As Double
Dim lPosSize As Long
Dim lCoordinate As Long 
Dim dPos(0 To 1) As Double
Dim dCenPos(0 To 1) As Double
Dim dAngle As Double
Dim axes(0 To 1) As Long
Dim i As Long
lPosSize = 2
lCoordinate = 0
dAngle = 180
For i = 0 To 1
    axes(i) = i
Next i
dVelocity = 200
dAccel = 400
AxmContiWriteClearlCoordinate
AxmContiSetAxisMaplCoordinate, lPosSize, axes(0)
AxmContiSetAbsRelModelCoordinate, 1
AxmContiBeginNodelCoordinate
dPos(0) = 100: dPos(1) = 100
AxmLineMovelCoordinate, dPos(0), dVelocity, dAccel, dAccel
dPos(0) = 200: dPos(1) = 200
AxmLineMovelCoordinate, dPos(0), dVelocity, dAccel, dAccel
dPos(0) = 300: dPos(1) = 300
AxmLineMovelCoordinate, dPos(0), dVelocity, dAccel, dAccel
dCenPos(0) = 300 : dCenPos(1) = 300
AxmCircleAngleMovelCoordinate, axes(0), dCenPos(0), dAngle, dVelocity, dAccel, dAccel, DIR_CCW
dPos(0) = 400: dPos(1) = 400
AxmLineMovelCoordinate, dPos(0), dVelocity, dAccel, dAccel
dCenPos(0) = 500 : dCenPos(1) = 500
AxmCircleAngleMovelCoordinate, axes(0), dCenPos(0), dAngle, dVelocity, dAccel, dAccel, DIR_CCW
dPos(0) = 500: dPos(1) = 500
AxmLineMovelCoordinate, dPos(0), dVelocity, dAccel, dAccel
dPos(0) = 600: dPos(1) = 600
AxmLineMovelCoordinate, dPos(0), dVelocity, dAccel, dAccel
dPos(0) = 700: dPos(1) = 700
AxmLineMovelCoordinate, dPos(0), dVelocity, dAccel, dAccel
AxmContiEndNodelCoordinate
AxmContiSetAbsRelModelCoordinate, 1
AxmContiStartlCoordinate, 0, 0

Delphi
var
    i : LongInt;
    dVelocity, dAccel : Double;
    lAxis : array [0..1] of LongInt;
    dPos : array [0..1] of Double;
    dCenPos : array [0..1] of Double;
    dAngle : Double;
    lCoordinate : LongInt;
    lPosSize : LongInt;

begin
    dVelocity := 200;
    dAccel := 400;
    lPosSize := 2;
    lCoordinate := 0;
    dAngle := 180;
    for i := 0 to 1 do
        begin
            lAxis[i] := i;
        end;
    AxmContiWriteClear(lCoordinate);
    AxmContiSetAxisMap(lCoordinate, 2, @lAxis);
    AxmContiSetAbsRelMode(lCoordinate, 1);
    AxmContiBeginNode(lCoordinate);
    dPos[0] := 100 ; dPos[1] := 100;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dPos[0] := 200 ; dPos[1] := 200;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dCenPos [0] := 300; dCenPos[1] := 300; 
    AxmCircleAngleMove(lCoordinate, @lAxis, @dCenPos, dAngle, dVelocity, dAccel, dAccel, DIR_CCW);
    dPos[0] := 400 ; dPos[1] := 400;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dCenPos[0] := 500; dCenPos[1] := 500; 
    AxmCircleAngleMove(lCoordinate, @lAxis, @dCenPos, dAngle, dVelocity, dAccel, dAccel, DIR_CCW);
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dPos[0] := 600 ; dPos[1] := 600;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dPos[0] := 700 ; dPos[1] := 700;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dPos[0] := 800 ; dPos[1] := 800;
    AxmContiEndNode(lCoordinate);
    AxmContiSetAbsRelMode(lCoordinate, 1);
    AxmContiStart(lCoordinate, 0, 0);
end;

AxmContiSetAxisMap

Purpose

보간작업을 수행할 축들을 사용자가 지정한 좌표계로 축맵핑 설정한다

Format

C++
DWORD AxmContiSetAxisMap(long lCoord, long lSize, long *lpRealAxisNo);
Visual Basic
Function AxmContiSetAxisMap(ByVal lCoord As Long, ByVal lSize As Long, 
ByRef lpRealAxisNo As Long) As Long
Delphi
function AxmContiSetAxisMap(lCoord : LongInt; lSize : LongInt; 
lpRealAxisNo : PLongInt) : DWord; stdcall;

Parameters

[in/out] Name [Init Value] Explanation
[in]lCoord 좌표계 변호(0 ~ (최대축수 -1))
[in]lSize 보간작업을 수행할 축의 개수
- [2]2축을 보간으로 사용할 때
- [3]3축을 보간으로 사용할 때
- [4] 4축을 보간으로 사용할 때
[in]lpRealAxisNo 보간에 사용되는 축 배열2 ~ 4개축을 설정한다.
설정해야될 축번호(0,1,2,3) 4축 단위 설정가능, (0,1,2,3) 설정 가능(4,5,6,7) 설정 가능

Return Values

[0000] AXT_RT_SUCCESS : 함수 실행 성공
[1054] AXT_ERROR_CONTI_EMPTY_MAP_NO : 연속보간 맵핑 번호가 비워 있을 때
[4158] AXT_RT_MOTION_INVALID_POSITION : 위치 값 입력이 잘못 되었을 때
[4160] AXT_RT_ERROR_NOT_SAME_BOARD : 똑같은 보드 내에 있지 않을경우
[4166] AXT_ERROR_CONTI_INVALID_MAP_NO : 연속 보간 맵핑 번호가 비워 있을 때
[4201] AXT_RT_MOTION_HOME_SEARCHING : 보간구동할 축 중원점 구동 중인 축이 있을 때
* See error code Table for more information on status error codes

Description

연속보간 뿐만아니라 일반보간제어에 관련된 함수들도 파라미터의 전달이 간편하므로 적용된다. 따라서 일반보간제어에 관련된 함수들을 사용하기전에 가장 먼저 이 함수를 사용하여 사용할 축들을 맵핑한다.

주의점:축맵핑할때는 반드시 작은 숫자부터 큰숫자를 넣는다. 여기서 제일 작은숫자 축이 마스터가 된다.

▶주의사항: AxmContiSetAxisMap 함수를 이용하여 축 맵핑을 하며 축은 낮은 순서부터 맵핑을 한다. 원호보간의 경우에 반드시 낮은 축부터 배열에 넣어야 한다.

▶주의사항: 8 축 이상을 구성하였을 때

다축 모션보드는 한 보드 내에서 Axis 0 – 3 의 4 개의 축이 축그룹 1 로 구분되고 Axis4 – 7 4 개의 축이 축그룹 2 로 구분되고 Axis8 – 11 4 개의 축이 축그룹 3 으로 ….. 구분된다. 동일 그룹에 속하는축 들간의 직선보간 구동, 원호보간구동을 사용할 수 있지만, 서로 다른 축그룹에 속한 축들간의 직선보간구동과 원호보간구동은 사용할 수 없다. Coordinate 를 지정할 때 주의하여야 한다.

예제코드 : 일반 보간

C++
long lAxis[2];
double dPos[2];
long lPosSize = 2;
long lCoordinate = 0;
dPos[0] = 4000;
dPos[1] = 4000;
lAxis[0] = 0;
lAxis[1] = 1;
AxmContiWriteClear(lCoordinate);
AxmContiSetAxisMap(lCoordinate, lPosSize, lAxis);
//상대위치구동.
AxmContiSetAbsRelMode(lCoordinate, 1);
// 직선보간구동.
AxmLineMove(lCoordinate, dPos, 200, 400, 400);
long lAxis1, lAxis2;
AxmContiGetAxisMap(lCoordinate, & lPosSize, lAxis);
// lPosSize를이용해서축수를확인할수있다.
lAxis1 = lAxis[0]; lAxis2= lAxis[1];// 맵핑축번호를가져온다.
Visual Basic
Dim lCoordinate As Long
Dim Distance(0 To 2) As Double
Dim axes(0 To 2) As Long
Dim lAxis1 As Long
Dim lAxis2 As Long
Dim i As Long
lCoordinate = 0 
For i = 0 To 2
    axes(i) = i
Next i
Distance(0) = 4000
Distance(1) = 4000
AxmContiWriteClearlCoordinate
AxmContiSetAxisMaplCoordinate, 2, axes(0)
‘상대위치구동.
AxmContiSetAbsRelModelCoordinate, 1
‘직선보간구동.
AxmLineMovelCoordinate, Distance(0), 200, 400, 400
AxmContiGetAxisMaplCoordinate, 2, axes (0)
 lPos를이용해서축수를확인할수있다.
lAxis1 =axes (0): lAxis2 = axes (1) ‘맵핑축번호를가져온다.

Delphi
var
    i : LongInt;
    lCoordinate : LongInt;
    lAxis : array [0..1] of Longint;
    dPos : array [0..1] of Double;
    lPosSize : LongInt;
    lPos : LongInt;
    lAxis1 : LongInt;
    lAxis2 : LongInt;

begin
    lCoordinate := 0;
    lPosSize := 2;
    for i := 0 to 1 do
        begin
        lAxis[i] := i;
        end;
    dPos[0] := 4000;
    dPos[1] := 4000;
    AxmContiWriteClear(lCoordinate);
    AxmContiSetAxisMap(lCoordinate, lPosSize, @lAxis);
    { 상대위치구동. }
    AxmContiSetAbsRelMode(lCoordinate, 1);
    { 직선보간구동. }
    AxmLineMove(lCoordinate, @dPos, 200, 400, 400);
    AxmContiGetAxisMap(lCoordinate, @lPos, lAxis);
    { lPos를이용해서축수를확인할수있다.}
    lAxis1 := lAxis[0]; lAxis2 := lAxis[1]; {맵핑축번호를가져온다.}
end;

AxmMotSetWorkCoordinate

Purpose

작업 좌표계를 설정한다.

Format

C++
DWORD AxmMotSetWorkCoordinate (long lCoordNo, double *dpOrigin, 
double *dpXPos, double *dpYPos);
C#
uint AxmMotSetWorkCoordinate (int nCoordNo, double[] dpOrigin, 
double[] dpXPos, double[] dpYPos);
Visual Basic
Function AxmMotSetWorkCoordinate (ByVal lCoordNo As Integer, ByRef
dpOrigin As Double, ByRef dpXPos As Double, ByRef dpYPos As Double) 
As Integer
Delphi
function AxmMotSetWorkCoordinate (lCoordNo : LongInt; dpOrigin : 
PDouble; dpXPos : PDouble; dpYPos : PDouble) : DWord; stdcall;

Parameters

[in/out] Name [Init Value] Explanation
[in]lCoordNo 좌표계번호(0~7)
[in]dpOrigin World Coordinate를 기준으로하는 Work 좌표계 원점위치
[in]dpXPos World Coordinate를 기준으로하는 Work 좌표계 X축상의 임의의 위치
[in]dpYPos World Coordinate를 기준으로하는 Work 좌표계 Y축상의 임의의 위치

Return Values

[0000] AXT_RT_SUCCESS : 함수 실행 성공
[1053] AXT_RT_NOT_OPEN : AXL 라이브러리초기화실패
* See error code Table for more information on status error codes

Description

작업 좌표계를 설정한다. ‘AxmContiSetAxisMap’을 사용하여 기준이될 좌표계를 설정해 놓은 경우에만 사용할 수 있다. 좌표계 번호는 기준좌표계의 번호를 그대로 사용한다. 설정이 완료되면 이 좌표계 번호를 사용하여서 작업 좌표계 기준의 구동을 할 수 있다.

MultiMove-AxmMotSetWorkCoordinate

예제코드 : 일반 보간

C++
// 1,2번 축을 0번 좌표계로 설정하고 다시 작업좌표계를 설정한다.
long lAxis[2];
double dpOrigin[2], dpXPos[2], dpYPos[2];
long lCoordNo = 0;
long lPosSize = 2;
lAxis[0] = 1;
lAxis[1] = 2;
//0번 좌표계의 원점을 기준으로 회전한 작업 좌표계를 설정한다.
dpOrigin[0] = 0;
dpOrigin[1] = 0;
dpXPos[0] = 20;
dpXPos[1] = 10;
dpYPos[0] = -10;
dpYPos[1] = 20;
AxmContiSetAxisMap(lCoordNo, lPosSize, lAxis);
AxmMotSetWorkCoordinate(lCoordNo, dpOrigin, dpXPos, dpYPos)
Visual Basic
1,2 축을 0 좌표계로 설정하고 다시 작업좌표계를 설정한다.
Dim lAxis(0 To 1) As Integer
Dim dpOrigin(0 To 1) As Double
Dim dpXPos(0 To 1) As Double
Dim dpYPos(0 To 1) As Double
Dim lCoordNo As Integer
Dim lPosSize As Integer
lAxis(0) = 1
lAxis(1) = 2
`1,2 축을 0 좌표계로 설정하고 다시 작업좌표계를 설정한다.
dpOrigin(0) = 0
dpOrigin(1) = 0
dpXPos(0) = 20
dpXPos(1) = 10
dpYPos(0) = -10
dpYPos(1) = 20
lCoordNo = 0
lPosSize = 2

AxmContiSetAxisMap lCoordNo, lPosSize, lAxis(0)
AxmMotSetWorkCoordinate lCoordNo, dpOrigin(0), dpXPos(0), dpYPos(0)

Delphi
{ 1,2번 축을 0번 좌표계로 설정하고 다시 작업좌표계를 설정한다. }
var
    lAxis : array [0..1] of LongInt;
    dpOrigin : array [0..1] of Double;
    dpXPos : array [0..1] of Double;
    dpYPos : array [0..1] of Double;
    lCoordNo : LongInt;
    lPosSize : LongInt;

begin
    lAxis[0] := 1;
    lAxis[1] := 2;
    {1,2번 축을 0번 좌표계로 설정하고 다시 작업좌표계를 설정한다.}
    dpOrigin[0] := 0;
    dpOrigin[1] := 0;
    dpXPos[0] := 20;
    dpXPos[1] := 10;
    dpYPos[0] := -10;
    dpYPos[1] := 20;
    lCoordNo := 0;
    lPosSize := 2;

    AxmContiSetAxisMap (lCoordNo, lPosSize, @lAxis);
    AxmMotSetWorkCoordinate (lCoordNo, @dpOrigin, @dpXPos, @dpYPos);
end;

AxmMotGetWorkCoordinate

Purpose

설정된 작업 좌표계를 확인한다.

Format

C++
DWORD AxmMotGetWorkCoordinate (long lCoordNo, double *dpOrigin, 
double *dpXPos, double *dpYPos);
C#
uint AxmMotGetWorkCoordinate (int nCoordNo, ref double dpOrigin, ref 
double dpXPos, ref double dpYPos);
Visual Basic
Function AxmMotGetWorkCoordinate (ByVal lCoordNo As Integer, ByRef
dpOrigin As Double, ByRef dpXPos As Double, ByRef dpYPos As Double) 
As Integer
Delphi
function AxmMotGetWorkCoordinate (lCoordNo: LongInt; dpOrigin: 
PDouble; dpXPos: PDouble; dpYPos: PDouble) DWord; stdcall;

Parameters

[in/out] Name [Init Value] Explanation
[in]lCoordNo 좌표계번호(0~7)
[out]dpOrigin World Coordinate를 기준으로하는 Work 좌표계 원점위치
[out]dpXPos World Coordinate를 기준으로하는 Work 좌표계 X축상의 임의의 위치
[out]dpYPos World Coordinate를 기준으로하는 Work 좌표계 Y축상의 임의의 위치

Return Values

[0000] AXT_RT_SUCCESS : 함수 실행 성공
[4101] AXT_RT_MOTION_INVALID_AXIS_NO : 해당축이 존재 하지 않음
* See error code Table for more information on status error codes

Description

AxmMotSetWorkCoordinate’로 설정된 작업 좌표계를 확인한다.

예제코드 : 일반 보간

C++
// 0번 좌표계를 확인한다.
double dpOrigin[3], dpXPos[3], dpYPos[3];
long lCoordNo = 0;
AxmMotGetWorkCoordinate(lCoordNo, dpOrigin, dpXPos, dpYPos)
Visual Basic
0 좌표계를 확인한다.
Dim dpOrigin(0 To 2) As Double
Dim dpXPos(0 To 2) As Double
Dim dpYPos(0 To 2) As Double
Dim lCoordNo As Integer
lCoordNo = 0
AxmMotGetWorkCoordinate lCoordNo, dpOrigin(0), dpXPos(0), dpYPos(0)

Delphi
{0번 좌표계를 확인한다.}
var
    dpOrigin: array [0..2] of Double;
    dpXPos: array [0..2] of Double;
    dpYPos: array [0..2] of Double;
    lCoordNo: LongInt;

begin
    lCoordNO := 0;
    AxmMotGetWorkCoordinate(lCoordNo, @dpOrigin, @dpXPos, @dpYPos);
end;

AxmContiGetAxisMap

Purpose

사용자가 지정한 좌표계로 축맵핑 반환한다.

Format

C++
DWORD AxmContiGetAxisMap(long lCoord, long *lpSize, long 
*lpRealAxesNo);
Visual Basic
Function AxmContiGetAxisMap(ByVal lCoord As Long, ByRef lpSizeAs Long, 
ByRef lpRealAxisNo As Long) As Long
Delphi
function AxmContiGetAxisMap(lCoord : LongInt; lpSize: PLongInt; 
lpRealAxisNo : PLongInt) : DWord; stdcall;

Parameters

[in/out] Name [Init Value] Explanation
[in]lCoordNo 채널(축) 번호(0 ~ (최대축수 - 1))
[in]lpSize 보간에사용되는축 수, (2 - 4): AXT_MOTION_INTERPOLATION_AXIS_DEF
-[2]2축을 보간으로 사용할 때
- [3]3축을 보간으로 사용할 때
- [4] 4축을 보간으로 사용할 때
[out]lpRealAxisNo 보간에 사용되는 축 배열의 주소값2 - 4개축을 설정한다.
한 보드내 4축단위로 설정가능

Return Values

[0000] AXT_RT_SUCCESS : 함수 실행 성공
[1054] AXT_RT_NOT_SUPPORT_VERSION : 지원하지 않는 하드웨어일 경우
[4166] AXT_ERROR_CONTI_INVALID_MAP_NO : 연속보간 맵핑 번호가 비워져있을 때
* See error code Table for more information on status error codes

Description

AxmContiSetAxisMap’로 설정한 보간작업의 축 맵핑을 사용자가 지정한 좌표계의 축맵핑으로 반환한다

예제코드 : 일반 보간

C++
long lAxis[2];
double dPos[2];
long lPosSize = 2;
long lCoordinate = 0;
dPos[0] = 4000;
dPos[1] = 4000;
lAxis[0] = 0;
lAxis[1] = 1;
AxmContiWriteClear(lCoordinate);
AxmContiSetAxisMap(lCoordinate, lPosSize, lAxis);
//상대위치구동.
AxmContiSetAbsRelMode(lCoordinate, 1);
// 직선보간구동.
AxmLineMove(lCoordinate, dPos, 200, 400, 400);
long lAxis1, lAxis2;
AxmContiGetAxisMap(lCoordinate, & lPosSize, lAxis);
// lPosSize를이용해서축수를확인할수있다.
lAxis1 = lAxis[0]; lAxis2= lAxis[1];// 맵핑축번호를가져온다.
Visual Basic
Dim lCoordinate As Long
Dim Distance(0 To 2) As Double
Dim axes(0 To 2) As Long
Dim lAxis1 As Long
Dim lAxis2 As Long
Dim i As Long
lCoordinate = 0 
For i = 0 To 2
    axes(i) = i
Next i
Distance(0) = 4000
Distance(1) = 4000
AxmContiWriteClearlCoordinate
AxmContiSetAxisMaplCoordinate, 2, axes(0)
‘상대위치구동.
AxmContiSetAbsRelModelCoordinate, 1
‘직선보간구동.
AxmLineMovelCoordinate, Distance(0), 200, 400, 400
AxmContiGetAxisMaplCoordinate, 2, axes (0)
 lPos를이용해서축수를확인할수있다.
lAxis1 =axes (0): lAxis2 = axes (1) ‘맵핑축번호를가져온다.

Delphi
var
    i : LongInt;
    lCoordinate : LongInt;
    lAxis : array [0..1] of Longint;
    dPos : array [0..1] of Double;
    lPosSize : LongInt;
    lAxis1 : LongInt;
    lAxis2 : LongInt;

begin
    lCoordinate := 0;
    lPosSize := 2;
    for i := 0 to 1 do
        begin
        lAxis[i] := i;
        end;
    dPos[0] := 4000;
    dPos[1] := 4000;
    AxmContiWriteClear(lCoordinate);
    AxmContiSetAxisMap(lCoordinate, lPosSize, @lAxis);
    { 상대위치구동. }
    AxmContiSetAbsRelMode(lCoordinate, 1);
    { 직선보간구동. }
    AxmLineMove(lCoordinate, @dPos, 200, 400, 400);
    AxmContiGetAxisMap(lCoordinate, @lPos, lAxis);
    { lPos를이용해서축수를확인할수있다.}
    lAxis1 := lAxis[0]; lAxis2 := lAxis[1]; {맵핑축번호를가져온다.}
end;

AxmContiSetAbsRelMode

Purpose

지정 좌표계의 이동 거리 계산 모드를 설정한다.

Format

C++
DWORD AxmContiSetAbsRelMode(long lCoord, DWORD uAbsRelMode);
Visual Basic
Function AxmContiSetAbsRelMode(ByVal lCoord As Long, ByVal 
uAbsRelMode As Long) As Long
Delphi
function AxmContiSetAbsRelMode(lCoord : LongInt; uAbsRelMode : 
DWord) : DWord; stdcall;

Parameters

[in/out] Name [Init Value] Explanation
[in]lCoordNo 채널(축) 번호(0 ~ (최대축수 - 1))
[in]uAbsRelMode [00h]이동거리 계산 모드: AXT_MOTION_ABSREL_MODE_DEF
- [00h]위치구동 절대모드
- [01h]위치구동 상대모드

Return Values

[0000] AXT_RT_SUCCESS : 함수 실행 성공
[4166] AXT_ERROR_CONTI_INVALID_MAP_NO : 연속보간 맵핑 번호가 비워져있을 때
* See error code Table for more information on status error codes

Description

좌표계 내의 모든 축들을 똑 같은 이동 거리 계산 모드를 설정한다.

예제코드 : 일반 보간

C++
long lAxis[2];
double dPos[2];
long lPosSize = 2;
long lCoordinate = 0;
dPos[0] = 4000;
dPos[1] = 4000;
lAxis[0] = 0;
lAxis[1] = 1;
AxmContiWriteClear(lCoordinate);
AxmContiSetAxisMap(lCoordinate, lPosSize, lAxis);
//상대위치구동.
AxmContiSetAbsRelMode(lCoordinate, 1);
// 직선보간구동.
AxmLineMove(lCoordinate, dPos, 200, 400, 400);
// 0축의이동모드확인.
DWORD Mode;
AxmContiGetAbsRelMode(lCoordinate, &Mode);
Visual Basic
Dim lCoordinate As Long
Dim Distance(0 To 2) As Double
Dim axes(0 To 2) As Long
Dim lAxis1 As Long
Dim lAxis2 As Long
Dim i As Long
lCoordinate = 0 
For i = 0 To 2
    axes(i) = i
Next i 
Distance(0) = 4000
Distance(1) = 4000
AxmContiWriteClearlCoordinate
AxmContiSetAxisMaplCoordinate, 2, axes(0)
‘상대위치구동.
AxmContiSetAbsRelModelCoordinate, 1
‘직선보간구동.
AxmLineMovelCoordinate, Distance(0), 200, 400, 400
 0축의이동모드확인.
Dim Mode As Long
AxmContiGetAbsRelModelCoordinate, Mode

Delphi
var
    i : LongInt;
    lCoordinate : LongInt;
    lAxis : array [0..1] of Longint;
    dPos : array [0..1] of Double;
    lPosSize : LongInt;
    Mode : LongInt;

begin
    lCoordinate := 0;
    lPosSize := 2;
    for i := 0 to 1 do
        begin
        lAxis[i] := i;
        end;
    dPos[0] := 4000;
    dPos[1] := 4000;
    AxmContiWriteClear(lCoordinate);
    AxmContiSetAxisMap(lCoordinate, lPosSize, @lAxis);
    { 상대위치구동. }
    AxmContiSetAbsRelMode(lCoordinate, 1);
    { 직선보간구동. }
    AxmLineMove(lCoordinate, @dPos, 200, 400, 400);
    { 0축의이동모드확인. }
    AxmContiGetAbsRelMode(lCoordinate, @Mode);
end;

AxmContiGetAbsRelMode

Purpose

지정 좌표계의 이동 거리 계산 모드를 반환한다.

Format

C++
DWORD AxmContiGetAbsRelMode(long lCoord, DWORD *upAbsRelMode);
Visual Basic
Function AxmContiGetAbsRelMode(ByVal lCoord As Long, ByRef 
upAbsRelMode As Long) As Long
Delphi
function AxmContiGetAbsRelMode(lCoord : LongInt; upAbsRelMode : 
PDWord) : DWord; stdcall;

Parameters

[in/out] Name [Init Value] Explanation
[in]lCoordNo 채널(축) 번호(0 ~ (최대축수 - 1))
[out]upAbsRelMode [00h]이동거리 계산 모드: AXT_MOTION_ABSREL_MODE_DEF
- [00h]위치구동 절대모드
- [01h]위치구동 상대모드

Return Values

[0000] AXT_RT_SUCCESS : 함수 실행 성공
[4166] AXT_ERROR_CONTI_INVALID_MAP_NO : 연속보간 맵핑 번호가 비워져있을 때
* See error code Table for more information on status error codes

Description

AxmContiSetAbsRelMode‘ 로 설정한 지정 좌표계의 이동 거리 계산 모드를 반환한다.

예제코드 : 일반 보간

C++
long lAxis[2];
double dPos[2];
long lPosSize = 2;
long lCoordinate = 0;
dPos[0] = 4000;
dPos[1] = 4000;
lAxis[0] = 0;
lAxis[1] = 1;
AxmContiWriteClear(lCoordinate);
AxmContiSetAxisMap(lCoordinate, lPosSize, lAxis);
//상대위치구동.
AxmContiSetAbsRelMode(lCoordinate, 1);
// 직선보간구동.
AxmLineMove(lCoordinate, dPos, 200, 400, 400);
// 0축의이동모드확인.
DWORD Mode;
AxmContiGetAbsRelMode (lCoordinate, &Mode);
Visual Basic
Dim lCoordinate As Long
Dim Distance(0 To 2) As Double
Dim axes(0 To 2) As Long
Dim lAxis1 As Long
Dim lAxis2 As Long
Dim i As Long
lCoordinate = 0 
For i = 0 To 2
    axes(i) = i
Next i
Distance(0) = 4000
Distance(1) = 4000
AxmContiWriteClearlCoordinate
AxmContiSetAxisMaplCoordinate, 2, axes(0)
‘상대위치구동.
AxmContiSetAbsRelModelCoordinate, 1
‘직선보간구동.
AxmLineMovelCoordinate, Distance(0), 200, 400, 400
 0축의이동모드확인.
Dim Mode As Long
AxmContiGetAbsRelModelCoordinate, Mode

Delphi
var
    i : LongInt;
    lCoordinate : LongInt;
    lAxis : array [0..1] of Longint;
    dPos : array [0..1] of Double;
    lPosSize : LongInt;
    Mode : LongInt;


begin
    lCoordinate := 0;
    lPosSize := 2;
    for i := 0 to 1 do
        begin
        lAxis[i] := i;
    end;
    dPos[0] := 4000;
    dPos[1] := 4000;
    AxmContiWriteClear(lCoordinate);
    AxmContiSetAxisMap(lCoordinate, lPosSize, @lAxis);
    { 상대위치구동. }
    AxmContiSetAbsRelMode(lCoordinate, 1);
    { 직선보간구동. }
    AxmLineMove(lCoordinate, @dPos, 200, 400, 400);
    { 0축의이동모드확인. }
    AxmContiGetAbsRelMode (lCoordinate, @Mode);
end;

AxmContiBeginNode

Purpose

지정된 좌표계에 연속보간에서 수행할 작업들의 등록을 시작한다.

Format

C++
DWORD AxmContiBeginNode(long lCoord);
Visual Basic
Function AxmContiBeginNode(ByVal lCoord As Long) As Long
Delphi
function AxmContiBeginNode(lCoord: LongInt) : DWord; stdcall;

Parameters

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

Return Values

[0000] AXT_RT_SUCCESS : 함수 실행 성공
[1054] AXT_RT_NOT_SUPPORT_VERSION : 지원하지 않는 하드웨어일 경우
[4160] AXT_RT_ERROR_NOT_SAME_BOARD : 똑같은 보드 내에 있지 아닐 경우
[4166] AXT_ERROR_CONTI_INVALID_MAP_NO : 연속보간 맵핑 번호가 비워져있을 때
* See error code Table for more information on status error codes

Description

이 함수를 호출한 후, AxmContiEndNode 함수가 호출되기 전까지 수행되는 모든 모션작업은 실제 모션을 수행하는 것이 아니라 연속보간 모션으로 등록 되는 것이며, AxmContiStart 함수가 호출될 때 비로소 등록된 모션이 실제로 수행된다.

▶ AxmContiWriteClear 이 함수는 등록된 작업들을 메모리에 지울때사용한다. 연속보간작업이 모두 수행된 후에 반드시 이 함수를 이용해 메모리를 Clear 시킨다

▶ AxmContiIsMotion 이 함수는 연속보간 구동 중인지 체크하는 한다.

▶ AxmContiGetTotalNodeNum 이 함수는 메모리에 등록된 모든 갯수를 반환한다.

▶ AxmContiGetNodeNum 이 함수는 현재 구동중인 연속보간 인덱스번호를 확인한다.

▶ AxmContiReadFree 이 함수는 메모리가 비워있는지 체크한다

▶ AxmContiStart 이 함수는 연속보간구동을 시작한다.

예제코드 : 일반 보간

C++
long lAxis[2];
double dPos[2];
long lPosSize = 2;
long lCoordinate = 0;
double dVelocity = 200, dAccel = 400;
lAxis[0] = 0; lAxis[1] = 1;
AxmContiWriteClear(lCoordinate);
AxmContiSetAxisMap(lCoordinate, lPosSize, lAxis);
//절대위치구동등록.
AxmContiSetAbsRelMode(lCoordinate, 0);
AxmContiBeginNode(lCoordinate);
dPos[0] = 100 , dPos[1] = 100;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel); 
dPos[0] = 200 , dPos[1] = 200;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel); 
dPos[0] = 300 , dPos[1] = 300;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel); 
dPos[0] = 400 , dPos[1] = 400;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel); 
dPos[0] = 500 , dPos[1] = 500;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel); 
dPos[0] = 600 , dPos[1] = 600;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel); 
dPos[0] = 700 , dPos[1] = 700;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel); 
dPos[0] = 800 , dPos[1] = 800;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel); 
dPos[0] = 900 , dPos[1] = 900;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel); 
dPos[0] = 1000 , dPos[1] = 1000;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel); 
dPos[0] = 1100 , dPos[1] = 1100;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel);
AxmContiEndNode(lCoordinate);
//절대위치구동시작.
AxmContiSetAbsRelMode(lCoordinate, 0);
// 연속보간구동시작.
AxmContiStart(lCoordinate, 0, 0);
Visual Basic
Dim dVelocity As Double
Dim dAccel As Double
Dim lPosSize As Long
Dim lCoordinate As Long 
Dim dPos(0 To 1) As Double
Dim axes(0 To 1) As Long
Dim i As Long
dVelocity = 200
dAccel = 400
lPosSize = 2
lCoordinate = 0
For i = 0 To 1
    axes(i) = i
Next i 
AxmContiWriteClearlCoordinate
AxmContiSetAxisMaplCoordinate, lPosSize, axes(0)
‘절대위치구동등록시작.
AxmContiSetAbsRelModelCoordinate, 0
AxmContiBeginNodelCoordinate
dPos(0) = 100: dPos(1) = 100
AxmLineMove lCoordinate, dPos(0), dVelocity, dAccel, dAccel
dPos(0) = 200: dPos(1) = 200
AxmLineMove lCoordinate, dPos(0), dVelocity , dAccel, dAccel
dPos(0) = 300: dPos(1) = 300
AxmLineMove lCoordinate, dPos(0), dVelocity , dAccel, dAccel
dPos(0) = 400: dPos(1) = 400
AxmLineMove lCoordinate, dPos(0), dVelocity , dAccel, dAccel
dPos(0) = 500: dPos(1) = 500
AxmLineMove lCoordinate, dPos(0), dVelocity , dAccel, dAccel
dPos(0) = 600: dPos(1) = 600
AxmLineMove lCoordinate, dPos(0), dVelocity , dAccel, dAccel
dPos(0) = 700: dPos(1) = 700
AxmLineMove lCoordinate, dPos(0), dVelocity , dAccel, dAccel
AxmContiEndNodelCoordinate
‘절대위치구동시작.
AxmContiSetAbsRelModelCoordinate, 0
‘연속보간구동시작.
AxmContiStartlCoordinate, 0, 0

Delphi
var
    i : LongInt;
    dVelocity, dAccel : Double;
    lAxis : array [0..1] of LongInt;
    dPos : array [0..1] of Double;
    lCoordinate : LongInt;
    lPosSize : LongInt;

begin
    dVelocity := 200;
    dAccel := 400;
    lPosSize := 2;
    lCoordinate := 0;
    { 절대위치구동등록. }
    AxmContiSetAbsRelMode(lCoordinate, 0);
    for i := 0 to 1 do
        begin
            lAxis[i] := i;
        end;
    AxmContiWriteClear(lCoordinate);
    AxmContiSetAxisMap(lCoordinate, 2, @lAxis);
    AxmContiBeginNode(lCoordinate);
    dPos[0] := 100 ; dPos[1] := 100;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dPos[0] := 200 ; dPos[1] := 200;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dPos[0] := 300 ; dPos[1] := 300;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dPos[0] := 400 ; dPos[1] := 400;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dPos[0] := 500 ; dPos[1] := 500;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dPos[0] := 600 ; dPos[1] := 600;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dPos[0] := 700 ; dPos[1] := 700;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    AxmContiEndNode(lCoordinate);
    {절대위치구동시작. }
    AxmContiSetAbsRelMode(lCoordinate, 0);
    { 연속보간구동시작. }
    AxmContiStart(lCoordinate, 0, 0);
end;

AxmContiEndNode

Purpose

지정된 좌표계에서 연속보간을 수행할 작업들의 등록을 종료한다.

Format

C++
DWORD AxmContiEndNode(long lCoord);
Visual Basic
Function AxmContiEndNode(ByVal lCoord As Long) As Long
Delphi
function AxmContiEndNode(lCoord: LongInt) : DWord; stdcall;

Parameters

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

Return Values

[0000] AXT_RT_SUCCESS : 함수 실행 성공
[4166] AXT_ERROR_CONTI_INVALID_MAP_NO : 연속보간 맵핑 번호가 비워져있을 때
* See error code Table for more information on status error codes

Description

이 함수를 호출한 후, AxmContiStart 함수가 호출되기 전까지 수행되지 않고 내부 Queue 에 쌓여만 있다. AxmContiStart 함수가 호출될 때 비로소 등록된 모션이 실제로 수행된다.

▶ AxmContiWriteClear 이 함수는 등록된 작업들을 메모리에 지울 때 사용한다. 연속보간작업이 모두 수행된 후에 반드시 이 함수를 이용해 메모리를 Clear 시킨다.

▶ AxmContiIsMotion 이 함수는 연속보간 구동 중인지 체크하는 한다.

▶ AxmContiGetTotalNodeNum 이 함수는 메모리에 등록된 모든 갯수를 반환한다.

▶ AxmContiGetNodeNum 이 함수는 현재 구동중인 연속보간 인덱스번호를 확인한다.

▶ AxmContiReadFree 이 함수는 메모리가 비워있는지 체크한다

▶ AxmContiStart 이 함수는 연속보간구동을 시작한다.

예제코드 : 일반 보간

C++
long lAxis[2];
double dPos[2];
long lPosSize = 2;
long lCoordinate = 0;
double dVelocity = 200, dAccel = 400;
lAxis[0] = 0; lAxis[1] = 1;
AxmContiWriteClear(lCoordinate);
AxmContiSetAxisMap(lCoordinate, lPosSize, lAxis);
//절대위치구동등록.
AxmContiSetAbsRelMode(lCoordinate, 0);
AxmContiBeginNode(lCoordinate);
dPos[0] = 100 , dPos[1] = 100;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel); 
dPos[0] = 200 , dPos[1] = 200;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel); 
dPos[0] = 300 , dPos[1] = 300;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel); 
dPos[0] = 400 , dPos[1] = 400;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel); 
dPos[0] = 500 , dPos[1] = 500;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel); 
dPos[0] = 600 , dPos[1] = 600;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel); 
dPos[0] = 700 , dPos[1] = 700;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel); 
dPos[0] = 800 , dPos[1] = 800;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel); 
dPos[0] = 900 , dPos[1] = 900;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel); 
dPos[0] = 1000 , dPos[1] = 1000;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel); 
dPos[0] = 1100 , dPos[1] = 1100;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel);
AxmContiEndNode(lCoordinate);
//절대위치구동시작.
AxmContiSetAbsRelMode(lCoordinate, 0);
// 연속보간구동시작.
AxmContiStart(lCoordinate, 0, 0);
Visual Basic
Dim dVelocity As Double
Dim dAccel As Double
Dim lPosSize As Long
Dim lCoordinate As Long 
Dim dPos(0 To 1) As Double
Dim axes(0 To 1) As Long
Dim i As Long
dVelocity = 200
dAccel = 400
lPosSize = 2
lCoordinate = 0
For i = 0 To 1
    axes(i) = i
Next i 
AxmContiWriteClearlCoordinate
AxmContiSetAxisMaplCoordinate, lPosSize, axes(0)
‘절대위치구동등록시작.
AxmContiSetAbsRelModelCoordinate, 0
AxmContiBeginNodelCoordinate
dPos(0) = 100: dPos(1) = 100
AxmLineMove lCoordinate, dPos(0), dVelocity, dAccel, dAccel
dPos(0) = 200: dPos(1) = 200
AxmLineMove lCoordinate, dPos(0), dVelocity , dAccel, dAccel
dPos(0) = 300: dPos(1) = 300
AxmLineMove lCoordinate, dPos(0), dVelocity , dAccel, dAccel
dPos(0) = 400: dPos(1) = 400
AxmLineMove lCoordinate, dPos(0), dVelocity , dAccel, dAccel
dPos(0) = 500: dPos(1) = 500
AxmLineMove lCoordinate, dPos(0), dVelocity , dAccel, dAccel
dPos(0) = 600: dPos(1) = 600
AxmLineMove lCoordinate, dPos(0), dVelocity , dAccel, dAccel
dPos(0) = 700: dPos(1) = 700
AxmLineMove lCoordinate, dPos(0), dVelocity , dAccel, dAccel
AxmContiEndNodelCoordinate
‘절대위치구동시작.
AxmContiSetAbsRelModelCoordinate, 0
‘연속보간구동시작.
AxmContiStartlCoordinate, 0, 0

Delphi
var
    i : LongInt;
    dVelocity, dAccel : Double;
    lAxis : array [0..1] of LongInt;
    dPos : array [0..1] of Double;
    lCoordinate : LongInt;
    lPosSize : LongInt;

begin
    dVelocity := 200;
    dAccel := 400;
    lPosSize := 2;
    lCoordinate := 0;
    { 절대위치구동등록. }
    AxmContiSetAbsRelMode(lCoordinate, 0);
    for i := 0 to 1 do
        begin
            lAxis[i] := i;
        end;
    AxmContiWriteClear(lCoordinate);
    AxmContiSetAxisMap(lCoordinate, 2, @lAxis);
    AxmContiBeginNode(lCoordinate);
    dPos[0] := 100 ; dPos[1] := 100;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dPos[0] := 200 ; dPos[1] := 200;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dPos[0] := 300 ; dPos[1] := 300;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dPos[0] := 400 ; dPos[1] := 400;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dPos[0] := 500 ; dPos[1] := 500;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dPos[0] := 600 ; dPos[1] := 600;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dPos[0] := 700 ; dPos[1] := 700;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    AxmContiEndNode(lCoordinate);
    {절대위치구동시작. }
    AxmContiSetAbsRelMode(lCoordinate, 0);
    { 연속보간구동시작. }
    AxmContiStart(lCoordinate, 0, 0);
end;

AxmContiReadFree

Purpose

보간 구동을 위한 내부 Queue 가 비어 있는지 확인하는 함수이다.

Format

C++
DWORD AxmContiReadFree(long lCoord, DWORD *upQueueFree);
Visual Basic
Function AxmContiReadFree(ByVal lCoord As Long, ByRef upQueueFree As 
Long) As Long
Delphi
function AxmContiReadFree(lCoord: LongInt; upQueueFree : PDWord) : 
DWord; stdcall;

Parameters

[in/out] Name [Init Value] Explanation
[in]lCoord 채널(축) 번호(0 ~ (최대축수 - 1))
[out]upQueueFree 내부 Queue 상태값
- [00h]내부 Queue가 비어 있지 않음
- [01h]내부 Queue가 비어 있음

Return Values

[0000] AXT_RT_SUCCESS : 함수 실행 성공
[4166] AXT_ERROR_CONTI_INVALID_MAP_NO : 연속보간 맵핑 번호가 비워져있을 때
* See error code Table for more information on status error codes

Description

직선 보간함수인 AxmLineMove 함수와, 원호간 함수들인 AxmCircleCenterMove, AxmCirclePointMove, AxmCircleRadiusMove, AxmCircleAngleMove 들을 AxmContiBeginNode, AxmContiEndNode 함께 이용 시 보간구동을 하기 위해 Queue 에 저장해서 연속보간을 하는데, 그 내부 Queue 가 비워 있으면 TRUE, 비워있지 않으면 FALSE 로 확인된다.

예제코드 : 일반 보간

C++
long lAxis[2];
double dPos[2];
long lPosSize = 2;
long lCoordinate = 0;
double dVelocity = 200, dAccel = 400;
lAxis[0] = 0;
lAxis[1] = 1;
AxmContiWriteClear(lCoordinate);
AxmContiSetAxisMap(lCoordinate, lPosSize, lAxis);
//절대위치구동등록.
AxmContiSetAbsRelMode(lCoordinate, 0);
AxmContiBeginNode(lCoordinate);
dPos[0] = 100 , dPos[1] = 100;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel); 
dPos[0] = 200 , dPos[1] = 200;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel); 
dPos[0] = 300 , dPos[1] = 300;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel); 
dPos[0] = 400 , dPos[1] = 400;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel); 
dPos[0] = 500 , dPos[1] = 500;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel); 
dPos[0] = 600 , dPos[1] = 600;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel); 
dPos[0] = 700 , dPos[1] = 700;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel); 
dPos[0] = 800 , dPos[1] = 800;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel); 
dPos[0] = 900 , dPos[1] = 900;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel); 
dPos[0] = 1000 , dPos[1] = 1000;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel); 
dPos[0] = 1100 , dPos[1] = 1100;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel);
AxmContiEndNode(lCoordinate);
//절대위치구동시작.
AxmContiSetAbsRelMode(lCoordinate, 0);
// 연속보간구동시작.
AxmContiStart(lCoordinate, 0, 0);
//보간구동을위한내부 Queue가비어있는지확인.
DWORD ReadInterpolationQueueFree;
AxmContiReadFree (lCoordinate, &ReadInterpolationQueueFree);
if(ReadInterpolationQueueFree) 
    printf(내부 Queue가비어있음.);
else 
    printf(내부 Queue가비어있지않음.);
Visual Basic
Dim dVelocity As Double
Dim dAccel As Double
Dim lPosSize As Long
Dim lCoordinate As Long
Dim dPos(0 To 1) As Double
Dim axes(0 To 1) As Long
Dim i As Long
dVelocity = 200
dAccel = 400
lPosSize = 2
lCoordinate = 0 
For i = 0 To 1
    axes(i) = i
Next i
AxmContiWriteClearlCoordinate
AxmContiSetAxisMaplCoordinate, lPosSize, axes(0)
‘절대위치구동등록시작.
AxmContiSetAbsRelModelCoordinate, 0
AxmContiBeginNode lCoordinate
dPos(0) = 100: dPos(1) = 100
AxmLineMove lCoordinate, dPos(0), dVelocity, dAccel, dAccel
dPos(0) = 200: dPos(1) = 200
AxmLineMove lCoordinate, dPos(0), dVelocity , dAccel, dAccel
dPos(0) = 300: dPos(1) = 300
AxmLineMove lCoordinate, dPos(0), dVelocity , dAccel, dAccel
dPos(0) = 400: dPos(1) = 400
AxmLineMove lCoordinate, dPos(0), dVelocity , dAccel, dAccel
dPos(0) = 500: dPos(1) = 500
AxmLineMove lCoordinate, dPos(0), dVelocity , dAccel, dAccel
dPos(0) = 600: dPos(1) = 600
AxmLineMove lCoordinate, dPos(0), dVelocity , dAccel, dAccel
dPos(0) = 700: dPos(1) = 700
AxmLineMove lCoordinate, dPos(0), dVelocity , dAccel, dAccel
AxmContiEndNodelCoordinate
‘절대위치구동시작.
AxmContiSetAbsRelModelCoordinate, 0
‘연속보간구동시작.
AxmContiStartlCoordinate, 0, 0
‘보간구동을위한내부 Queue가비어있는지확인.
Dim ReadInterpolationQueueFree As Long
AxmContiReadFree lCoordinate, ReadInterpolationQueueFree
If ReadInterpolationQueueFree Then
MsgBox “내부 Queue가비어있음., vbOKCancel
Else
MsgBox “내부 Queue가비어있지않음., vbOKCancel
End If

Delphi
var
    i : LongInt;
    dVelocity, dAccel : Double;
    lAxis : array [0..1] of LongInt;
    dPos : array [0..1] of Double;
    lCoordinate : LongInt;
    lPosSize : LongInt;
    ReadInterpolationQueueFree : DWORD;

begin
    dVelocity := 200; dAccel := 400;
    lPosSize := 2;
    lCoordinate := 0;
    { 절대위치구동등록. }
    AxmContiSetAbsRelMode(lCoordinate, 0);
    for i := 0 to 1 do
        begin
            lAxis[i] := i;
        end;
    AxmContiWriteClear(lCoordinate);
    AxmContiSetAxisMap(lCoordinate, 2, @lAxis);
    AxmContiBeginNode(lCoordinate);
    dPos[0] := 100 ; dPos[1] := 100;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dPos[0] := 200 ; dPos[1] := 200;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dPos[0] := 300 ; dPos[1] := 300;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dPos[0] := 400 ; dPos[1] := 400;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dPos[0] := 500 ; dPos[1] := 500;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dPos[0] := 600 ; dPos[1] := 600;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dPos[0] := 700 ; dPos[1] := 700;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    AxmContiEndNode(lCoordinate);
    {절대위치구동시작. }
    AxmContiSetAbsRelMode(lCoordinate, 0);
    { 연속보간구동시작. }
    AxmContiStart(lCoordinate, 0, 0);
    {보간구동을위한내부 Queue가비어있는지확인. }
    AxmContiReadFree (lCoordinate, @ReadInterpolationQueueFree);
    if ReadInterpolationQueueFree = 1 then
        Application.MessageBox(‘내부 Queue가비어있음., Ajinextek, MB_OK)
    else
        Application.MessageBox(‘내부 Queue가비어있지않음., Ajinextek, MB_OK);
end;

AxmContiReadIndex

Purpose

보간 구동을 위한 내부 Queue 에 저장되어 있는 보간 구동 개수를 확인하는 함수이다.

Format

C++
DWORD AxmContiReadIndex(long lCoord, long *lpQueueIndex);
Visual Basic
Function AxmContiReadIndex(ByVal lCoord As Long, ByRef lpQueueIndex 
As Long) As Long
Delphi
function AxmContiReadIndex(lCoord: LongInt; lpQueueIndex : PLongInt) : 
DWord; stdcall;

Parameters

[in/out] Name [Init Value] Explanation
[in]lCoord 채널(축) 번호(0 ~ (최대축수 - 1))
[out]lpQueueIndex 저장된 보간 Queue 개수

Return Values

[0000] AXT_RT_SUCCESS : 함수 실행 성공
[4166] AXT_ERROR_CONTI_INVALID_MAP_NO : 연속보간 맵핑 번호가 비워져있을 때
* See error code Table for more information on status error codes

Description

직선 보간함수인 AxmLineMove 함수와, 원호간 함수들인 AxmCircleCenterMove, AxmCirclePointMove, AxmCircleRadiusMove, AxmCircleAngleMove 들을 AxmContiBeginNode, AxmContiEndNode 함께 이용 시 보간구동을 하기 위해 Queue 에 저장해서 연속보간을 하는데,그 내부 Queue 의 개수를 확인할 때 사용한다. 하나의 AxmLineMove 함수가 1 개로 간주된다.

예제코드 : 일반 보간

C++
long ReadInterpolMotionQueueIndex;
long lAxis[2];
double dPos[2];
long lPosSize = 2;
long lCoordinate = 0;
double dVelocity = 200, dAccel = 400;
lAxis[0] = 0;
lAxis[1] = 1;
AxmContiWriteClear(lCoordinate);
AxmContiSetAxisMap(lCoordinate, lPosSize, lAxis);
//절대위치구동등록.
AxmContiSetAbsRelMode(lCoordinate, 0);
AxmContiBeginNode(lCoordinate);
dPos[0] = 100 , dPos[1] = 100;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel); 
dPos[0] = 200 , dPos[1] = 200;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel); 
dPos[0] = 300 , dPos[1] = 300;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel); 
dPos[0] = 400 , dPos[1] = 400;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel); 
dPos[0] = 500 , dPos[1] = 500;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel); 
dPos[0] = 600 , dPos[1] = 600;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel); 
dPos[0] = 700 , dPos[1] = 700;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel); 
dPos[0] = 800 , dPos[1] = 800;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel); 
dPos[0] = 900 , dPos[1] = 900;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel); 
dPos[0] = 1000 , dPos[1] = 1000;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel); 
dPos[0] = 1100 , dPos[1] = 1100;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel);
AxmContiEndNode(lCoordinate);
//절대위치구동시작.
AxmContiSetAbsRelMode(lCoordinate, 0);
// 연속보간구동시작.
AxmContiStart(lCoordinate, 0, 0);
// 보간구동을위한내부 Queue에저장되어있는보간구동개수를확인.
if(AxmContiReadIndex(lCoordinate, &ReadInterpolMotionQueueIndex)== AXT_RT_SUCCESS)
{
    printf(연속보간큐가 %ld 개들어가있다.. \n, ReadInterpolMotionQueueIndex);
}
Visual Basic
Dim ReadInterpolMotionQueueIndex As Long
Dim dVelocity As Double
Dim dAccel As Double
Dim lPosSize As Long
Dim lCoordinate As Long
Dim dPos(0 To 1) As Double
Dim axes(0 To 1) As Long
Dim strData As String
Dim i As Long
dVelocity = 200
dAccel = 400
lPosSize = 2
lCoordinate = 0 
For i = 0 To 1
    axes(i) = i
Next i 
AxmContiWriteClearlCoordinate
AxmContiSetAxisMaplCoordinate, lPosSize, axes(0)
‘절대위치구동등록시작.
AxmContiSetAbsRelModelCoordinate, 0
AxmContiBeginNodelCoordinate
dPos(0) = 100: dPos(1) = 100
AxmLineMove lCoordinate, dPos(0), dVelocity, dAccel, dAccel
dPos(0) = 200: dPos(1) = 200
AxmLineMove lCoordinate, dPos(0), dVelocity , dAccel, dAccel
dPos(0) = 300: dPos(1) = 300
AxmLineMove lCoordinate, dPos(0), dVelocity , dAccel, dAccel
dPos(0) = 400: dPos(1) = 400
AxmLineMove lCoordinate, dPos(0), dVelocity , dAccel, dAccel
dPos(0) = 500: dPos(1) = 500
AxmLineMove lCoordinate, dPos(0), dVelocity , dAccel, dAccel
dPos(0) = 600: dPos(1) = 600
AxmLineMove lCoordinate, dPos(0), dVelocity , dAccel, dAccel
dPos(0) = 700: dPos(1) = 700
AxmLineMove lCoordinate, dPos(0), dVelocity , dAccel, dAccel
AxmContiEndNodelCoordinate
‘절대위치구동시작.
AxmContiSetAbsRelModelCoordinate, 0
‘연속보간구동시작.
AxmContiStartlCoordinate, 0, 0
‘보간구동을위한내부 Queue에저장되어있는보간구동개수를확인.
If(AxmContiReadIndex (lCoordinate, ReadInterpolMotionQueueIndex) = AXT_RT_SUCCESS) Then
    strData = “연속보간큐가” + CStr(ReadInterpolMotionQueueIndex) + “개들어가있다.
    MsgBox strData
End If

Delphi
var
    i : LongInt;
    dVelocity, dAccel : Double;
    lAxis : array [0..1] of LongInt;
    dPos : array [0..1] of Double;
    lCoordinate : LongInt;
    lPosSize : LongInt;
    ReadInterpolationQueueFree : DWORD;
    ReadInterpolMotionQueueIndex,ReadInterpolMotionQueueIndex2 : longInt;
    strData : String;

begin
dVelocity := 200; dAccel := 400; lPosSize := 2; lCoordinate := 0;
{ 절대위치구동등록. }
AxmContiSetAbsRelMode(lCoordinate, 0);
for i := 0 to 1 do
    begin
        lAxis[i] := i;
    end;
AxmContiWriteClear(lCoordinate);
AxmContiSetAxisMap(lCoordinate, 2, @lAxis);
AxmContiBeginNode(lCoordinate);
dPos[0] := 100 ; dPos[1] := 100;
AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
dPos[0] := 200 ; dPos[1] := 200;
AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
dPos[0] := 300 ; dPos[1] := 300;
AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
dPos[0] := 400 ; dPos[1] := 400;
AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
dPos[0] := 500 ; dPos[1] := 500;
AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
dPos[0] := 600 ; dPos[1] := 600;
AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
dPos[0] := 700 ; dPos[1] := 700;
AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
AxmContiEndNode(lCoordinate);
{절대위치구동시작. }
AxmContiSetAbsRelMode(lCoordinate, 0);
{ 연속보간구동시작. }
AxmContiStart(lCoordinate, 0, 0);
{ 보간구동을위한내부 Queue에저장되어있는보간구동개수를확인. }
if (AxmContiReadIndex (lCoordinate, @ReadInterpolMotionQueueIndex) = AXT_RT_SUCCESS) then
    begin
        strData := ' 연속보간큐가 ' + IntToStr(ReadInterpolMotionQueueIndex) + ‘개들어가있다.;
        Application.MessageBox (PCHAR(strData), 'Ajinextek', MB_OK);
    end;
end;

AxmContiWriteClear

Purpose

연속 보간 구동을 위해 저장된 내부 Queue 를 모두 삭제하는 함수이다.

Format

C++
DWORD AxmContiWriteClear(long lCoord);
Visual Basic
Function AxmContiWriteClear(ByVal lCoord As Long) As Long
Delphi
function AxmContiWriteClear(lCoord: LongInt) : DWord; stdcall;

Parameters

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

Return Values

[0000] AXT_RT_SUCCESS : 함수 실행 성공
[4166] AXT_ERROR_CONTI_INVALID_MAP_NO : 연속보간 맵핑 번호가 비워져있을 때
* See error code Table for more information on status error codes

Description

직선 보간함수인 AxmLineMove 함수와, 원호간 함수들인 AxmCircleCenterMove, AxmCirclePointMove, AxmCircleRadiusMove, AxmCircleAngleMove 들을 AxmContiBeginNode, AxmContiEndNode 함께 이용 시 보간구동을 하기 위해 Queue 에 저장해서 연속보간을 하는데, 하나의 AxmLineMove 함수가 1 개로 간주된다.연속 보간 구동을 위해 저장된 내부 Queue 개수 를 모두 삭제할 때 사용한다.

예제코드 : 일반 보간

C++
long lAxis[2];
double dPos[2];
long lPosSize = 2;
long lCoordinate = 0;
dPos[0] = 4000;
dPos[1] = 4000;
lAxis[0] = 0;
lAxis[1] = 1;
AxmContiWriteClear(lCoordinate);
AxmContiSetAxisMap(lCoordinate, lPosSize, lAxis);
//상대위치구동.
AxmContiSetAbsRelMode(lCoordinate, 1);
// 직선보간구동.
AxmLineMove(lCoordinate, dPos, 200, 400, 400);
Visual Basic
Dim lCoordinate As Long
Dim Distance(0 To 2) As Double
Dim axes(0 To 2) As Long
Dim i As Long
lCoordinate = 0 
For i = 0 To 2
    axes(i) = i
Next i
Distance(0) = 4000
Distance(1) = 4000
AxmContiWriteClearlCoordinate
AxmContiSetAxisMaplCoordinate, 2, axes(0)
‘상대위치구동.
AxmContiSetAbsRelModelCoordinate, 1
‘직선보간구동.
AxmLineMove lCoordinate, Distance(0), 200, 400, 400

Delphi
var
    i : LongInt;
    lCoordinate : LongInt;
    lAxis : array [0..1] of Longint;
    dPos : array [0..1] of Double;
    lPosSize : LongInt;

begin
    lCoordinate := 0;
    lPosSize := 2;
    for i := 0 to 1 do
        begin
        lAxis[i] := i;
        end;
    dPos[0] := 4000;
    dPos[1] := 4000;
    AxmContiWriteClear(lCoordinate);
    AxmContiSetAxisMap(lCoordinate, lPosSize, @lAxis);
    { 상대위치구동. }
    AxmContiSetAbsRelMode(lCoordinate, 1);
    { 직선보간구동. }
    AxmLineMove(lCoordinate, @dPos, 200, 400, 400);

end;

AxmContiStart

Purpose

저장된 내부 연속 보간 Queue 의 구동을 시작하는 함수이다.

Format

C++
DWORD AxmContiStart(long lCoord, DWORD dwProfileset, long lAngle);
Visual Basic
Function AxmContiStart(ByVal lCoord As Long, ByVal dwProfileset As 
Long, ByVal lAngle As Long) As Long
Delphi
function AxmContiStart(lCoord : LongInt; dwProfileset : DWord; lAngle: 
LongInt) : DWord; stdcall;

Parameters

[in/out] Name [Init Value] Explanation
[in]lCoord 채널(축) 번호(0 ~ (최대축수 - 1))
[in]dwProfileset 프로파일모드
- [00h]속도 지정 보간 모드
- [01h]노드 가감속 보간 모드
- [02h] 자동 가감속 보간 모드
[in]lAngle 자동 가감속모드 사용시 Angle값(0 ~ 360도)

Return Values

[0000] AXT_RT_SUCCESS : 함수 실행 성공
[4166] AXT_ERROR_CONTI_INVALID_MAP_NO : 연속보간 맵핑 번호가 비워져있을 때
[4169] AXT_RT_ERROR_MOVE_SENSOR_CHECK : 연속보간 구동 전 에러센서가 (Alarm, EMG, Limit 등) 감지된 경우
* See error code Table for more information on status error codes

Description

직선 보간함수인 AxmLineMove 함수와, 원호간 함수들인 AxmCircleCenterMove, AxmCirclePointMove, AxmCircleRadiusMove, AxmCircleAngleMove 들을 AxmContiBeginNode, AxmContiEndNode 함께 이용 시 보간구동을 하기 위해 Queue 에 저장해서 연속보간을 하는데, 하나의 AxmLineMove 함수가 1 개로 간주된다.연속 보간 구동을 위해 저장된 내부 Queue 의 구동을 시작할 때 사용한다.

▶ AxmSStop, AxmEstop 함수에 의해 모션감속정지, 모션급정지할수있다. 인자는 반드시 Coordinate 의 마스터축을 넣어서 정지시킨다.

여기에 사용되는 리스트 연속보간 모션은 수행해야 할 여러 단계의 작업을 리스트로 등록시킨 후에 일괄적으로 처리하는 기능을 말하는데 연속보간 모션의 장점은 하나의 작업과 그 다음 작업간에 프로파일이 끊기는 것이 없이 연속적인 작업을 수행할 수 있도록 하는 것이다. 일반적으로 장비에서는 주로 Dispensing, 가공, 페인팅과 같은 직선과 직선이 만나는 코너 점에서 원호를 삽입하여 직선 → 원호 → 직선 → 원호 →직선 보간을 연속적으로 제어할 수 있다.

예제코드 : 일반 보간

C++
long lAxis[2];
double dPos[2];
long lPosSize = 2;
long lCoordinate = 0;
double dVelocity = 200, dAccel = 400;
lAxis[0] = 0;
lAxis[1] = 1;
AxmContiWriteClear(lCoordinate);
AxmContiSetAxisMap(lCoordinate, lPosSize, lAxis);
//절대위치구동등록.
AxmContiSetAbsRelMode(lCoordinate, 0);
AxmContiBeginNode(lCoordinate);
dPos[0] = 100 , dPos[1] = 100;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel);
dPos[0] = 200 , dPos[1] = 200;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel);
dPos[0] = 300 , dPos[1] = 300;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel);
dPos[0] = 400 , dPos[1] = 400;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel);
dPos[0] = 500 , dPos[1] = 500;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel);
AxmContiEndNode(lCoordinate);
//절대위치구동시작.
AxmContiSetAbsRelMode(lCoordinate, 0);
// 연속보간구동시작.
AxmContiStart(lCoordinate, 0, 0);
Visual Basic
Dim dVelocity As Double
Dim dAccel As Double
Dim lPosSize As Long
Dim lCoordinate As Long
Dim dPos(0 To 1) As Double
Dim axes(0 To 1) As Long
Dim i As Long
dVelocity = 200
dAccel = 400
lPosSize = 2
lCoordinate = 0 
For i = 0 To 1
    axes(i) = i
Next i 
AxmContiWriteClear lCoordinate
AxmContiSetAxisMaplCoordinate, lPosSize, axes(0)
‘절대위치구동등록시작.
AxmContiSetAbsRelModelCoordinate, 0
AxmContiBeginNodelCoordinate
dPos(0) = 100: dPos(1) = 100
AxmLineMove lCoordinate, dPos(0), dVelocity, dAccel, dAccel
dPos(0) = 200: dPos(1) = 200
AxmLineMove lCoordinate, dPos(0), dVelocity , dAccel, dAccel
dPos(0) = 300: dPos(1) = 300
AxmLineMove lCoordinate, dPos(0), dVelocity , dAccel, dAccel
dPos(0) = 400: dPos(1) = 400
AxmLineMove lCoordinate, dPos(0), dVelocity , dAccel, dAccel
dPos(0) = 500: dPos(1) = 500
AxmLineMove lCoordinate, dPos(0), dVelocity , dAccel, dAccel
AxmContiEndNodelCoordinate
‘절대위치구동시작.
AxmContiSetAbsRelModelCoordinate, 0
‘연속보간구동시작.
AxmContiStartlCoordinate, 0, 0

Delphi
var
    i : LongInt;
    dVelocity, dAccel : Double;
    lAxis : array [0..1] of LongInt;
    dPos : array [0..1] of Double;
    lCoordinate : LongInt;
    lPosSize : LongInt;

begin
    dVelocity := 200;
    dAccel := 400;
    lPosSize := 2;
    lCoordinate := 0;
    { 절대위치구동등록. }
    AxmContiSetAbsRelMode(lCoordinate, 0);
    for i := 0 to 1 do
        begin
            lAxis[i] := i;
        end;
    AxmContiWriteClear(lCoordinate);
    AxmContiSetAxisMap(lCoordinate, 2, @lAxis);
    AxmContiBeginNode(lCoordinate);
    dPos[0] := 100 ; dPos[1] := 100;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dPos[0] := 200 ; dPos[1] := 200;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dPos[0] := 300 ; dPos[1] := 300;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dPos[0] := 400 ; dPos[1] := 400;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dPos[0] := 500 ; dPos[1] := 500;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    AxmContiEndNode(lCoordinate);
    {절대위치구동시작. }
    AxmContiSetAbsRelMode(lCoordinate, 0);
    { 연속보간구동시작. }
    AxmContiStart(lCoordinate, 0, 0);
end;

AxmContiIsMotion

Purpose

연속 보간 구동 중인지 확인하는 함수이다.

Format

C++
DWORD AxmContiIsMotion(long lCoord, DWORD *upInMotion);
Visual Basic
Function AxmContiIsMotion(ByVal lCoord As Long, ByRef upInMotion As 
Long) As Long
Delphi
function AxmContiIsMotion(lCoord: LongInt; upInMotion : PDWord) : 
DWord; stdcall;

Parameters

[in/out] Name [Init Value] Explanation
[in]lCoord 채널(축) 번호(0 ~ (최대축수 - 1))
[out]upInMotion 연속 보간 동작임을 확인
- [00h]연속 보간 구동 중이 아님
- [01h]연속 보간 구동 중임

Return Values

[0000] AXT_RT_SUCCESS : 함수 실행 성공
[4166] AXT_ERROR_CONTI_INVALID_MAP_NO : 연속보간 맵핑 번호가 비워져있을 때
* See error code Table for more information on status error codes

Description

직선 보간함수인 AxmLineMove 함수와, 원호간 함수들인 AxmCircleCenterMove, AxmCirclePointMove, AxmCircleRadiusMove, AxmCircleAngleMove 들을 AxmContiBeginNode, AxmContiEndNode 함께 이용 시 보간구동을 하기 위해 Queue 에 저장해서 연속보간을 하는데, 하나의 AxmLineMove 함수가 1 개로 간주된다.연속 보간 구동을 위해 저장된 내부 Queue 의 연속 보간 구동 중 연속 보간 동작을 시작하면 좌표계가 동작 중인지 확인할 때 사용한다.

예제코드 : 일반 보간

C++
DWORD IsContMotion;
long lAxis[2];
double dPos[2];
long lPosSize = 2;
long lCoordinate = 0;
double dVelocity = 200, dAccel = 400;
lAxis[0] = 0;
lAxis[1] = 1;
AxmContiWriteClear(lCoordinate);
AxmContiSetAxisMap(lCoordinate, lPosSize, lAxis);
//절대위치구동등록.
AxmContiSetAbsRelMode(lCoordinate, 0);
AxmContiBeginNode(lCoordinate);
dPos[0] = 100 , dPos[1] = 100;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel);
dPos[0] = 200 , dPos[1] = 200;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel);
dPos[0] = 300 , dPos[1] = 300;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel);
dPos[0] = 400 , dPos[1] = 400;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel);
dPos[0] = 500 , dPos[1] = 500;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel);
AxmContiEndNode(lCoordinate);
//절대위치구동시작.
AxmContiSetAbsRelMode(lCoordinate, 0);
// 연속보간구동시작.
AxmContiStart(lCoordinate, 0, 0);
Sleep(100);
AxmContiIsMotion (lCoordinate, &IsContMotion);
if(IsContMotion)
{ 
    // 보간중인지아닌지확인한다.
    MessageBox(현재리스트연속보간모션이수행중이다\n);
}
Visual Basic
Public Declare Sub Sleep Lib kernel32 Alias Sleep (ByVal dwMilliseconds As Long)
‘베이직에서 Sleep 함수를사용하기위해서헤더파일에반드시선언해서사용해야된다.
Dim IsContMotion As Long
Dim strData As String
Dim dVelocity As Double
Dim dAccel As Double
Dim lPosSize As Long
Dim lCoordinate As Long
Dim dPos(0 To 1) As Double
Dim axes(0 To 1) As Long
Dim i As Long
dVelocity = 200
dAccel = 400
lPosSize = 2
lCoordinate = 0 
For i = 0 To 1
    axes(i) = i
Next i 
AxmContiWriteClearlCoordinate
AxmContiSetAxisMaplCoordinate, lPosSize, axes(0)
‘절대위치구동등록시작.
AxmContiSetAbsRelModelCoordinate, 0
AxmContiBeginNodelCoordinate
dPos(0) = 100: dPos(1) = 100
AxmLineMove lCoordinate, dPos(0), dVelocity, dAccel, dAccel
dPos(0) = 200: dPos(1) = 200
AxmLineMove lCoordinate, dPos(0), dVelocity , dAccel, dAccel
dPos(0) = 300: dPos(1) = 300
AxmLineMove lCoordinate, dPos(0), dVelocity , dAccel, dAccel
dPos(0) = 400: dPos(1) = 400
AxmLineMove lCoordinate, dPos(0), dVelocity , dAccel, dAccel
dPos(0) = 500: dPos(1) = 500
AxmLineMove lCoordinate, dPos(0), dVelocity , dAccel, dAccel
AxmContiEndNodelCoordinate
‘절대위치구동시작.
AxmContiSetAbsRelModelCoordinate, 0
‘연속보간구동시작.
AxmContiStartlCoordinate, 0, 0
Sleep 100
AxmContiIsMotion lCoordinate, IsContMotion
If(IsContMotion = 1) Then
    MsgBox “현재리스트연속보간모션이수행중이다., vbOKCancel
End If

Delphi
var
    i : LongInt;
    dVelocity, dAccel : Double;
    lAxis : array [0..1] of LongInt;
    dPos : array [0..1] of Double;
    lCoordinate : LongInt;
    lPosSize : LongInt;
    IsContMotion : DWORD;

begin
    dVelocity := 200;
    dAccel := 400;
    lPosSize := 2;
    lCoordinate := 0;
    { 절대위치구동등록. }
    AxmContiSetAbsRelMode(lCoordinate, 0);
    for i := 0 to 1 do
        begin
            lAxis[i] := i;
        end;
    AxmContiWriteClear(lCoordinate);
    AxmContiSetAxisMap(lCoordinate, 2, @lAxis);
    AxmContiBeginNode(lCoordinate);
    dPos[0] := 100 ; dPos[1] := 100;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dPos[0] := 200 ; dPos[1] := 200;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dPos[0] := 300 ; dPos[1] := 300;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dPos[0] := 400 ; dPos[1] := 400;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dPos[0] := 500 ; dPos[1] := 500;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    AxmContiEndNode(lCoordinate);
    {절대위치구동시작. }
    AxmContiSetAbsRelMode(lCoordinate, 0);
    { 연속보간구동시작. }
    AxmContiStart(lCoordinate, 0, 0);
    Sleep(100);
    AxmContiIsMotion (lCoordinate, @IsContMotion);
    if(IsContMotion = 1 ) then {보간중인지아닌지확인한다.}
    begin
        Application.MessageBox(‘현재리스트연속보간모션이수행중이다., Ajinextek, MB_OK);
    end ;

end;

AxmContiGetNodeNum

Purpose

연속 보간 구동 중 현재 구동중인 연속 보간 인덱스 번호를 확인하는 함수이다.

Format

C++
DWORD AxmContiGetNodeNum(long lCoord, long *lpNodeNum);
Visual Basic
Function AxmContiGetNodeNum(ByVal lCoord As Long, ByRef lpNodeNum As 
Long) As Long
Delphi
function AxmContiGetNodeNum(lCoord: LongInt; lpNodeNum : PlongInt) : 
DWord; stdcall;

Parameters

[in/out] Name [Init Value] Explanation
[in]lCoord 채널(축) 번호(0 ~ (최대축수 - 1))
[out]lpNodeNum 연속 보간 인덱스 번호

Return Values

[0000] AXT_RT_SUCCESS : 함수 실행 성공
[4166] AXT_ERROR_CONTI_INVALID_MAP_NO : 연속보간 맵핑 번호가 비워져있을 때
* See error code Table for more information on status error codes

Description

직선 보간함수인 AxmLineMove 함수와, 원호간 함수들인 AxmCircleCenterMove, AxmCirclePointMove, AxmCircleRadiusMove, AxmCircleAngleMove 들을 AxmContiBeginNode, AxmContiEndNode 함께 이용 시 보간구동을 하기 위해 Queue 에 저장해서 연속보간을 하는데, 하나의 AxmLineMove 함수가 1 개로 간주된다.연속 보간 구동을 위해 저장된 내부 Queue 의 연속 보간 구동 중 연속 보간 동작을 시작하면 현재 구동중인 연속 보간 인덱스 번호를 확인할 때 사용한다. 여기서 참고할 사항은 반드시 하드웨어 내부 Queue 에 7 개가 들어가있어서 동작하고 있다는 사실이다.

예제코드 : 일반 보간

C++
long lpNodeNum1;
DWORD IsContMotion;
long lAxis[2];
double dPos[2];
long lPosSize = 2;
long lCoordinate = 0;
double dVelocity = 200, dAccel = 400;
lAxis[0] = 0;
lAxis[1] = 1;
AxmContiWriteClear(lCoordinate);
AxmContiSetAxisMap(lCoordinate, lPosSize, lAxis);
//절대위치구동등록.
AxmContiSetAbsRelMode(lCoordinate, 0);
AxmContiBeginNode(lCoordinate);
dPos[0] = 100 , dPos[1] = 100;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel); 
dPos[0] = 200 , dPos[1] = 200;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel); 
dPos[0] = 300 , dPos[1] = 300;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel); 
dPos[0] = 400 , dPos[1] = 400;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel); 
dPos[0] = 500 , dPos[1] = 500;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel); 
AxmContiEndNode(lCoordinate);
//절대위치구동시작.
AxmContiSetAbsRelMode(lCoordinate, 0);
// 연속보간구동시작.
AxmContiStart(lCoordinate, 0, 0);
Sleep(100);
AxmContiIsMotion (lCoordinate, &IsContMotion);
if(IsContMotion)
{ 
    // 보간중인지아닌지확인한다.
    AxmContiGetNodeNum (0, &lpNodeNum1);
    printf(“\t 현재실행하고있는리스트보간작업번호는 %ld 이다\n, lpNodeNum1 );
}
Visual Basic
Public Declare Sub Sleep Lib kernel32 Alias Sleep (ByVal dwMilliseconds As Long)
‘베이직에서 Sleep 함수를사용하기위해서헤더파일에반드시선언해서사용해야된다.
Dim IsContMotion, lpNodeNum1 As Long
Dim strData As String
Dim dVelocity As Double
Dim dAccel As Double
Dim lPosSize As Long
Dim lCoordinate As Long
Dim dPos(0 To 1) As Double
Dim axes(0 To 1) As Long
Dim i As Long
dVelocity = 200
dAccel = 400
lPosSize = 2
lCoordinate = 0 
For i = 0 To 1
    axes(i) = i
Next i 
AxmContiWriteClear lCoordinate
AxmContiSetAxisMap lCoordinate, lPosSize, axes(0)
‘절대위치구동등록시작.
AxmContiSetAbsRelMode lCoordinate, 0
AxmContiBeginNode lCoordinate
dPos(0) = 100: dPos(1) = 100
AxmLineMove lCoordinate, dPos(0), dVelocity, dAccel, dAccel
dPos(0) = 200: dPos(1) = 200
AxmLineMove lCoordinate, dPos(0), dVelocity , dAccel, dAccel
dPos(0) = 300: dPos(1) = 300
AxmLineMove lCoordinate, dPos(0), dVelocity , dAccel, dAccel
dPos(0) = 400: dPos(1) = 400
AxmLineMove lCoordinate, dPos(0), dVelocity , dAccel, dAccel
dPos(0) = 500: dPos(1) = 500
AxmLineMove lCoordinate, dPos(0), dVelocity , dAccel, dAccel
AxmContiEndNode lCoordinate
‘절대위치구동시작.
AxmContiSetAbsRelMode lCoordinate, 0
‘연속보간구동시작.
AxmContiStart lCoordinate, 0, 0
Sleep 100
AxmContiIsMotion lCoordinate, IsContMotion
If(IsContMotion = 1) Then
    AxmContiGetNodeNum 0, lpNodeNum1
    strData = “현재실행하고있는리스트보간작업번호는” + CStr(lpNodeNum1) + ”이다.
    MsgBox strData
End If

Delphi
var
    i : LongInt;
    dVelocity, dAccel : Double;
    lAxis : array [0..1] of LongInt;
    dPos : array [0..1] of Double;
    lCoordinate : LongInt;
    lPosSize : LongInt;
    IsContMotion : DWORD;
    lpNodeNum1 : longInt;
    strData : String;

begin
    dVelocity := 200;
    dAccel := 400;
    lPosSize := 2;
    lCoordinate := 0;
    { 절대위치구동등록. }
    AxmContiSetAbsRelMode(lCoordinate, 0);
    for i := 0 to 1 do
        begin
            lAxis[i] := i;
        end;
    AxmContiWriteClear(lCoordinate);
    AxmContiSetAxisMap(lCoordinate, 2, @lAxis);
    AxmContiBeginNode(lCoordinate);
    dPos[0] := 100 ; dPos[1] := 100;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dPos[0] := 200 ; dPos[1] := 200;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dPos[0] := 300 ; dPos[1] := 300;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dPos[0] := 400 ; dPos[1] := 400;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dPos[0] := 500 ; dPos[1] := 500;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    AxmContiEndNode(lCoordinate);
    {절대위치구동시작. }
    AxmContiSetAbsRelMode(lCoordinate, 0);
    { 연속보간구동시작. }
    AxmContiStart(lCoordinate, 0, 0);
    Sleep(100);
    AxmContiIsMotion (lCoordinate, @IsContMotion);
    if(IsContMotion = 1 ) then {보간중인지아닌지확인한다.}
        begin
            AxmContiGetNodeNum (0, @lpNodeNum1);
            strData := ‘현재실행하고있는리스트보간작업번호는’ + IntToStr(lpNodeNum1) + ‘이다.;
            Application.MessageBox (PCHAR(strData), Ajinextek, MB_OK);
        end ;
end;

AxmContiGetTotalNodeNum

Purpose

설정한 연속 보간 구동 총 인덱스 개수를 확인하는 함수이다.

Format

C++
DWORD AxmContiGetTotalNodeNum(long lCoord, long *lpNodeNum);
Visual Basic
Function AxmContiGetTotalNodeNum(ByVal lCoord As Long, ByRef 
lpNodeNum As Long) As Long
Delphi
function AxmContiGetTotalNodeNum(lCoord: LongInt; lpNodeNum : 
PlongInt) : DWord; stdcall;

Parameters

[in/out] Name [Init Value] Explanation
[in]lCoord 채널(축) 번호(0 ~ (최대축수 - 1))
[out]lpNodeNum 연속 보간 인덱스 번호

Return Values

[0000] AXT_RT_SUCCESS : 함수 실행 성공
[4166] AXT_ERROR_CONTI_INVALID_MAP_NO : 연속보간 맵핑 번호가 비워져있을 때
* See error code Table for more information on status error codes

Description

직선 보간함수인 AxmLineMove 함수와, 원호간 함수들인 AxmCircleCenterMove, AxmCirclePointMove, AxmCircleRadiusMove, AxmCircleAngleMove 들을 AxmContiBeginNode, AxmContiEndNode 함께 이용 시 보간구동을 하기 위해 Queue 에 저장해서 연속보간을 하는데, 하나의 AxmLineMove 함수가 1 개로 간주된다. 여기서 설정한 연속 보간 구동 총 노드 갯수를 확인할 때 사용한다.

예제코드 : 일반 보간

C++
long lpTotalNodeNum1;
long lpNodeNum1;
DWORD IsContMotion;
long lAxis[2];
double dPos[2];
long lPosSize = 2;
long lCoordinate = 0;
double dVelocity = 200, dAccel = 400;
lAxis[0] = 0;
lAxis[1] = 1;
AxmContiWriteClear(lCoordinate);
AxmContiSetAxisMap(lCoordinate, lPosSize, lAxis);
//절대위치구동등록.
AxmContiSetAbsRelMode(lCoordinate, 0);
AxmContiBeginNode(lCoordinate);
dPos[0] = 100 , dPos[1] = 100;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel); 
dPos[0] = 200 , dPos[1] = 200;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel); 
dPos[0] = 300 , dPos[1] = 300;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel); 
dPos[0] = 400 , dPos[1] = 400;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel); 
dPos[0] = 500 , dPos[1] = 500;
AxmLineMove(lCoordinate, dPos, dVelocity, dAccel, dAccel); 
AxmContiEndNode(lCoordinate);
//절대위치구동시작.
AxmContiSetAbsRelMode(lCoordinate, 0);
// 연속보간구동시작.
AxmContiStart(lCoordinate, 0, 0);
Sleep(100);
AxmContiIsMotion (lCoordinate, &IsContMotion);
if(IsContMotion)
{ 
    // 보간중인지아닌지확인한다.
    AxmContiGetTotalNodeNum (0, &lpTotalNodeNum1);
    printf(“\t 현재실행하고있는리스트보간작업총갯수는 %ld 입니다\n, lpTotalNodeNum1);
}
Visual Basic
Public Declare Sub Sleep Lib kernel32 Alias Sleep (ByVal dwMilliseconds As Long)
‘베이직에서 Sleep 함수를사용하기위해서헤더파일에반드시선언해서사용해야된다.
Dim IsContMotion, lpTotalNodeNum1As Long
Dim strData As String
Dim dVelocity As Double
Dim dAccel As Double
Dim lPosSize As Long
Dim lCoordinate As Long
Dim dPos(0 To 1) As Double
Dim axes(0 To 1) As Long
Dim i As Long
dVelocity = 200
dAccel = 400
lPosSize = 2
lCoordinate = 0 
For i = 0 To 1
    axes(i) = i
Next i 
AxmContiWriteClear lCoordinate
AxmContiSetAxisMap lCoordinate, lPosSize, axes(0)
‘절대위치구동등록시작.
AxmContiSetAbsRelMode lCoordinate, 0
AxmContiBeginNode lCoordinate
dPos(0) = 100: dPos(1) = 100
AxmLineMove lCoordinate, dPos(0), dVelocity, dAccel, dAccel
dPos(0) = 200: dPos(1) = 200
AxmLineMove lCoordinate, dPos(0), dVelocity , dAccel, dAccel
dPos(0) = 300: dPos(1) = 300
AxmLineMove lCoordinate, dPos(0), dVelocity , dAccel, dAccel
dPos(0) = 400: dPos(1) = 400
AxmLineMove lCoordinate, dPos(0), dVelocity , dAccel, dAccel
dPos(0) = 500: dPos(1) = 500
AxmLineMove lCoordinate, dPos(0), dVelocity , dAccel, dAccel
AxmContiEndNode lCoordinate
‘절대위치구동시작.
AxmContiSetAbsRelMode lCoordinate, 0
‘연속보간구동시작.
AxmContiStart lCoordinate, 0, 0
Sleep 100
AxmContiIsMotion lCoordinate, IsContMotion
If(IsContMotion = 1) Then
    AxmContiGetTotalNodeNum 0, lpTotalNodeNum1
    strData = “현재실행하고있는리스트보간작업총갯수는” + CStr(lpTotalNodeNum1) + ”입니다.
    MsgBox strData
End If

Delphi
var
    i : LongInt;
    dVelocity, dAccel : Double;
    lAxis : array [0..1] of LongInt;
    dPos : array [0..1] of Double;
    lCoordinate : LongInt;
    lPosSize : LongInt;
    IsContMotion : DWORD;
    lpTotalNodeNum1: longInt;
    strData : String;

begin
    dVelocity := 200;
    dAccel := 400;
    lPosSize := 2;
    lCoordinate := 0;
    { 절대위치구동등록. }
    AxmContiSetAbsRelMode(lCoordinate, 0);
    for i := 0 to 1 do
        begin
            lAxis[i] := i;
        end;
    AxmContiWriteClear(lCoordinate);
    end;
    AxmContiSetAxisMap(lCoordinate, 2, @lAxis);
    AxmContiBeginNode(lCoordinate);
    dPos[0] := 100 ; dPos[1] := 100;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dPos[0] := 200 ; dPos[1] := 200;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dPos[0] := 300 ; dPos[1] := 300;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dPos[0] := 400 ; dPos[1] := 400;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    dPos[0] := 500 ; dPos[1] := 500;
    AxmLineMove(lCoordinate, @dPos, dVelocity, dAccel, dAccel);
    AxmContiEndNode(lCoordinate);
    {절대위치구동시작. }
    AxmMotSetAbsRelMode(lCoordinate, 0);
    { 연속보간구동시작. }
    AxmContiStart(lCoordinate, 0, 0);
    Sleep(100);
    AxmContiIsMotion (lCoordinate, @IsContMotion);
    if(IsContMotion = 1 ) then {보간중인지아닌지확인한다.}
        begin
            AxmContiGetTotalNodeNum (0, @ lpTotalNodeNum1);
            strData := ‘현재실행하고있는리스트보간작업총갯수는’ + IntToStr(lpTotalNodeNum1) + ‘입니다.;
            Application.MessageBox (PCHAR(strData), Ajinextek, MB_OK);
    end ;

AxmContiQBegin

Purpose

실시간 Conti Queue 모션을 시작한다.(Conti Queue = 128).

Format

C++
DWORD AxmContiQBegin (long lCoordNo, long lStartSegmCount);
C#
uint AxmContiQBegin (int nCoordNo, int nStartSegmCount);
Visual Basic
Function AxmContiQBegin (ByVal lCoordNo As Integer, ByVal 
lStartSegmCount As Integer) As Integer
Delphi
function AxmContiQBegin (lCoordNo: LongInt; lStartSegmCount: 
LongInt) : DWord; stdcall;

Parameters

[in/out] Name [Init Value] Explanation
[in]lCoord 채널(축) 번호(0 ~ (최대축수 - 1))
[in]lStartSegmCount 구동 시작 세그먼트 개수

Return Values

[0000] AXT_RT_SUCCESS : 함수 실행 성공
[4053] AXT_RT_MOTION_NOT_INITIAL_AXIS_NO : 해당 축 모션 초기화 실패
[4158] AXT_RT_MOTION_INVALID_POSITION : 소프트 리밋 영역 설정이 잘못 되었을 때
* See error code Table for more information on status error codes

Description

실시간 Conti Queue 모션을 시작한다. AxmContiQBegin 함수 이후에 모션구동 함수를 기입하면 모션 세그먼트 개수가 lStartSegmCount 일 때 모션을 시작한다. Queue 에 총 128 개의 세그먼트가 저장되며 개수가 초과되면 저장되지 않는다. 따라서 AxmContiQGetStatus 함수를 사용하여 plFreeSegmCount 가 1 이상일 때 다음 모션을 입력한다.

예제코드 : 일반 보간

C++
long lAxis[2];
double dFirstPos[2];
double dSecondePos[2];
long lPosSize = 2;
long lCoordinate = 0;
long lStartSegmCount = 2;
dFirstPos[0] = 200;
dFirstPos[1] = 200;
dSecondePos[0] = 400;
dSecondePos[1] = 400;
lAxis[0] = 0;
lAxis[1] = 1;
// 기존에 Queue에 저장되어 있던 정보를 모두 삭제한다.
AxmContiQWriteClear(lCoordinate);
// 좌표계를 설정한다.
AxmContiSetAxisMap(lCoordinate, lPosSize, lAxis);
// ContiQ 모션을 세그먼트 1개가 등록된 순간부터 시작한다.
AxmContiQBegin(lCoordinate, lStartSegmCount);
// 직선보간구동.
AxmLineMove(lCoordinate, dFirstPos, 200, 400, 400);
// 두번째 LineMove명령이 등록된 순간부터 Queue에 저장한 구동들을 시작한다.
AxmLineMove(lCoordinate, dSecondePos, 200, 400, 400);
// ContiQ 모션을 종료한다.
AxmContiQEnd(lCoordinate, 0);
Visual Basic
Dim lAxis(0 To 1) As Integer
Dim dFirstPos(0 To 1) As Double
Dim dSecondePos(0 To 1) As Double
Dim lPosSize As Integer
Dim lCoordinate As Integer
Dim lStartSegmCount As Integer

lPosSize = 2
lCoordinate = 0
lStartSegmCount = 2
dFirstPos(0) = 200
dFirstPos(1) = 200
dSecondePos(0) = 400
dSecondePos(1) = 400
lAxis(0) = 0
lAxis(1) = 1
// 기존에 Queue 저장되어 있던 정보를 모두 삭제한다.
AxmContiQWriteClear lCoordinate
// 좌표계를 설정한다.
AxmContiSetAxisMap lCoordinate, lPosSize, lAxis(0)
// ContiQ 모션을 세그먼트 1개가 등록된 순간부터 시작한다.
AxmContiQBegin Coordinate, lStartSegmCount
// 직선보간구동.
AxmLineMove lCoordinate, dFirstPos(0), 200, 400, 400
// 두번째 LineMove명령이 등록된 순간부터 Queue 저장한 구동들을 시작한다.
AxmLineMove lCoordinate, dSecondePos(0), 200, 400, 400
// ContiQ 모션을 종료한다.
AxmContiQEnd lCoordinate, 0

Delphi
var
    lAxis: array [0..1] of LongInt;
    dFirstPos: array [0..1] of Double;
    dSecondePos: array [0..1] of Double;
    lPosSize: LongInt;
    lCoordinate: Longint;
    lStartSegmCount: Longint;

begin
    lPosSize = 2
    lCoordinate = 0
    lStartSegmCount = 2
    dFirstPos[0] = 200
    dFirstPos[1] = 200
    dSecondePos[0] = 400
    dSecondePos[1] = 400
    lAxis[0] = 0
    lAxis[1] = 1

// 기존에 Queue에 저장되어 있던 정보를 모두 삭제한다.
AxmContiQWriteClear(lCoordinate);
// 좌표계를 설정한다.
AxmContiSetAxisMap(lCoordinate, lPosSize, @lAxis);
// ContiQ 모션을 세그먼트 1개가 등록된 순간부터 시작한다.
AxmContiQBegin(lCoordinate, lStartSegmCount);
// 직선보간구동.
AxmLineMove(lCoordinate, @dFirstPos, 200, 400, 400);
// 두번째 LineMove명령이 등록된 순간부터 Queue에 저장한 구동들을 시작한다.
AxmLineMove(lCoordinate, @dSecondePos, 200, 400, 400);
// ContiQ 모션을 종료한다.
AxmContiQEnd(lCoordinate, 0);
end;

AxmContiQEnd

Purpose

실시간 Conti Queue 모션을 종료한다.

Format

C++
DWORD AxmContiQEnd (long lCoordNo, long lStopMode);
C#
uint AxmContiQEnd (int nCoordNo, int nStopMode);
Visual Basic
Function AxmContiQEnd (ByVal lCoordNo As Integer, ByVal lStopMode As 
Integer) As Integer
Delphi
function AxmContiQEnd (lCoordNo: LongInt; lStopMode: LongInt) : DWord; 
stdcall;

Parameters

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

Return Values

[0000] AXT_RT_SUCCESS : 함수 실행 성공
[4053] AXT_RT_MOTION_NOT_INITIAL_AXIS_NO : 해당 축 모션 초기화 실패
[4101] AXT_RT_MOTION_INVALID_AXIS_NO : 해당 축이 존재하지 않음
* See error code Table for more information on status error codes

Description

실시간 Conti Queue 모션을 종료한다.

예제코드 : 일반 보간

C++
long lAxis[2];
double dFirstPos[2];
double dSecondePos[2];
long lPosSize = 2;
long lCoordinate = 0;
long lStartSegmCount = 2;
dFirstPos[0] = 200;
dFirstPos[1] = 200;
dSecondePos[0] = 400;
dSecondePos[1] = 400;
lAxis[0] = 0;
lAxis[1] = 1;
// 기존에 Queue에 저장되어 있던 정보를 모두 삭제한다.
AxmContiQWriteClear(lCoordinate);
// 좌표계를 설정한다.
AxmContiSetAxisMap(lCoordinate, lPosSize, lAxis);
// ContiQ 모션을 세그먼트 1개가 등록된 순간부터 시작한다.
AxmContiQBegin(lCoordinate, lStartSegmCount);
// 직선보간구동.
AxmLineMove(lCoordinate, dFirstPos, 200, 400, 400);
// 두번째 LineMove명령이 등록된 순간부터 Queue에 저장한 구동들을 시작한다.
AxmLineMove(lCoordinate, dSecondePos, 200, 400, 400);
// ContiQ 모션을 종료한다.
AxmContiQEnd(lCoordinate, 0);
Visual Basic
Dim lAxis(0 To 1) As Integer
Dim dFirstPos(0 To 1) As Double
Dim dSecondePos(0 To 1) As Double
Dim lPosSize As Integer
Dim lCoordinate As Integer
Dim lStartSegmCount As Integer

lPosSize = 2
lCoordinate = 0
lStartSegmCount = 2
dFirstPos(0) = 200
dFirstPos(1) = 200
dSecondePos(0) = 400
dSecondePos(1) = 400
lAxis(0) = 0
lAxis(1) = 1
// 기존에 Queue 저장되어 있던 정보를 모두 삭제한다.
AxmContiQWriteClear lCoordinate
// 좌표계를 설정한다.
AxmContiSetAxisMap lCoordinate, lPosSize, lAxis(0)
// ContiQ 모션을 세그먼트 1개가 등록된 순간부터 시작한다.
AxmContiQBegin Coordinate, lStartSegmCount
// 직선보간구동.
AxmLineMove lCoordinate, dFirstPos(0), 200, 400, 400
// 두번째 LineMove명령이 등록된 순간부터 Queue 저장한 구동들을 시작한다.
AxmLineMove lCoordinate, dSecondePos(0), 200, 400, 400
// ContiQ 모션을 종료한다.
AxmContiQEnd lCoordinate, 0

Delphi
var
    lAxis: array [0..1] of LongInt;
    dFirstPos: array [0..1] of Double;
    dSecondePos: array [0..1] of Double;
    lPosSize: LongInt;
    lCoordinate: Longint;
    lStartSegmCount: Longint;

begin
    lPosSize = 2
    lCoordinate = 0
    lStartSegmCount = 2
    dFirstPos[0] = 200
    dFirstPos[1] = 200
    dSecondePos[0] = 400
    dSecondePos[1] = 400
    lAxis[0] = 0
    lAxis[1] = 1

// 기존에 Queue에 저장되어 있던 정보를 모두 삭제한다.
AxmContiQWriteClear(lCoordinate);
// 좌표계를 설정한다.
AxmContiSetAxisMap(lCoordinate, lPosSize, @lAxis);
// ContiQ 모션을 세그먼트 1개가 등록된 순간부터 시작한다.
AxmContiQBegin(lCoordinate, lStartSegmCount);
// 직선보간구동.
AxmLineMove(lCoordinate, @dFirstPos, 200, 400, 400);
// 두번째 LineMove명령이 등록된 순간부터 Queue에 저장한 구동들을 시작한다.
AxmLineMove(lCoordinate, @dSecondePos, 200, 400, 400);
// ContiQ 모션을 종료한다.
AxmContiQEnd(lCoordinate, 0);
end;

AxmContiQGetStatus

Purpose

현재 Queue 의 상태를 반환한다.

Format

C++
DWORD AxmContiQGetStatus (long lCoordNo, long* plFreeSegmCount, long* 
plCurrentSegmNo);
C#
uint AxmContiQGetStatus (int nCoordNo, int[] pnFreeSegmCount, int[] 
pnCurrentSegmNo);
Visual Basic
Function AxmContiQGetStatus (ByVal lCoordNo As Integer, ByRef 
plFreeSegmCount As Integer, ByRef plCurrentSegmNo As Integer) As 
Integer
Delphi
function AxmContiQGetStatus (lCoordNo : LongInt; plFreeSegmCount : 
PLongInt; plCurrentSegmNo : PLongInt) : DWord; stdcall;

Parameters

[in/out] Name [Init Value] Explanation
[in]lCoord 채널(축) 번호(0 ~ (최대축수 - 1))
[out]plFreeSegmCount 입력 가능한 모션 Queue 개수
[out]plCurrentSegmNo 현재 진행중인 Queue 번호

Return Values

[0000] AXT_RT_SUCCESS : 함수 실행 성공
[4053] AXT_RT_MOTION_NOT_INITIAL_AXIS_NO : 해당 축 모션 초기화 실패
[4101] AXT_RT_MOTION_INVALID_AXIS_NO : 해당 축이 존재하지 않음
* See error code Table for more information on status error codes

Description

현재 Queue 의 상태를 반환한다. AxmContiQBegin 와 AxmContiQEnd 사이에서 사용해야한다.

예제코드 : 일반 보간

C++
// 0번 축의 Queue 상태를 확인한다.
long lCoordNo = 0, lFreeSegmCount, lCurrentSegmNo;
AxmContiQGetStatus (lCoordNo, &lFreeSegmCount, &lCurrentSegmNo);
Visual Basic
0 축의 Queue 상태를 확인한다.
Dim lCoordNo As Integer
Dim lFreeSegmCount As Integer
Dim lCurrentSegmNo As Integer
lCoordNo = 0
AxmContiQGetStatus lCoordNo, lFreeSegmCount, lCurrentSegmNo

Delphi
{ 0번 축의 Queue 상태를 확인한다. }
var
lCoordNo: LongInt;
 lFreeSegmCount: LongInt;
 lCurrentSegmNo: LongInt;
begin
lCoordNo := 0;
AxmContiQGetStatus (lCoordNo, @lFreeSegmCount, @lCurrentSegmNo);
end;

AxmContiQWriteClear

Purpose

지정된 좌표계에 연속 보간 구동을 위해 저장된 내부 Queue 를 모두 삭제한다.

Format

C++
DWORD AxmContiQWriteClear (long lCoordNo);
C#
uint AxmContiQWriteClear (int nCoordNo);
Visual Basic
Function AxmContiQWriteClear (ByVal lCoordNo As Integer) As Integer
Delphi
function AxmContiQWriteClear (lCoordNo : LongInt) : DWord; stdcall;

Parameters

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

Return Values

[0000] AXT_RT_SUCCESS : 함수 실행 성공
[4053] AXT_RT_MOTION_NOT_INITIAL_AXIS_NO : 해당 축 모션 초기화 실패
[4101] AXT_RT_MOTION_INVALID_AXIS_NO : 해당 축이 존재하지 않음
* See error code Table for more information on status error codes

Description

지정된 좌표계에 연속 보간 구동을 위해 저장된 내부 Queue 를 모두 삭제한다.

예제코드 : 일반 보간

C++
long lAxis[2];
double dFirstPos[2];
double dSecondePos[2];
long lPosSize = 2;
long lCoordinate = 0;
long lStartSegmCount = 2;
dFirstPos[0] = 200;
dFirstPos[1] = 200;
dSecondePos[0] = 400;
dSecondePos[1] = 400;
lAxis[0] = 0;
lAxis[1] = 1;
// 기존에 Queue에 저장되어 있던 정보를 모두 삭제한다.
AxmContiQWriteClear(lCoordinate);
// 좌표계를 설정한다.
AxmContiSetAxisMap(lCoordinate, lPosSize, lAxis);
// ContiQ 모션을 세그먼트 1개가 등록된 순간부터 시작한다.
AxmContiQBegin(lCoordinate, lStartSegmCount);
// 직선보간구동.
AxmLineMove(lCoordinate, dFirstPos, 200, 400, 400);
// 두번째 LineMove명령이 등록된 순간부터 Queue에 저장한 구동들을 시작한다.
AxmLineMove(lCoordinate, dSecondePos, 200, 400, 400);
// ContiQ 모션을 종료한다.
AxmContiQEnd(lCoordinate, 0);
Visual Basic
Dim lAxis(0 To 1) As Integer
Dim dFirstPos(0 To 1) As Double
Dim dSecondePos(0 To 1) As Double
Dim lPosSize As Integer
Dim lCoordinate As Integer
Dim lStartSegmCount As Integer

lPosSize = 2
lCoordinate = 0
lStartSegmCount = 2
dFirstPos(0) = 200
dFirstPos(1) = 200
dSecondePos(0) = 400
dSecondePos(1) = 400
lAxis(0) = 0
lAxis(1) = 1
// 기존에 Queue 저장되어 있던 정보를 모두 삭제한다.
AxmContiQWriteClear lCoordinate
// 좌표계를 설정한다.
AxmContiSetAxisMap lCoordinate, lPosSize, lAxis(0)
// ContiQ 모션을 세그먼트 1개가 등록된 순간부터 시작한다.
AxmContiQBegin Coordinate, lStartSegmCount
// 직선보간구동.
AxmLineMove lCoordinate, dFirstPos(0), 200, 400, 400
// 두번째 LineMove명령이 등록된 순간부터 Queue 저장한 구동들을 시작한다.
AxmLineMove lCoordinate, dSecondePos(0), 200, 400, 400
// ContiQ 모션을 종료한다.
AxmContiQEnd lCoordinate, 0

Delphi
{ 0번 축의 Queue 상태를 확인한다. }
var
    lAxis: array [0..1] of LongInt;
    dFirstPos: array [0..1] of Double;
    dSecondePos: array [0..1] of Double;
    lPosSize: LongInt;
    lCoordinate: Longint;
    lStartSegmCount: Longint;

begin
    lPosSize = 2
    lCoordinate = 0
    lStartSegmCount = 2
    dFirstPos[0] = 200
    dFirstPos[1] = 200
    dSecondePos[0] = 400
    dSecondePos[1] = 400
    lAxis[0] = 0
    lAxis[1] = 1

// 기존에 Queue에 저장되어 있던 정보를 모두 삭제한다.
AxmContiQWriteClear(lCoordinate);
// 좌표계를 설정한다.
AxmContiSetAxisMap(lCoordinate, lPosSize, @lAxis);
// ContiQ 모션을 세그먼트 1개가 등록된 순간부터 시작한다.
AxmContiQBegin(lCoordinate, lStartSegmCount);
// 직선보간구동.
AxmLineMove(lCoordinate, @dFirstPos, 200, 400, 400);
// 두번째 LineMove명령이 등록된 순간부터 Queue에 저장한 구동들을 시작한다.
AxmLineMove(lCoordinate, @dSecondePos, 200, 400, 400);
// ContiQ 모션을 종료한다.
AxmContiQEnd(lCoordinate, 0);
end;