고급 모션 구동
산업 장비의 정밀성과 다양성이 요구됨에 따라 단순한 위치 제어를 넘어서 복합적인 궤적과 정밀한 움직임이 가능한 고급 모션 구동 기능이 필요하게 된다.
고급 모션 구동 기능은 특정 기구 구조나 공정 조건에 맞춘 맞춤형 모션을 구현할 수 있도록 다양한 고급 기능을 제공한다.
고급 모션 구동에 포함되는 주요 기능으로는 위치, 속도, 시간 값을 기반으로 하는 PVT 구동, 기구적 오차를 보정하기 위한 오차 보정 테이블, 정지 시간을 지정하는 Dwell 기능, 나선형 경로를 생성하는 헬리컬 구동, 그리고 곡선의 연속성을 유지하며 경로를 생성하는 스플라인 구동 등이 있다.
이러한 고급 모션 기능들은 각각의 축에 대해 기존 단축 구동 설정을 기반으로 작동하며 사용자 정의 데이터와 보간 방식에 따라 더욱 정밀하고 부드러운 모션 제어가 가능해진다. 각 기능은 독립적으로 또는 다축 연동 구조 내에서 사용될 수 있으며 공정 효율성과 정밀도를 동시에 향상시키는 데 활용된다.
1. PVT (Position, Velocity, Time)
PVT(Position-Velocity-Time) 구동은 모션 제어에서 위치, 속도, 시간 값을 기반으로 경로를 정의하여 구동하는 방식으로 각 점(point)마다 명확한 시점과 속도를 부여함으로써 유연하고 정밀한 궤적 제어가 가능해진다.
1.1. PVT 함수 리스트
Function | Description |
---|---|
AxmMovePVT | 사용자가 입력한 PVT(Point, Velocity, Time) 시퀀스를 기반으로 지정 축을 PVT 방식으로 구동한다. |
1.2. PVT 함수 소개
AxmMovePVT
Purpose
사용자가 Position, Velocity, Time Table을 이용하여 생성한 프로파일로 단축 PVT 구동을 한다.
Format
C++
DWORD AxmMovePVT(long lAxisNo, DWORD dwArraySize, double* dPos, double* dVel, DWORD* dwUsec)
Visual Basic
Function AxmMovePVT(ByVal lAxisNo As Long, ByVal dwArraySize As Long,
ByRef dPos As Double, ByRef dVel As Double, ByRef dwUsec As Long) As Long
Delphi
function AxmMovePVT(lAxisNo: LongInt; dwArraySize: LongInt;
dPos: PDouble; dVel: PDouble; dwUsec: PDWORD): DWORD; stdcall;
Parameters
[in/out] Name | [Init Value] Explanation |
---|---|
[in]lAxisNo | 구동 축 |
[in]dwArraySize | PVT Table size |
[in]dPos | Position 배열 |
[in]dVel | Velocity 배열 |
[in]dwUsec | Time 배열 Usec 단위, 단 Cycle의 배수여야만 한다. ex 1sec = 1,000,000 |
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
PVT 구동 방식은 일반적인 점간 이동(Point-to-Point) 또는 속도 제어 방식과 달리 각 구간의 속도 프로파일을 개별적으로 정의할 수 있으며 주어진 시간 간격 내에 목표 위치 및 속도에 도달해야 한다는 시간 기반 구속 조건을 따르게 된다. 이를 통해 부드럽고 자연스러운 경로 생성이 가능하며, 연속적인 궤적 생성이 필요한 고속 정밀 시스템에 적합하다.
PVT 구동은 다음과 같은 순서로 이루어진다. 사용자는 먼저 구동하고자 하는 각 위치 지점에 대해 해당 지점에서의 목표 위치(Position), 속도(Velocity), 도달 시간(Time)을 정의한 PVT 데이터를 준비하여야 하며 이러한 PVT 데이터는 연속적인 시퀀스로 구성되어야 한다. 각 PVT 포인트는 독립적인 명령 집합으로 해석되며 두 포인트 간에는 내부적으로 3차 스플라인 보간 방식 혹은 시스템에 따라 선형 보간 방식으로 궤적이 생성된다.
실제 구동 시에는 사용자로부터 입력된 PVT 시퀀스를 기반으로 컨트롤러가 매 주기마다 해당 시점에 필요한 보간 값을 계산하여 모터에 명령을 전달하게 되며 이는 고속 실시간 환경에서도 예측 가능한 운동 궤적을 유지하게 한다.
PVT 데이터 입력 시 주의할 사항은 다음과 같다. 첫 번째 포인트의 도달 시간은 반드시 0으로 설정되어야 하며 이후 각 포인트는 점점 증가하는 시간 값을 가져야 한다. 위치 및 속도는 실수 값으로 입력되며 단위는 시스템의 설정에 따라 미리 정의된 스케일을 따르게 된다. 하나의 PVT 시퀀스에 포함될 수 있는 포인트 수는 최대 1024개로 제한되며 이 범위를 초과할 경우 초과된 데이터는 무시된다.
즉, PVT 포인트가 각각 (x1, v1, t1), (x2, v2, t2), ..., (xn, vn, tn)으로 정의될 때 시스템은 이 포인트들을 기반으로 시간 t에 따른 연속적 위치 및 속도 함수를 생성하여 모션을 실행한다. 이를 통해 정밀하면서도 부드러운 모션 제어가 가능하게 된다.
AxmSyncBegin, AxmSyncEnd API와 함께 사용시 여러 축의 PVT 구동을 예약한다. 예약된 PVT 구동 프로파일은 AxmSyncStart 명령을 받게되면 동시에 시작한다.
예제코드
C++
DWORD dwArraySize = 5;
double dPos[5] = { 100.0, 200.0, 300.0, 400.0, 500.0 };
double dVel[5] = { 0.0, 100.0, 100.0, 100.0, 0.0 };
DWORD dwTime[5] = { 1000, 2000, 3000, 4000, 5000 };
AxmMovePVT(lAxisNo, dwArraySize, dPos, dVel, dwTime);
2. 기구 오차 보정 테이블 (Compensation Geometric Errors)
위치 오차는 기구의 가공오차 및 온도 특성에 따른 기구 변형등으로 발생하는데 시간에 대하여 변하지 않는 특성을 가지고 있다고 가정한다면 발생되는 오차에 대하여 측정된 보상값을 가감하여 오차가 보상된 최종 위 치로 정밀하게 제어할 수 있게된다.
보정 테이블 기능은 입력된 보정위치 값을 사용하여 실제 이동할 위치에 실시간으로 보상하는 방법으로 이루 어 지는데, 축마다 각각의 보정 테이블 값이 입력되어야 한다. 실시간 보상 주기는 통신을 통해 전달되는 모 션 지령의 매 주기 마다 이루어 지며, 입력된 보상 테이블의 중간값은 모션 지령 통신 매 주기마다 PC의 도 움없이 PCI-R1604-MLII에서 자동으로 구해진다.
보정 테이블 기능은 정해진 보정 구간에 대하여 보정 값을 테이블로 입력받야야 하며, 테이블 입력값의 최대 개수는 512개이다. 보정 테이블의 첫번째 값과 마지막 값은 반드시 0을 입력하여야 하며, 각 테이블값 사이 의 중간값은 선형 보간 형태로 계산된다. 즉 x1, x2, …, xn가 보상정 위치 이고 e1, e2, …, en이라고 했을 때 다음과 같이 보상 테이블을 정의 할 수 있다.
이때 xi-1과 xi 사이의 값은 다음의 식으로 구해진다.
입력된 보정 테이블의 첫번째 값이 적용된 위치를 보상 시작 위치라고 하며, 이 위치를 기준으로 상대적인 위치 값을 xn으로 입력하여야한다. 즉 첫번째 보상 테이블 값은 x = 0 이고 e = 0 로 설정되어야 한다. 한정 된 보정 위치 테이블 개수는 512개로 한정되어 있는데 마지막 보정 값은 반드시 0으로 설정되어야 하며, RollOver 기능을 하용하면, 보정 테이블에 입력된 거리 구간이 반복된다. 즉 다음과 같이 보정 테이블 값이 정의 되고 시작 위치가 0으로 설정되었다고 가정하였을 때, RollOver 기능 적용시, 실제 위치 1000 에서 1100 구간의 보정 값은 보정 테이블 0에서 100 구간에 해당하는 정보와 동일하게 적용된다.
실제 계산되는 보상 값은 아래의 그래프형태가 될 것이다.
보정 테이블 기능을 사용한 보정 결과는 실제 서보 드라이버로 전달되는 지령 위치에 반영되며, 내부위치값 에는 반영되지 않는다, 즉 실제 모터의 이동량에는 반영되나 사용가 읽어보는 내부위치 정보 (AxmStatusGetCmdPos)로는 확인할 수 없다. 단지 실제 모터의 이동량(AxmStatusGetActPos로 확인)에서 보정 테이블의 적용 결과를 확인할 수 있다. 상기 테이블을 보정 테이블로 사용하였다면, 내부 위치 값이 500인 순간 외부위치(실제위치) 값은 505로 확인되어야 한다.
// 보정기능적용축 : 1, 보정적용시작위치: 1000, 보정데이터개수 : 10, RollOver 기능사용.
long lAxis, lNumEntry ;
double dPos[11],dCorrection[11], dStartPos;
DWORDdwRollOver ;
lAxis = 1 ;
lNumEntry = 10 ;
dStartPos = 1000 ;
dwRollOver = 1 ;
dPos[0] = 0; dCorrection[0] = 0;
dPos[1] = 100; dCorrection[1] = 10;
dPos[2] = 150; dCorrection[2] = 30;
dPos[3] = 240; dCorrection[3] = 35;
dPos[4] = 440; dCorrection[4] = 24;
dPos[5] = 500; dCorrection[5] = 5;
dPos[6] = 600; dCorrection[6] = -8;
dPos[7] = 610; dCorrection[7] = 15;
dPos[8] = 790; dCorrection[8] = 10;
dPos[9] = 880; dCorrection[9] = 25;
dPos[10] = 1000; dCorrection[10] = 0;
AxmCompensationSet(lAxis, lNumEntry, dStartPos, dPos, dCorrection, dwRollOver );
AxmCompensationEnable(lAxisNo, TRUE);
2.1. 기구 오차 보정 테이블 함수 리스트
Function | Description |
---|---|
AxmCompensationSet | 지정 축에 오차 보정 테이블 값을 입력한다. |
AxmCompensationGet | 지정 축에 설정된 기구 오차 보정 테이블 값을 반환한다. |
AxmCompensationEnable | 지정 축에 AxmCompensationSet에서 설정한 정보를 사용하여 기구오차 보정 테이블 기능을 적용/해제 한다. |
AxmCompensationIsEnable | 지정 축에보정 테이블 기능 적용 상태를 반환한다. |
AxmCompensationOneDimSet | 1차원 보정 테이블을 설정한다 |
AxmCompensationOneDimGet | 1차원 보정 테이블의 정보를 확인한다. |
AxmCompensationOneDimReset | 1차원 보정 테이블의 설정을 해제한다. |
AxmCompensationOneDimEnable | 1차원 보정을 활성화/비활성화 한다. |
AxmCompensationOneDimIsEnable | 1차원 보정의 활성화/비활성화를 확인한다. |
AxmCompensationOneDimGetCorrection | 현재 지령 위치에서의 1차원 보정위치를 확인한다. |
2.2. 기구 오차 보정 테이블 함수 소개
AxmCompensationSet
Purpose
지정 축에 오차 보정 테이블 값을 입력한다.
Format
C++
DWORD __ AxmCompensationSet(long lAxisNo, long lNumEntry, double
dStartPos, double *dpPosition, double *dpCorrection, DWORD
dwRollOver);
Visual Basic
Function AxmCompensationSet(ByVal lAxisNo As Long, ByVal lNumEntry As
Long,ByVal dStartPos As Double, ByRef dpPosition As Double, ByRef
dpCorrection As Double, ByVal dwRollOverAs Long) As Long
Delphi
function AxmCompensationSet(lAxisNo : LongInt;lNumEntry : LongInt;
dStartPos : Double; dpPosition : PDouble; dpCorrection : PDouble;
dwRollOver : DWord): DWord; stdcall;
Parameters
[in/out] Name | [Init Value] Explanation |
---|---|
[in]lAxisNo | 채널(축) 번호(0 ~ (최대축수 – 1)) |
[in]lNumEntry | 오차 보정 테이블 데이터 개수( < 512 ) |
[in]dStartPos | 오차 보정 테이블 위치 offset |
[in]dpPosition | 기구 오차 보정 테이블 위치 정보. (dpPosition [0] = 0, dpPosition [n + 1] >dpPosition [n]) |
[in]dpCorrection | 기구 오차 보정 데이터 정보. (dpCorrection [0] = 0, dpCorrection [lNumEntry] = 0) |
[in]dwRollOver | 기구 오차 보정 테이블 적용 구간을 dpPosition[lNumEntry] 거리 주기적으로 반복하는 기능에 대한 설정 및 해제 - [00h] RollOver 기능 사용하지 않음 - [01h] RollOver 기능 사용 |
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
지정 축에 기구 오차 보정 데이터 적용 기능을 사용하기 위한 정보를 설정한다.
보정 데이터 적용 기능은 지정한 축의 dStartPos 에 대한 상태 위치(dpPosition )에서의 보정 데이터(dpCorrection)를 지령 위치에 가감하여 측정된 기구오차를 보정하는 것이다. 입력된 보정 데이터 간의 중간값은 선형 보간에 의하여 자동 계산되며, 보정 데이터를 적용한 결과는 서보 드라이버로 전달되는 통신 주기마다 적용된다. 보정 데이터의 최대 개수는 512 이며, lNumEntry 는 (입력 보정데이타 개수 - 1) 로 설정한다. dwRollOver 에 'ENABLE'을 설정하면 보정 데이터를 dpPosition[lNumEntry] 거리 주기로 반복 적용할 수 있다.
보정 테이블 기능을 사용한 보정 결과는 실제 서보 드라이버로 전달되는 지령 위치에 반영되며, 내부위치값에는 반영되지 않는다, 즉 실제 모터의 이동량에는 반영되나 사용가 읽어보는 내부위치 정보(AxmStatusGetCmdPos)로는 확인할 수 없다. 단지 실제 모터의 이동량(AxmStatusGetActPos 로 확인)에서 보정 테이블의 적용 결과를 확인할 수 있다. 상기 테이블을 보정 테이블로 사용하였다면, 내부 위치 값이 500 인 순간 외부위치(실제위치) 값은 505 로 확인되어야 한다.
예제코드
C++
// 보정기능적용축 : 1, 보정적용시작위치: 1000, 보정데이터개수 : 10, RollOver 기능사용.
long lAxis, lNumEntry ;
double dPos[11],dCorrection[11], dStartPos;
DWORD dwRollOver ;
lAxis = 1 ;
lNumEntry = 10 ;
dStartPos = 1000 ;
bRollOver = 1 ;
dPos[0] = 0; dCorrection[0] = 0;
dPos[1] = 100; dCorrection[1] = 10;
dPos[2] = 150; dCorrection[2] = 30;
dPos[3] = 240; dCorrection[3] = 35;
dPos[4] = 440; dCorrection[4] = 24;
dPos[5] = 500; dCorrection[5] = 5;
dPos[6] = 600; dCorrection[6] = -8;
dPos[7] = 610; dCorrection[7] = 15;
dPos[8] = 790; dCorrection[8] = 10;
dPos[9] = 880; dCorrection[9] = 25;
dPos[10] = 1000; dCorrection[10] = 0;
AxmCompensationSet(lAxis, lNumEntry, dStartPos, dPos, dCorrection, dwRollOver );
AxmCompensationEnable(lAxisNo, ENABLE);
Visual Basic
` 보정기능적용축 : 1, 보정적용시작위치: 1000, 보정데이터개수 : 10, RollOver 기능사용.
Dim lAxis As Long
Dim lNumEntry As Long
Dim dPos(0 To 11) As Double
Dim dCorrection (0 To 11) As Double
Dim dStartPos As Double
Dim dwRollOver As Long
lAxis = 1
lNumEntry = 10
dStartPos = 1000
dwRollOver = 1
dPos(0) = 0
dPos(1) = 100
dPos(2) = 150
dPos(3) = 240
dPos(4) = 440
dPos(5) = 500
dPos(6) = 600
dPos(7) = 610
dPos(8) = 790
dPos(9) = 880
dPos(10) = 1000
dCorrection(0) = 0
dCorrection(1) = 10
dCorrection(2) = 30
dCorrection(3) = 35
dCorrection(4) = 24
dCorrection(5) = 5
dCorrection(6) = -8
dCorrection(7) = 15
dCorrection(8) = 10
dCorrection(9) = 25
dCorrection(10) = 0
AxmCompensationSet lAxis, lNumEntry, dStartPos, dPos, dCorrection, dwRollOver
AxmCompensationEnable lAxisNo, ENABLE
Delphi
{보정기능적용축 : 1, 보정적용시작위치: 1000, 보정데이터개수 : 10, RollOver 기능사용 }
var
lAxis : LongInt;
lNumEntry : LongInt;
dwRollOver : DWord;
dPos[11] : array(0..11) of Double;
dCorrection[11] : array(0..11) of Double;
dStartPos : Double;
begin
lAxis := 1 ;
lNumEntry := 10 ;
dStartPos := 1000 ;
bRollOver := 1 ;
dPos(0) := 0; dCorrection(0) := 0;
dPos(1) := 100; dCorrection(1) := 10;
dPos(2) := 150; dCorrection(2) := 30;
dPos(3) := 240; dCorrection(3) := 35;
dPos(4) := 440; dCorrection(4) := 24;
dPos(5) := 500; dCorrection(5) := 5;
dPos(6) := 600; dCorrection(6) := -8;
dPos(7) := 610; dCorrection(7) := 15;
dPos(8) := 790; dCorrection(8) := 10;
dPos(9) := 880; dCorrection(9) := 25;
dPos(10) := 1000; dCorrection(10) := 0;
AxmCompensationSet(lAxis, lNumEntry, dStartPos, dPos, dCorrection, dwRollOver );
AxmCompensationEnable(lAxisNo, ENABLE);
end;
AxmCompensationGet
Purpose
지정 축에 입력 된 오차 보정 테이블 값을 반환한다.
Format
C++
DWORD __ AxmCompensationGet (long lAxisNo, long *lpNumEntry, double
*dpStartPos, double *dpPosition, double *dpCorrection, DWORD
*dwpRollOver);
Visual Basic
Function AxmCompensationGet (ByVal lAxisNo As Long, ByRef lpNumEntry
As Long,ByRef dpStartPos As Double, ByRef dpPosition As Double, ByRef
dpCorrection As Double, ByRefdwpRollOver As Long) As Long
Delphi
function AxmCompensationGet (lAxisNo : LongInt;lpNumEntry : PLongInt;
dpStartPos : PDouble; dpPosition : PDouble; dpCorrection : PDouble;
dwpRollOver : PDWord): DWord; stdcall;
Parameters
[in/out] Name | [Init Value] Explanation |
---|---|
[in]lAxisNo | 채널(축) 번호(0 ~ (최대축수 – 1)) |
[out]lpNumEntry | 오차 보정 테이블 데이터 개수( < 512 ) |
[out]dStartPos | 오차 보정 테이블 위치 offset |
[out]dpPosition | 기구 오차 보정 테이블 위치 정보. (dpPosition [0] = 0, dpPosition [n + 1] >dpPosition [n]) |
[out]dpCorrection | 기구 오차 보정 데이터 정보. (dpCorrection [0] = 0, dpCorrection [lNumEntry] = 0) |
[out]dwRollOver | 기구 오차 보정 테이블 적용 구간을 dpPosition[lNumEntry] 거리 주기적으로 반복하는 기능에 대한 설정 및 해제 - [00h] RollOver 기능 사용하지 않음 - [01h] RollOver 기능 사용 |
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
지정 축에 AxmCompensationSet으로 설정된 기구 오차 보정 데이터 적용 기능을 사용하기 위한 정보를 반환한다.
예제코드
C++
// 보정기능적용축 : 1, 보정적용시작위치: 1000, 보정데이터개수 : 10, RollOver 기능사용.
long lAxis, lNumEntry ;
double dPos[512],dCorrection[512], dStartPos;
DWORD dwRollOver ;
AxmCompensationGet(lAxis, &lNumEntry, &dStartPos, dPos, dCorrection, &dwRollOver );
Visual Basic
` 보정기능적용축 : 1, 보정적용시작위치: 1000, 보정데이터개수 : 10, RollOver 기능사용.
Dim lAxis As Long
Dim lNumEntry As Long
Dim dPos(0 To 11) As Double
Dim dCorrection (0 To 11) As Double
Dim dStartPos As Double
Dim dwRollOver As Long
lAxis = 0
AxmCompensationGet lAxis, lNumEntry, dStartPos, dPos, dCorrection, dwRollOver
Delphi
{보정기능적용축 : 1, 보정적용시작위치: 1000, 보정데이터개수 : 10, RollOver 기능사용 }
var
lAxis : LongInt;
lNumEntry : LongInt;
dwRollOver : DWord;
dPos[11] : array(0..11) of Double;
dCorrection[11] : array(0..11) of Double;
dStartPos : Double;
begin
lAxis := 0;
AxmCompensationGet(lAxis, @lNumEntry, @dStartPos, dPos, dCorrection, @dwRollOver );
end;
AxmCompensationEnable
Purpose
지정 축에 기구 오차 보정 테이블 기능을 적용/해제 한다.
Format
C++
DWORD AxmCompensationEnable (long lAxisNo, DWORD dwEnable);
Visual Basic
Function AxmCompensationEnable (ByVal lAxisNo As Long, ByVal dwEnable
As Long) As Long
Delphi
function AxmCompensationEnable (lAxisNo : LongInt; dwEnable : DWord) :
DWord; stdcall;
Parameters
[in/out] Name | [Init Value] Explanation |
---|---|
[in]lAxisNo | 채널(축) 번호(0 ~ (최대축수 – 1)) |
[in]dwEnable | 기구 오차 보정 테이블 기능 적용/해제 설정 : AXT_USE - [00h] 기능 사용하지 않음 - [01h] 기능 사용 |
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
지정 축에 AxmCompensationSet으로 설정된 내용으로 기구 오차 보정 테이블 기능을 적용 또는 해제한다.
예제코드
C++
// 1번축에보정테이블을사용함.
long lAxis = 1;
AxmCompensationEnable(lAxis, ENABLE );
Visual Basic
‘ 1번축에보정테이블을사용함.
Dim lAxis As Long
lAxis = 1
AxmCompensationEnablelAxis, ENABLE
Delphi
{ 1번축에보정테이블을사용함. }
var
lAxis : LongInt;
begin
lAxis := 1;
AxmCompensationEnable(lAxis, ENABLE);
end;
AxmCompensationIsEnable
Purpose
지정 축에 기구 오차 보정 테이블 기능을 적용 상태를 반환한다.
Format
C++
DWORD AxmCompensationIsEnable (long lAxisNo, DWORD *dwpEnable);
Visual Basic
Function AxmCompensationIsEnable (ByVal lAxisNo As Long, ByRef
dwpEnable As Long) As Long
Delphi
function AxmCompensationIsEnable (lAxisNo : LongInt; dwpEnable :
PDWord) : DWord; stdcall;
Parameters
[in/out] Name | [Init Value] Explanation |
---|---|
[in]lAxisNo | 채널(축) 번호(0 ~ (최대축수 – 1)) |
[out]dwEnable | 기구 오차 보정 테이블 기능 적용/해제 설정 : AXT_USE - [00h] 기능 사용하지 않음 - [01h] 기능 사용 |
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
AxmCompensationEnable 로 설정된 지정 축의보정 테이블 기능 적용 상태를 반환한다.
예제코드
C++
// 1번축의보정테이블사용유무를확인.
long lAxis = 1;
DWORD dwEnable;
AxmCompensationIsEnable(lAxis, &dwEnable );
Visual Basic
1번축의보정테이블사용유무를확인.
Dim lAxis As Long
Dim dwReturn As Long
lAxis = 1
AxmCompensationIsEnable lAxis, dwReturn
Delphi
{1번축의보정테이블사용유무를확인.}
var
dwRetEnable : Long;
lAxis : Longint;
begin
lAxis := 1;
AxmCompensationIsEnable(lAxis, @dwRetEnable);
end;
AxmCompensationOneDimSet
Purpose
1 차원 보정 테이블을 설정한다.
Format
C++
DWORD AxmCompensationOneDimSet (long lTableNo, long lSourceAxis, long
lTargetAxis, long lSize, double* dpMotorPosition, double*
dpLoadPosition);
C#
uint AxmCompensationOneDimSet (int nTableNo, int nSourceAxis, int
nTargetAxis, int nSize, double[] dpMotorPosition, double[]
dpLoadPosition);
Visual Basic
Function AxmCompensationOneDimSet (ByVal lTableNo As Integer, ByVal
lSourceAxis As Integer, ByVal lTargetAxis As Integer, ByVal lSize As
Integer, ByRef dpMotorPosition As Double, ByRef dpLoadPosition As
Double) As Long
Delphi
function AxmCompensationOneDimSet (lTableNo: LongInt; lSourceAxis:
LongInt; lTargetAxis: LongInt; lSize: LongInt; dpMotorPosition:
PDouble; dpLoadPosition: PDouble) : DWord; stdcall;
Parameters
[in/out] Name | [Init Value] Explanation |
---|---|
[in]lTableNo | 1차원 보정 테이블 번호 |
[in]lSourceAxis | 기준 축 |
[in]lTargetAxis | 목표 축 |
[in]lSize | 보정 위치 개수 |
[in]dpMotorPosition | 보정 기준 위치 |
[in]dpLoadPosition | 보정 위치 |
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
1 차원 보정 테이블을 설정한다. 기준 축에 따른 목표 축의 에러를 외부센서(레이저 인터페로미터 등)로 측정하여 보정 위치를 얻는다. 보정 위치는 (기준 위치 – 측정 위치)이다. 예를 들어서 명령 위치를 500 으로 주었을 때 측정 위치가 600 이라면 -100 을 기입한다. 아래 표와 같이 기준 위치에 따른 보정위치를 기입하면 된다.
주의사항 : 테이블 번호와 목표 축의 번호는 항상 같아야 한다. 즉, 테이블 번호는 각 축당 한 개씩 배정되 며 0번축을 보정할 때에는 테이블 번호가 0번이여야 한다.
주의사항 : 첫번째 보정 위치와 마지막 보정 위치는 항상 0이어야 한다.
예제코드
C++
// 0번 테이블에 1번축을 기준으로 한 0번축의 보정값을 설정한다.
long lTableNo, lSouceAxis, lTargetAxis, lSize;
double dMotorPosition[3], dLoadPosition[3];
lTableNo = 0;
lSouceAxis = 1;
// 테이블 번호와 같아야 한다.
lTargetAxis = 0;
lSize = 3;
dMotorPosition[0] = 0;
dMotorPosition[1] = 100;
dMotorPosition[2] = 200;
// 첫번째와 마지막 보정위치는 0이어야 한다.
dLoadPosition[0] = 0;
dLoadPosition[1] = 10;
dLoadPosition[2] = 0;
AxmCompensationOneDimSet (lTableNo, lSouceAxis, lTargetAxis, lSize, dMotorPosition,
dLoadPosition);
Visual Basic
‘0번 테이블에 1번축을 기준으로 한 0번축의 보정값을 설정한다.
Dim lTableNo As Integer
Dim lSouceAxis As Integer
Dim lTargetAxis As Integer
Dim lSize As Integer
Dim dMotorPosition(0 To 2) As Double
Dim dLoadPosition(0 To 2) As Double
// 테이블 번호와 같아야 한다.
lTargetAxis = 0
lSize = 3
dMotorPosition(0) = 0
dMotorPosition(1) = 100
dMotorPosition(2) = 200
// 첫번째와 마지막 보정위치는 0이어야 한다.
dLoadPosition(0) = 0
dLoadPosition(1) = 10
dLoadPosition(2) = 0
AxmCompensationOneDimSet lTableNo, lSouceAxis, lTargetAxis, lSize, dMotorPosition(0),
dLoadPosition(0)
Delphi
{ 0축에초기속도를확인. }
var
lTableNo: LongInt;
lSouceAxis: LongInt;
lTargetAxis: LongInt;
lSize: LongInt;
dMotorPosition: Double;
dLoadPosition: Double;
begin
// 테이블 번호와 같아야 한다.
lTargetAxis := 0;
lSize := 3;
dMotorPosition[0] := 0;
dMotorPosition[1] := 100;
dMotorPosition[2] := 200;
// 첫번째와 마지막 보정위치는 0이어야 한다.
dLoadPosition[0] := 0;
dLoadPosition[1] := 10;
dLoadPosition[2] := 0;
AxmCompensationOneDimSet (lTableNo, lSouceAxis, lTargetAxis, lSize, @dMotorPosition, @dLoadPosition);
end;
AxmCompensationOneDimGet
Purpose
1 차원 보정 테이블의 정보를 확인한다.
Format
C++
DWORD AxmCompensationOneDimGet (long lTableNo, long *lpSourceAxis,
long *lpTargetAxis, long *lpSize, double *dpMotorPosition, double
*dpLoadPosition);
C#
uint AxmCompensationOneDimGet (int nTableNo, ref int lpSourceAxis,
ref int lpTargetAxis, ref int lpSize, ref double dpMotorPosition, ref
double dpLoadPosition);
Visual Basic
Function AxmCompensationOneDimGet (ByVal lTableNo As Integer, ByRef
lpSourceAxis As Integer, ByRef lpTargetAxis As Integer, ByRef lpSize
As Integer, ByRef dpMotorPosition As Double, ByRef dpLoadPosition As
Double) As Long
Delphi
function AxmCompensationOneDimGet (lTableNo: LongInt; lpSourceAxis:
PLongInt; lpTargetAxis: PLongInt; lpSize: PLongInt; dpMotorPosition:
PDouble; dpLoadPosition: PDouble) : DWord; stdcall;
Parameters
[in/out] Name | [Init Value] Explanation |
---|---|
[in]lTableNo | 1차원 보정 테이블 번호 |
[out]lSourceAxis | 기준 축 |
[out]lTargetAxis | 목표 축 |
[out]lSize | 보정 위치 개수 |
[out]dpMotorPosition | 보정 기준 위치 |
[out]dpLoadPosition | 보정 위치 |
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
1 차원 보정 테이블의 정보를 확인한다.
예제코드
C++
// 0번 테이블에 1번축을 기준으로 한 0번축의 보정값을 설정한다.
long lTableNo, lSouceAxis, lTargetAxis, lSize;
double dMotorPosition[3], dLoadPosition[3];
lTableNo = 0;
lSouceAxis = 1;
// 테이블 번호와 같아야 한다.
lTargetAxis = 0;
lSize = 3;
dMotorPosition[0] = 0;
dMotorPosition[1] = 100;
dMotorPosition[2] = 200;
// 첫번째와 마지막 보정위치는 0이어야 한다.
dLoadPosition[0] = 0;
dLoadPosition[1] = 10;
dLoadPosition[2] = 0;
AxmCompensationOneDimSet (lTableNo, lSouceAxis, lTargetAxis, lSize, dMotorPosition, dLoadPosition);
// 설정한 보정테이블의 정보를 확인한다.
AxmCompensationOneDimGet (lTableNo, &lSouceAxis, &lTargetAxis, &lSize, dMotorPosition, dLoadPosition);
Visual Basic
‘0번 테이블에 1번축을 기준으로 한 0번축의 보정값을 설정한다.
Dim lTableNo As Integer
Dim lSouceAxis As Integer
Dim lTargetAxis As Integer
Dim lSize As Integer
Dim dMotorPosition(0 To 2) As Double
Dim dLoadPosition(0 To 2) As Double
// 테이블 번호와 같아야 한다.
lTargetAxis = 0
lSize = 3
dMotorPosition(0) = 0
dMotorPosition(1) = 100
dMotorPosition(2) = 200
// 첫번째와 마지막 보정위치는 0이어야 한다.
dLoadPosition(0) = 0
dLoadPosition(1) = 10
dLoadPosition(2) = 0
AxmCompensationOneDimSet lTableNo, lSouceAxis, lTargetAxis, lSize, dMotorPosition(0), dLoadPosition(0)
// 설정한 보정테이블의 정보를 확인한다.
AxmCompensationOneDimGet lTableNo, lSouceAxis, lTargetAxis, lSize, dMotorPosition(0), dLoadPosition(0)
Delphi
{ 0축에초기속도를확인. }
var
lTableNo: LongInt;
lSouceAxis: LongInt;
lTargetAxis: LongInt;
lSize: LongInt;
dMotorPosition: Double;
dLoadPosition: Double;
begin
// 테이블 번호와 같아야 한다.
lTargetAxis := 0;
lSize := 3;
dMotorPosition[0] := 0;
dMotorPosition[1] := 100;
dMotorPosition[2] := 200;
// 첫번째와 마지막 보정위치는 0이어야 한다.
dLoadPosition[0] := 0;
dLoadPosition[1] := 10;
dLoadPosition[2] := 0;
AxmCompensationOneDimSet (lTableNo, lSouceAxis, lTargetAxis, lSize, @dMotorPosition, @dLoadPosition);
// 설정한 보정테이블의 정보를 확인한다.
AxmCompensationOneDimGet (lTableNo, @lSouceAxis, @lTargetAxis, @lSize,
@dMotorPosition, @dLoadPosition);
end;
AxmCompensationOneDimReset
Purpose
1 차원 보정 테이블의 설정을 해제한다.
Format
C++
DWORD AxmCompensationOneDimReset (long lTableNo);
C#
uint AxmCompensationOneDimReset (int nTableNo);
Visual Basic
Function AxmCompensationOneDimReset (ByVal lTableNo As Integer) As
Integer
Delphi
function AxmCompensationOneDimReset (lTableNo: LongInt) : DWord;
stdcall;
Parameters
[in/out] Name | [Init Value] Explanation |
---|---|
[in]lTableNo | 1차원 보정 테이블 번호 |
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
1 차원 보정 테이블의 설정을 해제한다.
예제코드
C++
// 설정한 보정테이블을 해제한다.
long lTableNo = 0;
AxmCompensationOneDimReset (lTableNo);
Visual Basic
‘ 설정한 보정테이블을 해제한다.
Dim lTableNo As Integer
lTargetAxis = 0
AxmCompensationOneDimReset lTableNo
Delphi
{ 설정한 보정테이블을 해제한다.}
var
lTableNo: LongInt;
begin
lTargetAxis := 0;
AxmCompensationOneDimGet (lTableNo);
end;
AxmCompensationOneDimEnable
Purpose
1 차원 보정을 활성화/비활성화 한다.
Format
C++
DWORD AxmCompensationOneDimEnable (long lTableNo, DWORD dwEnable);
C#
uint AxmCompensationOneDimEnable (int nTableNo, uint uEnable);
Visual Basic
Function AxmCompensationOneDimEnable (ByVal lTableNo As Integer,
ByVal dwEnable As Integer) As Integer
Delphi
function AxmCompensationOneDimEnable (lTableNo: LongInt; dwEnable:
DWord) : DWord; stdcall;
Parameters
[in/out] Name | [Init Value] Explanation |
---|---|
[in]lTableNo | 1차원 보정 테이블 번호 |
[in]dwEnable | 1차원 보정 설정 : FALSE & TRUE -[00h] 1차원 보정을 사용하지 않음 -[01h] 1차원 보정을 사용함 |
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
1 차원 보정을 활성화/비활성화 한다.
예제코드
C++
// 0번 테이블에 1번축을 기준으로 한 0번축의 보정값을 설정한다.
long lTableNo, lSouceAxis, lTargetAxis, lSize;
double dMotorPosition[3], dLoadPosition[3];
DWORD dwEnable = 1;
lTableNo = 0;
lSouceAxis = 1;
// 테이블 번호와 같아야 한다.
lTargetAxis = 0;
lSize = 3;
dMotorPosition[0] = 0;
dMotorPosition[1] = 100;
dMotorPosition[2] = 200;
// 첫번째와 마지막 보정위치는 0이어야 한다.
dLoadPosition[0] = 0;
dLoadPosition[1] = 10;
dLoadPosition[2] = 0;
AxmCompensationOneDimSet (lTableNo, lSouceAxis, lTargetAxis, lSize, dMotorPosition,
dLoadPosition);
// 설정한 보정테이블을 활성화시킨다.
AxmCompensationOneDimEnable (lTableNo, dwEnable);
Visual Basic
‘0번 테이블에 1번축을 기준으로 한 0번축의 보정값을 설정한다.
Dim lTableNo As Integer
Dim lSouceAxis As Integer
Dim lTargetAxis As Integer
Dim lSize As Integer
Dim dMotorPosition(0 To 2) As Double
Dim dLoadPosition(0 To 2) As Double
Dim dwEnable As Integer
// 테이블 번호와 같아야 한다.
lTargetAxis = 0
lSize = 3
dMotorPosition(0) = 0
dMotorPosition(1) = 100
dMotorPosition(2) = 200
// 첫번째와 마지막 보정위치는 0이어야 한다.
dLoadPosition(0) = 0
dLoadPosition(1) = 10
dLoadPosition(2) = 0
dwEnable = 1
AxmCompensationOneDimSet lTableNo, lSouceAxis, lTargetAxis, lSize, dMotorPosition(0),
dLoadPosition(0)
// 설정한 보정테이블을 활성화시킨다.
AxmCompensationOneDimEnable lTableNo, dwEnable
Delphi
{ 0축에초기속도를확인. }
var
lTableNo: LongInt;
lSouceAxis: LongInt;
lTargetAxis: LongInt;
lSize: LongInt;
dMotorPosition: Double;
dLoadPosition: Double;
dwEnable: DWord;
begin
// 테이블 번호와 같아야 한다.
lTargetAxis := 0;
lSize := 3;
dMotorPosition[0] := 0;
dMotorPosition[1] := 100;
dMotorPosition[2] := 200;
// 첫번째와 마지막 보정위치는 0이어야 한다.
dLoadPosition[0] := 0;
dLoadPosition[1] := 10;
dLoadPosition[2] := 0;
dwEnable := 1;
AxmCompensationOneDimSet (lTableNo, lSouceAxis, lTargetAxis, lSize, @dMotorPosition, @dLoadPosition);
// 설정한 보정테이블을 활성화시킨다.
AxmCompensationOneDimEnable (lTableNo, dwEnable);
end;
AxmCompensationOneDimIsEnable
Purpose
1 차원 보정의 활성화/비활성화를 확인한다.
Format
C++
DWORD AxmCompensationOneDimIsEnable (long lTableNo, DWORD *dwpEnable);
C#
uint AxmCompensationOneDimIsEnable (int nTableNo, ref uint upEnable);
Visual Basic
Function AxmCompensationOneDimIsEnable (ByVal lTableNo As Integer,
ByRef dwpEnable As Integer) As Integer
Delphi
function AxmCompensationOneDimIsEnable (lTableNo: LongInt; dwpEnable:
PDWord) : DWord; stdcall;
Parameters
[in/out] Name | [Init Value] Explanation |
---|---|
[in]lTableNo | 1차원 보정 테이블 번호 |
[out]dwpEnable | 1차원 보정 설정 : FALSE & TRUE -[00h] 1차원 보정을 사용하지 않음 -[01h] 1차원 보정을 사용함 |
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
1 차원 보정의 활성화/비활성화를 확인한다.
예제코드
C++
// 설정한 보정테이블의 활성화상태를 확인한다.
long lTableNo = 0;
DWORD dwEnable;
AxmCompensationOneDimIsEnable (lTableNo, &dwEnable);
Visual Basic
‘설정한 보정테이블의 활성화상태를 확인한다.
Dim lTableNo As Integer
Dim dwEnable As Integer
lTargetAxis = 0
AxmCompensationOneDimIsEnable lTableNo, dwEnable
Delphi
{ 설정한 보정테이블의 활성화상태를 확인한다. }
var
lTableNo: LongInt;
dwEnable: DWord;
begin
lTargetAxis := 0;
AxmCompensationOneDimGet (lTableNo, @DWord);
end;
AxmCompensationOneDimGetCorrection
Purpose
현재 지령 위치에서의 1 차원 보정위치를 확인한다.
Format
C++
DWORD AxmCompensationOneDimGetCorrection (long lTableNo, double*
pdCorrection);
C#
uint AxmCompensationOneDimGetCorrection (int nTableNo, ref double
pdCorrection);
Visual Basic
Function AxmCompensationOneDimGetCorrection (ByVal lTableNo As
Integer, ByRef pdCorrection Double) As Integer
Delphi
function AxmCompensationOneDimGetCorrection (lTableNo: LongInt;
pdCorrection: Double) : DWord; stdcall;
Parameters
[in/out] Name | [Init Value] Explanation |
---|---|
[in]lTableNo | 1차원 보정 테이블 번호 |
[out]pdCorrection | 현재 지령 위치에서의 보정 위치 |
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
현재 지령 위치에서의 1 차원 보정위치를 확인한다.
예제코드
C++
// 0번 테이블의 현재위치에서의 보정위치를 확인한다.
long lTableNo = 0;
double dCorrection;
AxmCompensationOneDimGetCorrection(lTableNo, &dCorrection);
Visual Basic
‘0번 테이블의 현재위치에서의 보정위치를 확인한다.
Dim lTableNo As Integer
Dim dCorrection As Double
lTableNo = 0
AxmCompensationOneDimGetCorrection lTableNo, dCorrection
Delphi
{0번 테이블의 현재위치에서의 보정위치를 확인한다.}
var
lTableNo: LongInt;
dCorrection: Double;
begin
lTableNo := 0;
AxmCompensationOneDimGetCorrection (lTableNo, @dCorrection);
end;
3. 진동 억제 (Vibration Control)
진동 억제 기능은 전달 받은 지령입력을 입력 성형기(Input Shaper)에 의해 적절히 성형하여 출력에 나타나는 잔류 진동을 제거한다.
주의사항 : 진동 억제 기능은 ECAT-SW Type 에서만 사용할 수 있습니다.
3.1. 진동 억제 (Vibration Control) 함수 리스트
Function | Description |
---|---|
AxmMotSetVibrationControl | 진동 억제 기능을 사용하기 위한 파라미터를 설정한다. |
AxmSetVibrationControlEnable | 진동 억제 기능의 적용 유무를 설정한다. |
AxmGetVibrationControlEnable | 진동 억제 기능을 사용하기 위한 파라미터를 반환한다. |
3.2. 진동 억제 (Vibration Control) 함수 소개
AxmMotSetVibrationControl
Purpose
진동 억제 기능을 사용하기 위한 파라미터를 설정한다.
Format
C++
DWORD AxmMotSetVibrationControl(long lAxisNo, long lSize, double*
dpFrequency, double* dpDampingRatio, long* lpImpulseCount);
C#
uint AxmMotSetVibrationControl(int lAxisNo, int lSize, ref double
dpFrequency, ref double dpDampingRatio, ref int lpImpulseCount);
Visual Basic
Function AxmMotSetVibrationControl(ByVal lAxisNo As Long, ByVal lSize
As Long, ByRef dpFrequency As Double, ByRef dpDampingRatio As Double,
ByRef lpImpulseCount As Long) As Long
Delphi
function AxmMotSetVibrationControl(lAxisNo: LongInt; lSize: LongInt;
dpFrequency: PDouble; dpDampingRatio: PDouble; lpImpulseCount:
LongInt): DWord; stdcall;
Parameters
[in/out] Name | [Init Value] Explanation |
---|---|
[in]lAxisNo | Master 채널(축) 번호(0 ~ (최대 축 수 – 1)) |
[in]lSize | 진동 억제 기능 적용 개수 (1 ~ 3) |
[in]pdFrequency | 측정한 진동 주파수 (1.0 hz ~ 500.0 hz) |
[in]pdDampingRatio | 측정한 감쇠비 (0.001 ~ 0.9) |
[in]lpImpulseCount | 임펄스 개수 ( 2 ~ 10) |
Return Values
[0000] AXT_RT_SUCCESS : 함수 실행 성공
[1053] AXT_RT_NOT_OPEN : AXL 라이브러리 초기화 실패
[4152] AXT_RT_MOTION_ERROR_IN_MOTION : 사용하려는 축이 구동 중일 때
* See error code Table for more information on status error codes
Description
참고 : 기구물의 고유 진동수는 모터의 구동 거리, 속도, 가속도에 따라 다르게 측정될 수 있으므로 측정 할 때와 측정 후 해당 기능을 적용 후 구동 할 때의 거리, 속도, 가속도를 같은 조건으로 설정하여야 한다.
이 함수를 사용하여 파라미터를 설정한 후에 AxmMotVibrationControlEnable() 함수를 사용하여야 해당 기능이 적용된다.
예제코드
C++
// 0 축의 진동 억제 기능 적용 개수, 진동 주파수, 감쇠비, 임펄스 개수 설정.
AxmMotSetVibrationControl(0, 1, 14.5, 0.003, 4);
// 0 축의 진동 억제 기능 적용
AxmMotVibrationControlEnable(0, ENABLE);
// 0 축을 구동시켜 확인
AxmMoveStartPos(0, 15000, 30000, 60000, 60000);
AxmSetVibrationControlEnable
Purpose
진동 억제 기능의 적용 유무를 설정한다.
Format
C++
DWORD AxmSetVibrationControlEnable(long lAxisNo, DWORD uEnable);
C#
uint AxmSetVibrationControlEnable(int lAxisNo, uint uEnable);
Visual Basic
Function AxmSetVibrationControlEnable(ByVal lAxisNo As Long, ByVal
uEnable As Long) As Long
Delphi
function AxmSetVibrationControlEnable(lAxisNo: LongInt; uEnable:
DWord;): DWord; stdcall;
Parameters
[in/out] Name | [Init Value] Explanation |
---|---|
[in]lAxisNo | Master 채널(축) 번호(0 ~ (최대 축 수 – 1)) |
[in]uEnable | 진동 억제 기능 적용/해제 설정 -[00h] 기능 사용하지 않음 -[01h] 기능 사용 |
Return Values
[0000] AXT_RT_SUCCESS : 함수 실행 성공
[1053] AXT_RT_NOT_OPEN : AXL 라이브러리 초기화 실패
[4152] AXT_RT_MOTION_ERROR_IN_MOTION : 사용하려는 축이 구동 중일 때
* See error code Table for more information on status error codes
Description
참고 : 기구물의 고유 진동수는 모터의 구동 거리, 속도, 가속도에 따라 다르게 측정될 수 있으므로 측정 할 때와 측정 후 해당 기능을 적용 후 구동 할 때의 거리, 속도, 가속도를 같은 조건으로 설정하여야 한다.
이 함수를 사용하여 파라미터를 설정한 후에 AxmMotVibrationControlEnable() 함수를 사용하여야 해당 기능이 적용된다.
예제코드
C++
// 0 축의 진동 억제 기능 적용 개수, 진동 주파수, 감쇠비, 임펄스 개수 설정.
AxmMotSetVibrationControl(0, 1, 14.5, 0.003, 4);
// 0 축의 진동 억제 기능 적용
AxmMotVibrationControlEnable(0, ENABLE);
// 0 축을 구동시켜 확인
AxmMoveStartPos(0, 15000, 30000, 60000, 60000);
AxmGetVibrationControlEnable
Purpose
진동 억제 기능의 적용 상태를 반환한다.
Format
C++
DWORD AxmSetVibrationControlIsEnable(long lAxisNo, DWORD* upEnable);
C#
uint AxmSetVibrationControlIsEnable(int lAxisNo, ref uint upEnable);
Visual Basic
Function AxmSetVibrationControlIsEnable(ByVal lAxisNo As Long, ByRef
upEnable As Long) As Long
Delphi
function AxmSetVibrationControlIsEnable(lAxisNo: LongInt; upEnable:
PDWord;): DWord; stdcall;
Parameters
[in/out] Name | [Init Value] Explanation |
---|---|
[in]lAxisNo | Master 채널(축) 번호(0 ~ (최대 축 수 – 1)) |
[out]uEnable | 진동 억제 기능 적용/해제 설정 -[00h] 기능 사용하지 않음 -[01h] 기능 사용 |
Return Values
[0000] AXT_RT_SUCCESS : 함수 실행 성공
[1053] AXT_RT_NOT_OPEN : AXL 라이브러리 초기화 실패
[4152] AXT_RT_MOTION_ERROR_IN_MOTION : 사용하려는 축이 구동 중일 때
* See error code Table for more information on status error codes
Description
참고 : 기구물의 고유 진동수는 모터의 구동 거리, 속도, 가속도에 따라 다르게 측정될 수 있으므로 측정 할 때와 측정 후 해당 기능을 적용 후 구동 할 때의 거리, 속도, 가속도를 같은 조건으로 설정하여야 한다.
AxmMotSetVibrationControl() 함수를 사용하여 파라미터를 설정한 후에 Enable 기본 값은 [00h] 으로 설정 된다
예제코드
C++
// 0 축의 진동 억제 기능 적용 개수, 진동 주파수, 감쇠비, 임펄스 개수 설정.
AxmMotSetVibrationControl(0, 1, 14.5, 0.003, 4);
// 0 축의 진동 억제 기능 적용
AxmMotVibrationControlEnable(0, ENABLE);
// 0 축을 구동시켜 확인
AxmMoveStartPos(0, 15000, 30000, 60000, 60000);
4. Dwell
Dwell 구동은 모터가 목표 위치에 도달한 후, 사용자가 지정한 시간 동안 정지 상태를 유지하도록 하는 기능이다. 이 함수를 이용해 연속 보간 구동 중간에 일정 시간 모터를 멈추게 할 수 있다.
LineMove와 CircleMove와 같은 연속 보간 함수와 동일하게 사용한다.
4.1. Dwell 구동 함수 리스트
Function | Description |
---|---|
AxmContiDwell | 연속 보간 구동 사이에서 입력한 Dwell Time 만큼 대기하는 함수이다. |
4.2. Dwell 구동 함수 소개
AxmContiDwell
Purpose
연속 보간 구동 사이에서 입력한 Dwell Time 만큼 대기하는 함수이다.
Format
C++
DWORD AxmContiDwell(long lCoordNo, DWORD dwDwellTime);
Visual Basic
Function AxmContiDwell(lCoordNo As Integer, dwDwellTime As UInteger) As UInteger
Delphi
function AxmContiDwell(lCoordNo: LongInt; dwDwellTime: DWORD): DWORD;
Parameters
[in/out] Name | [Init Value] Explanation |
---|---|
[in]lCoordNo | 좌표계 번호 |
[in]dwDwellTime | 대기 시간[단위:usec] |
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
지정된 좌표계에 시작점, 종료점과 중심점을 지정하여 헬리컬 보간 구동하는 함수이다.
C++
long lAxes[2] = { 0, 1 };
double dEndpos1[2] = { 50000, 0 };
double dEndpos2[2] = { 0, 0};
DWORD dwReturn = AXT_RT_SUCCESS;
dwReturn = AxmSignalServoOn(0, TRUE);
dwReturn = AxmSignalServoOn(1, TRUE);
dwReturn = AxmContiSetAxisMap(0, 2, Axes);
dwReturn = AxmContiBeginNode(0);
dwReturn = AxmLineMove(0, endpos1, 10000, 10000, 10000);
dwReturn = AxmContiDwell(0, 3000000);
dwReturn = AxmLineMove(0, endpos2, 10000, 10000, 10000);
dwReturn = AxmContiEndNode(0);
dwReturn = AxmContiStart(0, 0, 0);
Visual Basic
Dim lAxes(0 To 1) As Long
Dim dEndpos1(0 To 1) As Double
Dim dEndpos2(0 To 1) As Double
Dim dwReturn As Long
lAxes(0) = 0
lAxes(1) = 1
dEndpos1(0) = 50000
dEndpos1(1) = 0
dEndpos2(0) = 0
dEndpos2(1) = 0
dwReturn = AxmSignalServoOn(0, 1) ' TRUE = 1
dwReturn = AxmSignalServoOn(1, 1)
dwReturn = AxmContiSetAxisMap(0, 2, lAxes(0))
dwReturn = AxmContiBeginNode(0)
dwReturn = AxmLineMove(0, dEndpos1(0), 10000, 10000, 10000)
dwReturn = AxmContiDwell(0, 3000000)
dwReturn = AxmLineMove(0, dEndpos2(0), 10000, 10000, 10000)
dwReturn = AxmContiEndNode(0)
dwReturn = AxmContiStart(0, 0, 0)
Delphi
var
lAxes: array[0..1] of LongInt;
dEndpos1: array[0..1] of Double;
dEndpos2: array[0..1] of Double;
dwReturn: DWORD;
begin
lAxes[0] := 0;
lAxes[1] := 1;
dEndpos1[0] := 50000;
dEndpos1[1] := 0;
dEndpos2[0] := 0;
dEndpos2[1] := 0;
dwReturn := AxmSignalServoOn(0, True);
dwReturn := AxmSignalServoOn(1, True);
dwReturn := AxmContiSetAxisMap(0, 2, @lAxes);
dwReturn := AxmContiBeginNode(0);
dwReturn := AxmLineMove(0, @dEndpos1, 10000, 10000, 10000);
dwReturn := AxmContiDwell(0, 3000000);
dwReturn := AxmLineMove(0, @dEndpos2, 10000, 10000, 10000);
dwReturn := AxmContiEndNode(0);
dwReturn := AxmContiStart(0, 0, 0);
end;
5. 헬리컬(Helix) 구동
헬리컬 보간 제어 는 2축 원호보간과 2축의 직선보간을 복합적으로 사용하는 4축 구동의 기능이다. 2축의 직 선 보간과 원호 보간이 동기 되어 수행 된다. 한번에구동할수있는함수와연속보간을동시에사용하는함수를지원 한다. 헬리컬 보간을 구동하기 위해서는 원호보간 이동은 한 보드내 4축 단위의 축으로 나눈 그룹 내에서 0 축과 1축에서 이루어 지고, 직선 보간은 2축과 3축에서 일어난다. 원호보간의 전체 이동량은 U축(4번째 축) 의 이동량과 같아지도록 AXM 내부에서 자동 계산되며, U축(4번째 축)의 이동량을 기준으로 균등하게 분배된 거리만큼 Z축이 이동한다. 헬리컬 보간중 U축은 가상축으로 사용되며, 실제 펄스를 출력하거나 거리 이동에 사용될 수 없다. 헬리컬 보간제어를 위해서는 한 보드내의 4축단위로 좌표계가 설정되어야 하는데 예를 들어 4축의 모션보드인 경우에는 X(0),Y(1),Z(2),U(3) 축으로 사용되며 8축의 모션보드인 경우에는 X(0),Y(1),Z(2),U(3)와 X2(4),Y2(5),Z2(6),U(7)을 설정해서 사용할 수 있다.
5.1. 헬리컬 구동 함수 리스트
Function | Description |
---|---|
AxmHelixCenterMove | 지정된 좌표계에 시작점, 종료점과 중심점을 지정하여 헬리컬 보간 구동하는 함수이다.AxmContiBeginNode, AxmContiEndNode와 같이사용시지정된 좌표계에 시작점, 종료점과 중심점을 지정하여 헬리컬 연속보간구동하는 함수이다. 원호 연속 보간 구동을 위해 내부 Queue에 저장하는함수이다. AxmContiStart함수를 사용해서 시작한다. (연속보간 함수와 같이 이용한다) |
AxmHelixPointMove | 지정된 좌표계에 시작점, 종료점과 반지름을 지정하여 헬리컬 보간 구동하는 함수이다.AxmContiBeginNode, AxmContiEndNode와 같이사용시지정된 좌표계에 중간점, 종료점을 지정하여 헬리컬 연속보간구동하는함수이다. 원호 연속 보간 구동을 위해 내부 Queue에 저장하는 함수이다. AxmContiStart함수를 사용해서 시작한다. (연속보간 함수와 같이 이용한다.) |
AxmHelixRadiusMove | 지정된 좌표계에 시작점, 종료점과 반지름을 지정하여 헬리컬 보간 구동하는 함수이다.AxmContiBeginNode, AxmContiEndNode와 같이사용시지정된 좌표계에 시작점, 종료점과 반지름을 지정하여 헬리컬 연속보간구동하는 함수이다. 원호 연속 보간 구동을 위해 내부 Queue에 저장하는함수이다. AxmContiStart함수를 사용해서 시작한다. (연속보간 함수와 같이 이용한다.) |
AxmHelixAngleMove | 지정된 좌표계에 시작점, 회전각도와 반지름을 지정하여 헬리컬 보간 구동하는 함수이다. AxmContiBeginNode, AxmContiEndNode와 같이사용시지정된 좌표계에 시작점, 회전각도와 반지름을 지정하여 헬리컬 연속보간구동하는 함수이다. 원호 연속 보간 구동을 위해 내부 Queue에 저장하는함수이다. AxmContiStart함수를 사용해서 시작한다. (연속보간 함수와 같이 이용한다.) |
AxmHelixPitchMove | 임의의 축을 중심으로 회전하는 헬리컬 보간 구동을 한다. |
5.2. 헬리컬 구동 함수 소개
AxmHelixCenterMove
Purpose
지정된 좌표계에 시작점, 종료점과 중심점을 지정하여 헬리컬 보간 구동하는 함수이다. 펄스 출력이 시작되는 시점에서 함수를 벗어난다.
Format
C++
DWORD AxmHelixCenterMove(long lCoord, double dCenterXPos, double
dCenterYPos, double dEndXPos, double dEndYPos, double dZPos, double
dVel, double dAccel, double dDecel, DWORD uCWDir);
Visual Basic
Function AxmHelixCenterMove(ByVal lCoord As Long, ByVal dCenterXPos
As Double, ByVal dCenterYPos As Double, ByVal dEndXPos As Double,
ByVal dEndYPos As Double, ByVal dZPos As Double, ByVal dVel As Double,
ByVal dAccel As Double, ByVal dDecel As Double, ByVal uCWDir As Long)
As Long
Delphi
function AxmHelixCenterMove(lCoord : LongInt; dCenterXPos : Double;
dCenterYPos : Double; dEndXPos : Double; dEndYPos : Double; dZPos :
Double; dVel : Double; dAccel : Double; dDecel : Double; uCWDir :
DWord): DWord; stdcall;
Parameters
[in/out] Name | [Init Value] Explanation |
---|---|
[in]lCoord | 좌표계 번호(0 ~ (최대축수 -1)) |
[in]dCenterXPos | 보간에 사용되는 채널(축) 번호(0 ~ (최대축수 - 1)) 배열 |
[in]dCenterYPos | X 축 원점 위치값 |
[in]]dEndXPos | Y 축 원점 위치값 |
[in]dEndYPos | Y 축 종료 위치값 |
[in]dZPos | Z 축 방향으로 한번에 이동할거리 |
[in]dVel | 구동 속도값(구동속도의 단위는 Unit/pulse를 1/1로 한경우에 PPS[Pulses/sec]) |
[in]dAccel | 구동 가속도(가속도의 단위는 Unit/pulse를 1/1로 한경우에 PPS[Pulses/sec^2])값 |
[in]dDecel | 구동 감속도(감속도의 단위는 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
지정된 좌표계에 시작점, 종료점과 중심점을 지정하여 헬리컬 보간 구동하는 함수이다.
AxmContiBeginNode, AxmContiEndNode와 같이사용시 지정된 좌표계에 시작점, 종료점과 중심점을 지정하여 헬리컬 연속보간 구동하는 함수이다. 원호 연속 보간 구동을 위해 내부 Queue 에 저장하는 함수이다. AxmContiStart함수를 사용해서 시작한다. (연속보간 함수와 같이 이용한다)
현재 위치는 원호 구동의 시작점이 되며 설정한 중점과 종점을 기준으로 원호 구동을 한다.
▶ AxmSStop, AxmEstop 함수에 의해 모션감속정지, 모션급정지할수있다. 인자는 반드시 Coordinate 의 마스터축을 넣어서 정지시킨다.
▶AxmStatusReadInMotion함수에 의해 모션중인지 확인할수있다.
▶AxmSignalSetInpos함수를 사용하는경우에는 Inposition 입력신호가 Enable 로 설정되어 있다면 Command 펄스 출력이 완료되도 INP 입력이 ON 되기 전까지는 모션이 완료되지 않은것으로 간주되어 반환 되지 않는다. (AxmSignalSetInpos 함수 참고)
▶주의점: 보간 하는 축은 Unit/Pulse 를 동일하게 설정한다.
▶주의점: 4 축모션 이상모션보드를 사용시
▶ 주의점 : Helix 를 연속보간 사용시 Spline, 직선보간과 원호보간을 같이 사용할수없다.
예제코드 : 일반 헬리컬 보간 구동
C++
double dVelocity = 2000, dAccel = 4000;
long lAxis[4];
long lCoordinate = 0;
for(int i=0; i<4; i++)
{
lAxis[i] = i;
}
AxmContiWriteClear(lCoordinate);
AxmContiSetAxisMap(lCoordinate, 4, lAxis);
AxmContiSetAbsRelMode(lCoordinate, 1);
AxmHelixCenterMove(lCoordinate, 500, 500, 0, 0, 100, dVelocity, dAccel, dAccel,
DIR_CW);
Visual Basic
Dim dVelocity As Double
Dim dAccel As Double
Dim lCoordinate As Long
Dim axes(0 To 3) As Long
Dim i As Long
dVelocity = 2000
dAccel = 4000
lCoordinate = 0
For i = 0 To 3
axes(i) = i
Next i
AxmContiWriteClearlCoordinate
AxmContiSetAxisMaplCoordinate, 4, axes(0)
AxmContiSetAbsRelModelCoordinate, 1
AxmHelixCenterMove lCoordinate, 500, 500, 0, 0, 100, dVelocity, dAccel, dAccel, 1
Delphi
var
dVelocity, dAccel : Double;
i : LongInt;
lAxis : array [0..3] of LongInt;
lCoordinate : LongInt;
begin
dVelocity := 2000;
dAccel := 4000;
lCoordinate := 0;
for i := 0 to 3 do
begin
lAxis[i] := i;
end;
AxmContiWriteClear(lCoordinate);
AxmContiSetAxisMap(lCoordinate, 4, @lAxis);
AxmContiSetAbsRelMode(lCoordinate, 1);
AxmHelixCenterMove(lCoordinate, 500, 500, 0, 0, 100, dVelocity, dAccel, dAccel, DIR_CW);
end;
예제코드 : 연속 헬리컬 보간 구동
C++
double dVelocity = 2000, dAccel = 4000;
long lAxis[4];
long lCoordinate = 0;
for(int i=0; i<4; i++)
{
lAxis[i] = i;
}
AxmContiWriteClear(lCoordinate);
AxmContiSetAxisMap(lCoordinate, 4, lAxis);
AxmContiSetAbsRelMode(lCoordinate, 1);
AxmContiBeginNode(lCoordinate);
AxmHelixCenterMove(lCoordinate, 500, 500, 0, 0, 100, dVelocity, dAccel, dAccel, DIR_CW);
AxmHelixCenterMove(lCoordinate, 500, 500, 0, 0, 100, dVelocity, dAccel, dAccel, DIR_CW);
AxmHelixCenterMove(lCoordinate, 500, 500, 0, 0, 100, dVelocity, dAccel, dAccel, DIR_CW);
AxmHelixCenterMove(lCoordinate, 500, 500, 0, 0, 100, dVelocity, dAccel, dAccel, DIR_CW);
AxmHelixCenterMove(lCoordinate, 500, 500, 0, 0, 100, dVelocity, dAccel, dAccel, DIR_CW);
AxmContiEndNode(lCoordinate);
AxmContiSetAbsRelMode(lCoordinate, 1);
AxmContiStart(lCoordinate , 0, 0);
Visual Basic
Dim dVelocity As Double
Dim dAccel As Double
Dim lCoordinate As Long
Dim axes(0 To 3) As Long
Dim i As Long
dVelocity = 2000
dAccel = 4000
lCoordinate = 0
For i = 0 To 3
axes(i) = i
Next i
AxmContiWriteClearlCoordinate
AxmContiSetAxisMaplCoordinate, 4, axes(0)
AxmContiSetAbsRelModelCoordinate, 1
AxmContiBeginNodelCoordinate
AxmHelixCenterMove lCoordinate, 500, 500, 0, 0, 100, dVelocity, dAccel, dAccel, 1
AxmHelixCenterMove lCoordinate, 500, 500, 0, 0, 100, dVelocity, dAccel, dAccel, 1
AxmHelixCenterMove lCoordinate, 500, 500, 0, 0, 100, dVelocity, dAccel, dAccel, 1
AxmHelixCenterMove lCoordinate, 500, 500, 0, 0, 100, dVelocity, dAccel, dAccel, 1
AxmHelixCenterMove lCoordinate, 500, 500, 0, 0, 100, dVelocity, dAccel, dAccel, 1
AxmContiEndNodelCoordinate
AxmContiSetAbsRelModelCoordinate, 1
AxmContiStartlCoordinate, 0, 0
Delphi
var
dVelocity, dAccel : Double;
i : LongInt;
lAxis : array [0..3] of LongInt;
lCoordinate : LongInt;
begin
dVelocity := 2000;
dAccel := 4000;
lCoordinate := 0;
for i := 0 to 3 do
begin
lAxis[i] := i;
end;
AxmContiWriteClear(lCoordinate);
AxmContiSetAxisMap(lCoordinate, 4, @lAxis);
AxmContiSetAbsRelMode(lCoordinate, 1);
AxmContiBeginNode(lCoordinate);
AxmHelixCenterMove(lCoordinate, 500, 500, 0, 0, 100, dVelocity, dAccel, dAccel, DIR_CW);
AxmHelixCenterMove(lCoordinate, 500, 500, 0, 0, 100, dVelocity, dAccel, dAccel, DIR_CW);
AxmHelixCenterMove(lCoordinate, 500, 500, 0, 0, 100, dVelocity, dAccel, dAccel, DIR_CW);
AxmHelixCenterMove(lCoordinate, 500, 500, 0, 0, 100, dVelocity, dAccel, dAccel, DIR_CW);
AxmHelixCenterMove(lCoordinate, 500, 500, 0, 0, 100, dVelocity, dAccel, dAccel, DIR_CW);
AxmContiEndNode(lCoordinate);
AxmContiSetAbsRelMode(lCoordinate, 1);
AxmContiStart(lCoordinate, 0, 0);
end;
AxmHelixPointMove
Purpose
지정된 좌표계에 중간점, 종료점을 지정하여 헬리컬 보간 구동하는 함수이다. 펄스 출력이 시작되는 시점에서 함수를 벗어난다.
Format
C++
DWORD AxmHelixPointMove(long lCoord, double dMidXPos, double dMidYPos,
double dEndXPos, double dEndYPos, double dZPos, double dVel, double
dAccel, double dDecel);
Visual Basic
Function AxmHelixPointMove(ByVal lCoord As Long, ByVal dMidXPos As
Double, ByVal dMidYPos As Double, ByVal dEndXPos As Double, ByVal
dEndYPos As Double, ByVal dZPos As Double, ByVal dVel As Double,
ByVal dAccel As Double, ByVal dDecel As Double) As Long
Delphi
function AxmHelixPointMove(lCoord : LongInt; dMidXPos : Double;
dMidYPos : Double; dEndXPos : Double; dEndYPos : Double; dZPos :
Double; dVel : Double; dAccel : Double; dDecel : Double): DWord;
stdcall;
Parameters
[in/out] Name | [Init Value] Explanation |
---|---|
[in]lCoord | 좌표계 번호(0 ~ (최대축수 -1)) |
[in]dMidXPos | X 축 중간 위치값 |
[in]dMidYPos | Y 축 중간 위치값 |
[in]]dEndXPos | X 축 종료 위치값 |
[in]dEndYPos | Y 축 종료 위치값 |
[in]dZPos | Z 축 방향으로 한번에 이동할거리 |
[in]dVel | 구동 속도값(구동속도의 단위는 Unit/pulse를 1/1로 한경우에 PPS[Pulses/sec]) |
[in]dAccel | 구동 가속도(가속도의 단위는 Unit/pulse를 1/1로 한경우에 PPS[Pulses/sec^2])값 |
[in]dDecel | 구동 감속도(감속도의 단위는 Unit/pulse를 1/1로 한경우에 PPS[Pulses/sec^2])값 |
Return Values
[0000] AXT_RT_SUCCESS : 함수 실행 성공
[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
지정된 좌표계에 시작점, 종료점과 중심점을 지정하여 헬리컬 보간 구동하는 함수이다.
AxmContiBeginNode, AxmContiEndNode와 같이사용시 지정된 좌표계에 시작점, 종료점과 중심점을 지정하여 헬리컬 연속보간 구동하는 함수이다. 원호 연속 보간 구동을 위해 내부 Queue 에 저장하는 함수이다. AxmContiStart함수를 사용해서 시작한다. (연속보간 함수와 같이 이용한다)
현재 위치는 원호 구동의 시작점이 되며 설정한 중점과 종점을 기준으로 원호 구동을 한다.
▶ AxmSStop, AxmEstop 함수에 의해 모션감속정지, 모션급정지할수있다. 인자는 반드시 Coordinate 의 마스터축을 넣어서 정지시킨다.
▶AxmStatusReadInMotion함수에 의해 모션중인지 확인할수있다.
▶AxmSignalSetInpos함수를 사용하는경우에는 Inposition 입력신호가 Enable 로 설정되어 있다면 Command 펄스 출력이 완료되도 INP 입력이 ON 되기 전까지는 모션이 완료되지 않은것으로 간주되어 반환 되지 않는다. (AxmSignalSetInpos 함수 참고)
▶주의점: 보간 하는 축은 Unit/Pulse 를 동일하게 설정한다. Unit/Pulse 를 똑같이 맞추지 않으면 서로 단위가 틀려진다. 반드시 똑같이 맞추어 보간제어를 한다.
▶주의점: 4 축모션 이상모션보드를 사용시
▶ 주의점 : Helix 를 연속보간 사용시 Spline, 직선보간과 원호보간을 같이 사용할수없다.
예제코드 : 일반 헬리컬 보간 구동
C++
double dVelocity = 2000, dAccel = 4000;
long lAxis[4];
long lCoordinate = 0;
for(int i=0; i<4; i++)
{
lAxis[i] = i;
}
AxmContiWriteClear(lCoordinate);
AxmContiSetAxisMap(lCoordinate, 4, lAxis);
AxmContiSetAbsRelMode(lCoordinate, 1);
AxmHelixPointMove(lCoordinate, 500, 500, 1000, 0, 100, dVelocity, dAccel, dAccel);
Visual Basic
Dim dVelocity As Double
Dim dAccel As Double
Dim lCoordinate As Long
Dim axes(0 To 3) As Long
Dim i As Long
dVelocity = 2000
dAccel = 4000
lCoordinate = 0
For i = 0 To 3
axes(i) = i
Next i
AxmContiWriteClearlCoordinate
AxmContiSetAxisMaplCoordinate, 4, axes(0)
AxmContiSetAbsRelModelCoordinate, 1
AxmHelixPointMovelCoordinate, 500, 500, 1000, 0, 100, dVelocity, dAccel, dAccel
Delphi
var
dVelocity, dAccel : Double;
i : LongInt;
lAxis : array [0..3] of LongInt;
lCoordinate : LongInt;
begin
dVelocity := 2000;
dAccel := 4000;
lCoordinate := 0;
for i := 0 to 3 do
begin
lAxis[i] := i;
end;
AxmContiWriteClear(lCoordinate);
AxmContiSetAxisMap(lCoordinate, 4, @lAxis);
AxmContiSetAbsRelMode(lCoordinate, 1);
AxmHelixPointMove(lCoordinate, 500, 500, 1000, 0, 100, dVelocity, dAccel, dAccel);
end;
예제코드 : 연속 헬리컬 보간 구동
C++
double dVelocity = 2000, dAccel = 4000;
long lAxis[4];
long lCoordinate = 0;
for(int i=0; i<4; i++)
{
lAxis[i] = i;
}
AxmContiWriteClear(lCoordinate);
AxmContiSetAxisMap(lCoordinate, 4, lAxis);
AxmContiSetAbsRelMode(lCoordinate, 1);
AxmContiBeginNode(lCoordinate);
AxmHelixPointMove(lCoordinate, 500, 500, 1000, 0, 100, dVelocity, dAccel, dAccel);
AxmHelixPointMove(lCoordinate, 500, 500, 1000, 0, 100, dVelocity, dAccel, dAccel);
AxmHelixPointMove(lCoordinate, 500, 500, 1000, 0, 100, dVelocity, dAccel, dAccel);
AxmHelixPointMove(lCoordinate, 500, 500, 1000, 0, 100, dVelocity, dAccel, dAccel);
AxmHelixPointMove(lCoordinate, 500, 500, 1000, 0, 100, dVelocity, dAccel, dAccel);
AxmContiEndNode(lCoordinate);
AxmContiSetAbsRelMode(lCoordinate, 1);
AxmContiStart(lCoordinate , 0, 0);
Visual Basic
Dim dVelocity As Double
Dim dAccel As Double
Dim lCoordinate As Long
Dim axes(0 To 3) As Long
Dim i As Long
dVelocity = 2000
dAccel = 4000
lCoordinate = 0
For i = 0 To 3
axes(i) = i
Next i
AxmContiWriteClearlCoordinate
AxmContiSetAxisMaplCoordinate, 4, axes(0)
AxmContiSetAbsRelModelCoordinate, 1
AxmContiBeginNodelCoordinate
AxmHelixPointMovelCoordinate, 500, 500, 1000, 0, 100, dVelocity, dAccel, dAccel
AxmHelixPointMovelCoordinate, 500, 500, 1000, 0, 100, dVelocity, dAccel, dAccel
AxmHelixPointMovelCoordinate, 500, 500, 1000, 0, 100, dVelocity, dAccel, dAccel
AxmHelixPointMovelCoordinate, 500, 500, 1000, 0, 100, dVelocity, dAccel, dAccel
AxmHelixPointMovelCoordinate, 500, 500, 1000, 0, 100, dVelocity, dAccel, dAccel
AxmContiEndNodelCoordinate
AxmContiSetAbsRelModelCoordinate, 1
AxmContiStartlCoordinate, 0, 0
Delphi
var
dVelocity, dAccel : Double;
i : LongInt;
lAxis : array [0..3] of LongInt;
lCoordinate : LongInt;
begin
dVelocity := 2000;
dAccel := 4000;
lCoordinate := 0;
for i := 0 to 3 do
begin
lAxis[i] := i;
end;
AxmContiWriteClear(lCoordinate);
AxmContiSetAxisMap(lCoordinate, 4, @lAxis);
AxmContiSetAbsRelMode(lCoordinate, 1);
AxmContiBeginNode(lCoordinate);
AxmHelixPointMove(lCoordinate, 500, 500, 1000, 0, 100, dVelocity, dAccel, dAccel);
AxmHelixPointMove(lCoordinate, 500, 500, 1000, 0, 100, dVelocity, dAccel, dAccel);
AxmHelixPointMove(lCoordinate, 500, 500, 1000, 0, 100, dVelocity, dAccel, dAccel);
AxmHelixPointMove(lCoordinate, 500, 500, 1000, 0, 100, dVelocity, dAccel, dAccel);
AxmHelixPointMove(lCoordinate, 500, 500, 1000, 0, 100, dVelocity, dAccel, dAccel);
AxmContiEndNode(lCoordinate);
AxmContiSetAbsRelMode(lCoordinate, 1);
AxmContiStart(lCoordinate, 0, 0);
end;
AxmHelixRadiusMove
Purpose
지정된 좌표계에 시작점, 종료점과 반지름을 지정하여 헬리컬 보간 구동하는 함수이다. 펄스 출력이 시작되는 시점에서 함수를 벗어난다.
Format
C++
DWORD AxmHelixRadiusMove(long lCoord, double dRadius, double dEndXPos,
double dEndYPos, double dZPos, double dVel, double dAccel, double
dDecel, DWORD uCWDir, DWORD uShortDistance);
Visual Basic
Function AxmHelixRadiusMove(ByVal lCoord As Long, ByVal dRadius As
Double, ByVal dEndXPos As Double, ByVal dEndYPos As Double, ByVal
dZPos As 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 AxmHelixRadiusMove(lCoord : LongInt; dRadius : Double;
dEndXPos : Double; dEndYPos : Double; dZPos : Double; dVel : Double;
dAccel : Double; dDecel : Double; uCWDir : DWord; uShortDistance :
DWord): DWord; stdcall;
Parameters
[in/out] Name | [Init Value] Explanation |
---|---|
[in]lCoord | 좌표계 번호(0 ~ (최대축수 -1)) |
[in]dRadius | 구동할 원호 반지름 |
[in]dEndXPos | X 축 종료 위치값 |
[in]]dEndYPos | Y 축 종료 위치값 |
[in]dZPos | Z 축 방향으로 한번에 이동할거리 |
[in]dVel | 구동 속도값(구동속도의 단위는 Unit/pulse를 1/1로 한경우에 PPS[Pulses/sec]) |
[in]dAccel | 구동 가속도(가속도의 단위는 Unit/pulse를 1/1로 한경우에 PPS[Pulses/sec^2])값 |
[in]dDecel | 구동 감속도(감속도의 단위는 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]짧은 거리의 원호 이동 - [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
지정된 좌표계에 시작점, 종료점과 중심점을 지정하여 헬리컬 보간 구동하는 함수이다.
AxmContiBeginNode, AxmContiEndNode와 같이사용시 지정된 좌표계에 시작점, 종료점과 중심점을 지정하여 헬리컬 연속보간 구동하는 함수이다. 원호 연속 보간 구동을 위해 내부 Queue 에 저장하는 함수이다. AxmContiStart함수를 사용해서 시작한다. (연속보간 함수와 같이 이용한다)
현재 위치는 원호 구동의 시작점이 되며 설정한 중점과 종점을 기준으로 원호 구동을 한다.
시작점과 끝점을 연결하는 특정 반지름을 가진 원호를 정의하게 되면, 두개의 중심점이 나타나는데, 이로인해 같은 회전방향이라도 두개의 경로(a,b)가 정의될 수 있다.
▶ AxmSStop, AxmEstop 함수에 의해 모션감속정지, 모션급정지할수있다. 인자는 반드시 Coordinate 의 마스터축을 넣어서 정지시킨다.
▶AxmStatusReadInMotion함수에 의해 모션중인지 확인할수있다.
▶AxmSignalSetInpos함수를 사용하는경우에는 Inposition 입력신호가 Enable 로 설정되어 있다면 Command 펄스 출력이 완료되도 INP 입력이 ON 되기 전까지는 모션이 완료되지 않은것으로 간주되어 반환 되지 않는다. (AxmSignalSetInpos 함수 참고)
▶ 보간 하는 축은 Unit/Pulse 를 동일하게 설정한다. Unit/Pulse 를 똑같이 맞추지 않으면 서로 단위가 틀려진다. 반드시 똑같이 맞추어 보간제어를 한다.
▶주의점: 4 축모션 이상모션보드를 사용시
▶ 주의점 : Helix 를 연속보간 사용시 Spline, 직선보간과 원호보간을 같이 사용할수없다.
예제코드 : 일반 헬리컬 보간 구동
C++
double dVelocity = 2000, dAccel = 4000;
long lAxis[4];
long lCoordinate = 0;
for(int i=0; i<4; i++)
{
lAxis[i] = i;
}
AxmContiWriteClear(lCoordinate);
AxmContiSetAxisMap(lCoordinate, 4, lAxis);
AxmContiSetAbsRelMode(lCoordinate, 1);
AxmHelixRadiusMove(lCoordinate, 50, 100, 0, 100, dVelocity, dAccel, dAccel, DIR_CW, SHORT_DISTANCE);
Visual Basic
Dim dVelocity As Double
Dim dAccel As Double
Dim lCoordinate As Long
Dim axes(0 To 3) As Long
Dim i As Long
dVelocity = 2000
dAccel = 4000
lCoordinate = 0
For i = 0 To 3
axes(i) = i
Next i
AxmContiWriteClearlCoordinate
AxmContiSetAxisMaplCoordinate, 4, axes(0)
AxmContiSetAbsRelModelCoordinate, 1
AxmHelixRadiusMovelCoordinate, 50, 100, 0, 100, dVelocity, dAccel, dAccel, DIR_CW, SHORT_DISTANCE
Delphi
var
dVelocity, dAccel : Double;
i : LongInt;
lAxis : array [0..3] of LongInt;
lCoordinate : LongInt;
begin
dVelocity := 2000;
dAccel := 4000;
lCoordinate := 0;
for i := 0 to 3 do
begin
lAxis[i] := i;
end;
AxmContiWriteClear(lCoordinate);
AxmContiSetAxisMap(lCoordinate, 4, @lAxis);
AxmContiSetAbsRelMode(lCoordinate, 1);
AxmHelixRadiusMove(lCoordinate, 50, 100, 0, 100, dVelocity, dAccel, dAccel, DIR_CW, SHORT_DISTANCE);
end;
예제코드 : 연속 헬리컬 보간 구동
C++
double dVelocity = 2000, dAccel = 4000;
long lAxis[4];
long lCoordinate = 0;
for(int i=0; i<4; i++)
{
lAxis[i] = i;
}
AxmContiWriteClear(lCoordinate);
AxmContiSetAxisMap(lCoordinate, 4, lAxis);
AxmContiSetAbsRelMode(lCoordinate, 1);
AxmContiBeginNode(lCoordinate);
AxmHelixRadiusMove(lCoordinate, 50, 100, 0, 100, dVelocity, dAccel, dAccel, DIR_CW, SHORT_DISTANCE);
AxmHelixRadiusMove(lCoordinate, 50, 100, 0, 100, dVelocity, dAccel, dAccel, DIR_CW, SHORT_DISTANCE);
AxmHelixRadiusMove(lCoordinate, 50, 100, 0, 100, dVelocity, dAccel, dAccel, DIR_CW, SHORT_DISTANCE);
AxmHelixRadiusMove(lCoordinate, 50, 100, 0, 100, dVelocity, dAccel, dAccel, DIR_CW, SHORT_DISTANCE);
AxmHelixRadiusMove(lCoordinate, 50, 100, 0, 100, dVelocity, dAccel, dAccel, DIR_CW, SHORT_DISTANCE);
AxmContiEndNode(lCoordinate);
AxmContiSetAbsRelMode(lCoordinate, 1);
AxmContiStart(lCoordinate , 0, 0);
Visual Basic
Dim dVelocity As Double
Dim dAccel As Double
Dim lCoordinate As Long
Dim axes(0 To 3) As Long
Dim i As Long
dVelocity = 2000
dAccel = 4000
lCoordinate = 0
For i = 0 To 3
axes(i) = i
Next i
AxmContiWriteClearlCoordinate
AxmContiSetAxisMaplCoordinate, 4, axes(0)
AxmContiSetAbsRelModelCoordinate, 1
AxmContiBeginNodelCoordinate
AxmHelixRadiusMovelCoordinate, 50, 100, 0, 100, dVelocity, dAccel, dAccel, DIR_CW, SHORT_DISTANCE
AxmHelixRadiusMovelCoordinate, 50, 100, 0, 100, dVelocity, dAccel, dAccel, DIR_CW, SHORT_DISTANCE
AxmHelixRadiusMovelCoordinate, 50, 100, 0, 100, dVelocity, dAccel, dAccel, DIR_CW, SHORT_DISTANCE
AxmHelixRadiusMovelCoordinate, 50, 100, 0, 100, dVelocity, dAccel, dAccel, DIR_CW, SHORT_DISTANCE
AxmHelixRadiusMovelCoordinate, 50, 100, 0, 100, dVelocity, dAccel, dAccel, DIR_CW, SHORT_DISTANCE
AxmContiEndNodelCoordinate
AxmContiSetAbsRelModelCoordinate, 1
AxmContiStartlCoordinate, 0, 0
Delphi
var
dVelocity, dAccel : Double;
i : LongInt;
lAxis : array [0..3] of LongInt;
lCoordinate : LongInt;
begin
dVelocity := 2000;
dAccel := 4000;
lCoordinate := 0;
for i := 0 to 3 do
begin
lAxis[i] := i;
end;
AxmContiWriteClear(lCoordinate);
AxmContiSetAxisMap(lCoordinate, 4, @lAxis);
AxmContiSetAbsRelMode(lCoordinate, 1);
AxmContiBeginNode(lCoordinate);
AxmHelixRadiusMove(lCoordinate, 50, 100, 0, 100, dVelocity, dAccel, dAccel, DIR_CW, SHORT_DISTANCE);
AxmHelixRadiusMove(lCoordinate, 50, 100, 0, 100, dVelocity, dAccel, dAccel, DIR_CW, SHORT_DISTANCE);
AxmHelixRadiusMove(lCoordinate, 50, 100, 0, 100, dVelocity, dAccel, dAccel, DIR_CW, SHORT_DISTANCE);
AxmHelixRadiusMove(lCoordinate, 50, 100, 0, 100, dVelocity, dAccel, dAccel, DIR_CW, SHORT_DISTANCE);
AxmHelixRadiusMove(lCoordinate, 50, 100, 0, 100, dVelocity, dAccel, dAccel, DIR_CW, SHORT_DISTANCE);
AxmContiEndNode(lCoordinate);
AxmContiSetAbsRelMode(lCoordinate, 1);
AxmContiStart(lCoordinate, 0, 0);
end;
AxmHelixAngleMove
Purpose
지정된 좌표계에 시작점, 종료점과 반지름을 지정하여 헬리컬 보간 구동하는 함수이다. 펄스 출력이 시작되는 시점에서 함수를 벗어난다.
Format
C++
DWORD AxmHelixAngleMove(long lCoord, double dCenterXPos, double
dCenterYPos, double dAngle, double dZPos, double dVel, double dAccel,
double dDecel, DWORD uCWDir);
Visual Basic
Function AxmHelixAngleMove(ByVal lCoord As Long, ByVal dCenterXPos As
Double, ByVal dCenterYPos As Double, ByVal dAngle As Double, ByVal
dZPos As Double, ByVal dVel As Double, ByVal dAccel As Double, ByVal
dDecel As Double, ByVal uCWDir As Long) As Long
Delphi
function AxmHelixAngleMove(lCoord : LongInt; dCenterXPos : Double;
dCenterYPos : Double; dAngle : Double; dZPos : Double; dVel : Double;
dAccel : Double; dDecel : Double; uCWDir : DWord): DWord; stdcall;
Parameters
[in/out] Name | [Init Value] Explanation |
---|---|
[in]lCoord | 좌표계 번호(0 ~ (최대축수 -1)) |
[in]dCenterXPos | X 축 중심 위치값 |
[in]dCenterYPos | Y 축 중심 위치값 |
[in]]dAngle | 구동할 원호 회전각도 값 |
[in]dZPos | Z 축 방향으로 한번에 이동할거리 |
[in]dVel | 구동 속도값(구동속도의 단위는 Unit/pulse를 1/1로 한경우에 PPS[Pulses/sec]) |
[in]dAccel | 구동 가속도(가속도의 단위는 Unit/pulse를 1/1로 한경우에 PPS[Pulses/sec^2])값 |
[in]dDecel | 구동 감속도(감속도의 단위는 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
지정된 좌표계에 시작점, 회전각도와 반지름을 지정하여 헬리컬 보간 구동하는 함수이다
AxmContiBeginNode, AxmContiEndNode와 같이사용시 지정된 좌표계에 시작점, 종료점과 중심점을 지정하여 헬리컬 연속보간 구동하는 함수이다. 원호 연속 보간 구동을 위해 내부 Queue 에 저장하는 함수이다. AxmContiStart함수를 사용해서 시작한다. (연속보간 함수와 같이 이용한다)
현재 위치는 원호 구동의 시작점이 되며 종점을 기준으로 설정한 각도만큼 원호 구동을 한다.
▶ AxmSStop, AxmEstop 함수에 의해 모션감속정지, 모션급정지할수있다. 인자는 반드시 Coordinate 의 마스터축을 넣어서 정지시킨다.
▶AxmStatusReadInMotion함수에 의해 모션중인지 확인할수있다.
▶AxmSignalSetInpos함수를 사용하는경우에는 Inposition 입력신호가 Enable 로 설정되어 있다면 Command 펄스 출력이 완료되도 INP 입력이 ON 되기 전까지는 모션이 완료되지 않은것으로 간주되어 반환 되지 않는다. (AxmSignalSetInpos 함수 참고)
▶ 보간 하는 축은 Unit/Pulse 를 동일하게 설정한다. Unit/Pulse 를 똑같이 맞추지 않으면 서로 단위가 틀려진다. 반드시 똑같이 맞추어 보간제어를 한다.
▶주의점: 4 축모션 이상모션보드를 사용시
▶ 주의점 : Helix 를 연속보간 사용시 Spline, 직선보간과 원호보간을 같이 사용할수없다.
예제코드 : 일반 헬리컬 보간 구동
C++
double dVelocity = 2000, dAccel = 4000;
long lAxis[4];
long lCoordinate = 0;
for(int i=0; i<4; i++)
{
lAxis[i] = i;
}
AxmContiWriteClear(lCoordinate);
AxmContiSetAxisMap(lCoordinate, 4, lAxis);
AxmContiSetAbsRelMode(lCoordinate, 1);
AxmHelixAngleMove(lCoordinate, 500, 500, 360, 100, dVelocity, dAccel, dAccel, DIR_CW);
Visual Basic
Dim dVelocity As Double
Dim dAccel As Double
Dim lCoordinate As Long
Dim axes(0 To 3) As Long
Dim i As Long
dVelocity = 2000
dAccel = 4000
lCoordinate = 0
For i = 0 To 3
axes(i) = i
Next i
AxmContiWriteClearlCoordinate
AxmContiSetAxisMaplCoordinate, 4, axes(0)
AxmContiSetAbsRelMode lCoordinate, 1
AxmHelixAngleMovelCoordinate, 500, 500, 360, 100, dVelocity, dAccel, dAccel, DIR_CW
Delphi
var
dVelocity, dAccel : Double;
i : LongInt;
lAxis : array [0..3] of LongInt;
lCoordinate : LongInt;
begin
dVelocity := 2000;
dAccel := 4000;
lCoordinate := 0;
for i := 0 to 3 do
begin
lAxis[i] := i;
end;
AxmContiWriteClear(lCoordinate);
AxmContiSetAxisMap(lCoordinate, 4, @lAxis);
AxmContiSetAbsRelMode(lCoordinate, 1);
AxmHelixAngleMove(lCoordinate, 500, 500, 360, 100, dVelocity, dAccel, dAccel, DIR_CW);
end;
예제코드 : 연속 헬리컬 보간 구동
C++
double dVelocity = 2000, dAccel = 4000;
long lAxis[4];
long lCoordinate = 0;
for(int i=0; i<4; i++)
{
lAxis[i] = i;
}
AxmContiWriteClear(lCoordinate);
AxmContiSetAxisMap(lCoordinate, 4, lAxis);
AxmContiSetAbsRelMode(lCoordinate, 1);
AxmContiBeginNode(lCoordinate);
AxmHelixAngleMove(lCoordinate, 500, 500, 360, 100, dVelocity, dAccel, dAccel, DIR_CW);
AxmHelixAngleMove(lCoordinate, 500, 500, 360, 100, dVelocity, dAccel, dAccel, DIR_CW);
AxmHelixAngleMove(lCoordinate, 500, 500, 360, 100, dVelocity, dAccel, dAccel, DIR_CW);
AxmHelixAngleMove(lCoordinate, 500, 500, 360, 100, dVelocity, dAccel, dAccel, DIR_CW);
AxmHelixAngleMove(lCoordinate, 500, 500, 360, 100, dVelocity, dAccel, dAccel, DIR_CW);
AxmContiEndNode(lCoordinate);
AxmContiSetAbsRelMode(lCoordinate, 1);
AxmContiStart(lCoordinate , 0, 0);
Visual Basic
Dim dVelocity As Double
Dim dAccel As Double
Dim lCoordinate As Long
Dim axes(0 To 3) As Long
Dim i As Long
dVelocity = 2000
dAccel = 4000
lCoordinate = 0
For i = 0 To 3
axes(i) = i
Next i
AxmContiWriteClearlCoordinate
AxmContiSetAxisMaplCoordinate, 4, axes(0)
AxmContiSetAbsRelMode lCoordinate, 1
AxmContiBeginNode lCoordinate
AxmHelixAngleMovelCoordinate, 500, 500, 360, 100, dVelocity, dAccel, dAccel, DIR_CW
AxmHelixAngleMovelCoordinate, 500, 500, 360, 100, dVelocity, dAccel, dAccel, DIR_CW
AxmHelixAngleMovelCoordinate, 500, 500, 360, 100, dVelocity, dAccel, dAccel, DIR_CW
AxmHelixAngleMovelCoordinate, 500, 500, 360, 100, dVelocity, dAccel, dAccel, DIR_CW
AxmHelixAngleMovelCoordinate, 500, 500, 360, 100, dVelocity, dAccel, dAccel, DIR_CW
AxmContiEndNode lCoordinate
AxmContiSetAbsRelMode lCoordinate, 1
AxmContiStart lCoordinate, 0, 0
Delphi
var
dVelocity, dAccel : Double;
i : LongInt;
lAxis : array [0..3] of LongInt;
lCoordinate : LongInt;
begin
dVelocity := 2000;
dAccel := 4000;
lCoordinate := 0;
for i := 0 to 3 do
begin
lAxis[i] := i;
end;
AxmContiWriteClear(lCoordinate);
AxmContiSetAxisMap(lCoordinate, 4, @lAxis);
AxmContiSetAbsRelMode(lCoordinate, 1);
AxmContiBeginNode(lCoordinate);
AxmHelixAngleMove(lCoordinate, 500, 500, 360, 100, dVelocity, dAccel, dAccel, DIR_CW);
AxmHelixAngleMove(lCoordinate, 500, 500, 360, 100, dVelocity, dAccel, dAccel, DIR_CW);
AxmHelixAngleMove(lCoordinate, 500, 500, 360, 100, dVelocity, dAccel, dAccel, DIR_CW);
AxmHelixAngleMove(lCoordinate, 500, 500, 360, 100, dVelocity, dAccel, dAccel, DIR_CW);
AxmHelixAngleMove(lCoordinate, 500, 500, 360, 100, dVelocity, dAccel, dAccel, DIR_CW);
AxmContiEndNode(lCoordinate);
AxmContiSetAbsRelMode(lCoordinate, 1);
AxmContiStart(lCoordinate, 0, 0);
end;
AxmHelixPitchMove
Purpose
임의의 축을 중심으로 회전하는 헬리컬 보간 구동을 한다.
Format
C++
DWORD AxmHelixPitchMove (long lCoordNo, double *dpFirstCenterPos,
double *dpSecondCenterPos, double dPitch, double dTraverseDistance,
double dVel, double dAccel, double dDecel, DWORD uCWDir);
C#
uint AxmHelixPitchMove (int nCoordNo, double[] dpFirstCenterPos,
double[] dpSecondCenterPos, double dPitch, double dTraverseDistance,
double dVel, double dAccel, double dDecel, uint uCWDir);
Visual Basic
Function AxmHelixPitchMove (ByVal lCoordNo As Integer, ByRef
dpFirstCenterPos As Double, ByRef dpSecondCenterPos As Double, ByVal
dPitch As Double, ByVal dTraverseDistance As Double, ByVal dVel As
Double, ByVal dAccel As Double, ByVal dDecel As Double, ByVal uCWDir
As Integer) As Integer
Delphi
function AxmHelixPitchMove (lCoordNo: LongInt; dpFirstCenterPos:
PDouble; dpSecondCenterPos: PDouble; dPitch: Double;
dTraverseDistance: Double; dVel: Double; dAccel: Double; dDecel:
Double; uCWDir: DWord) : DWord; stdcall;
Parameters
[in/out] Name | [Init Value] Explanation |
---|---|
[in]lCoordNo | 좌표계번호(0~7) |
[in]dpFirstCenterPos | 첫번째 중심위치 |
[in]dpSecondCenterPos | 두번째 중심위치 |
[in]dPitch | 1회전당 이동량(mm) |
[in]]dTraverseDistance | 이동량(mm) |
[in]dVel | 구동 속도값(구동속도의 단위는 Unit/pulse를 1/1로 한경우에 PPS[Pulses/sec]) |
[in]dAccel | 구동 가속도(가속도의 단위는 Unit/pulse를 1/1로 한경우에 PPS[Pulses/sec^2])값 |
[in]dDecel | 구동 감속도(감속도의 단위는 Unit/pulse를 1/1로 한경우에 PPS[Pulses/sec^2])값 |
[in]uCWDir | 원호 방향: AXT_MOTION_MOVE_DIR_DEF - [00h]시계방향 - [01h]반시계방향 |
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
임의의 축을 기준으로 헬리컬 보간 구동을 한다. 두개의 중심 위치를 잇는 선이 회전축이 된다. 현재의 위치와 첫번째 중심위치를 잇는 선이 반지름이 되며 두번째 중심위치로 진행하는 구동을 한다. 회전방향은 첫번째 중심위치에서 두번째 중심위치를 바라보는 방향으로 반시계 또는 시계방향이 된다.
▶주의사항 : 첫번째 중심위치와 현재의 위치를 잇는 선은 중심축과 수직이어야 한다. 수직이 아니라면 구동 을 할 수 없다.
C++
// 0번 좌표계를 기준으로 한 헬리컬 보간 구동을 한다.
long lCoordNo
double dFirstCenterPos[3], dSecondCenterPos[3], , dTraverseDistance;
double dVel, dAcccel, dDecel;
DWORD uCWDir;
lCoordNO = 0;
dFirstCenterPos[0] = 0;
dFirstCenterPos[1] = 0;
dFirstCenterPos[2] = 0;
dSecondCenterPos[0] = 1000;
dSecondCenterPos[1] = 1000;
dSecondCenterPos[2] = 1000;
dPitch = 10;
dTraverseDistance = 1000;
dVel = 100;
dAcccel = 1000;
dDecel = 1000;
uCWDir = 0;
AxmHelixPitchMove (lCoordNO, dFirstCenterPos, dSecondCenterPos, dPitch, dTraverseDistance, dVel, dAcccel, dDecel, uCWDir);
Visual Basic
‘ 0번 좌표계를 기준으로 한 헬리컬 보간 구동을 한다.
Dim lCoordNo As Integer
Dim dFirstCenterPos(0 To 2) As Double
Dim dSecondCenterPos(0 To 2) As Double
Dim dTraverseDistance As Double
Dim dVel As Double
Dim dAcccel As Double
Dim dDecel As Double
Dim uCWDir As Integer
lCoordNO = 0
dFirstCenterPos(0) = 0
dFirstCenterPos(1) = 0
dFirstCenterPos(2) = 0
dSecondCenterPos(0) = 1000
dSecondCenterPos(1) = 1000
dSecondCenterPos(2) = 1000
dPitch = 10
dTraverseDistance = 1000
dVel = 100
dAcccel = 1000
dDecel = 1000
uCWDir = 0
AxmHelixPitchMove lCoordNO, dFirstCenterPos(0), dSecondCenterPos(0), dPitch, dTraverseDistance, dVel, dAcccel, dDecel, uCWDir
Delphi
{ 0번 좌표계를 기준으로 한 헬리컬 보간 구동을 한다. }
var
lCoordNo: LongInt;
dFirstCenterPos: array [0..2] of Double;
dSecondCenterPos: array [0..2] of Double;
dTraverseDistance: Double;
dVel: Double;
dAcccel: Double;
dDecel: Double;
uCWDir: DWord;
begin
dFirstCenterPos[0] := 0
dFirstCenterPos[1] := 0
dFirstCenterPos[2] := 0
dSecondCenterPos[0] := 1000
dSecondCenterPos[1] := 1000
dSecondCenterPos[2] := 1000
dPitch := 10
dTraverseDistance := 1000
dVel := 100
dAcccel := 1000
dDecel := 1000
uCWDir := 0
AxmHelixPitchMove (lCoordNO, @dFirstCenterPos, @dSecondCenterPos, dPitch,
dTraverseDistance, dVel, dAcccel, dDecel, uCWDir);
end;
6. 스플라인(Spline) 구동
스플라인 보간 제어란 입력한 좌표들을 자동으로 연결하는 기능으로 B Spline 보간 알고리즘을 사용하여 이 루어 진다. B Spline 보간을 사용하면 아래와 같은 그림으로 사용자가 지정하는 데이터 포인트 점들을 자유곡 선으로 변환하여 보간할 수 있다. 이 보간을 직접 모션으로 구동하기 위해서는 연속보간 모션기능과 같이 사 용하여야 한다. 기본 X축, Y축, Z축 까지 지원한다. 4축 모션보드인 경우 X(0),Y(1),Z(2),U(3)중 3개 축을 선 택해서 사용 할 수 있으며 8축 모션보드인 경우 한 칩내에서 X(0),Y(1),Z(2),U(3)중 3개 축을 선택 가능하고 다른 칩내에서 X(4),Y(5),Z(6),U(7)중 3개 축을 선택해서 사용 가능하다.
6.1. 스플라인 구동 함수 리스트
Function | Description |
---|---|
AxmSplineWrite | AxmContiBeginNode, AxmContiEndNode와 같이사용한다. 스플라인 연속 보간 구동하는 함수이다. 원호 연속 보간 구동을 위해 내부 Queue에저장하는 함수이다. AxmContiStart함수를 사용해서 시작한다. (연속보간함수와 같이 이용한다.) |
6.2. 스플라인 구동 함수 소개
AxmSplineWrite
Purpose
사용자가 입력한 Pos Point 를 기반으로 B Spline 보간을 수행하여 생성된 곡선 데이터를 사용자가 지정한 배열에 넣어 구동시킵니다. 이 함수는 2 축 , 3 축 스플라인을 지원하며 AxmContiStart 함수와 같이 사용한다.
Format
C++
DWORD AxmSplineWrite(long lCoord, long lPosSize, double *dpPosX,
double *dpPosY, double dVel, double dAccel, double dDecel, double
dPosZ, long lPointFactor);
Visual Basic
Function AxmSplineWrite(ByVal lCoord As Long, ByVal lPosSize As Long,
ByRef dpPosXAs Double, ByRef dpPosYAs Double, ByVal dVel As Double,
ByVal dAccel As Double, ByVal dDecel As Double, ByVal dPosZ As Double,
ByVal lPointFactor As Long) As Long
Delphi
function AxmSplineWrite(lCoord : LongInt; lPosSize : LongInt; dpPosX:
PDouble; dpPosY: PDouble; dVel : Double; dAccel : Double; dDecel :
Double; dPosZ : Double; lPointFactor: LongInt): DWord; stdcall;
Parameters
[in/out] Name | [Init Value] Explanation |
---|---|
[in]lCoordNo | 좌표계 번호(0 ~ (최대축수 - 1)) |
[in]lPosSize | 이동시키는 Point 점의 개수(최소 3개 이상) |
[in]dpPosX | 이동시키는 X 의 위치값 배열 |
[in]dpPosY | 이동시키는 Y 의 위치값 배열 |
[in]]dVel | 이동 속도값(구동속도의 단위는 Unit/pulse를 1/1로 한경우에 PPS[Pulses/sec]) |
[in]dAccel | 이동 가속도(가속도의 단위는 Unit/pulse를 1/1로 한경우에 PPS[Pulses/sec^2])값 |
[in]dDecel | 이동 감속도(감속도의 단위는 Unit/pulse를 1/1로 한경우에 PPS[Pulses/sec^2])값 |
[in]dPosZ | Z축 사용시 각위치에대한 +Z값기본 0으로 설정됨.,3차원 스플라인 사용시 사용함 |
[in]lPointFactor | Point 점의 Factor 최소 10 이상Factor에 따라서 점의 길이 달라진다. |
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
스플라인 보간 기능은 사용자가 지정한 포인트들을 기반으로 BSpline 보간기법을 사용하여 자유곡선 포인트들을 자동으로 생성해주는 기능이다. 이를 직접 모션으로 구동하기 위해 연속보간과 함께 사용하여야 한다.
▶AxmStatusReadInMotion 함수에 의해 모션중인지 확인할수있다.
▶AxmSignalSetInpos 함수를 사용하는경우에는 Inposition 입력신호가 Enable 로 설정되어 있다면 Command 펄스 출력이 완료해도 INP 입력이 ON 되기 전까지는 모션이 완료되지 않은것으로 간주되어 반환 되지 않는다. (AxmSignalSetInpos 함수 참고)
▶주의점: 보간 하는 축은 Unit/Pulse 를 동일하게 설정한다. Unit/Pulse 를 똑같이 맞추지 않으면 서로 단위가 틀려진다. 반드시 똑같이 맞추어 보간제어를 한다.
▶주의점: 4 축모션 이상모션보드를 사용시
▶ 주의점 : Spline 를 연속보간 사용시 Helix , 직선보간과 원호보간을 같이 사용할수없다.
C++
double dVelocity = 2000, dAccel = 4000;
long lAxis[3];
double dPosX[5];
double dPosY[5];
double dPosZ[5];
int iSize = 3;
long lCoordinate = 0;
for(int i=0; i<3; i++)
{
lAxis[i] = i;
}
AxmContiWriteClear(lCoordinate);
AxmContiSetAxisMap(lCoordinate, 3, lAxis);
AxmContiSetAbsRelMode(lCoordinate, 0);
dPosX[0] = 0 , dPosY[0] = 0;
dPosX[1] = 450, dPosY[1] = 100;
dPosX[2] = 750, dPosY[2] = 450;
dPosX[3] = 1080, dPosY[3] = 750;
dPosX[4] = 1300, dPosY[4] = 700;
AxmContiBeginNode(lCoordinate);
AxmSplineWrite(lCoordinate, 5, dPosX, dPosY, dVelocity, dAccel, dAccel, 1, 100);
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 dPosX(0 To 4) As Double
Dim dPosY(0 To 4) As Double
Dim dPosZ(0 To 4) As Double
Dim axes(0 To 2) As Long
Dim i As Long
dVelocity = 2000
dAccel = 4000
lCoordinate = 0
For i = 0 To 2
axes(i) = i
Next i
lCoordinate = 0
AxmContiWriteClearlCoordinate
AxmContiSetAxisMaplCoordinate, 3, axes(0)
AxmContiSetAbsRelModelCoordinate, 0
dPosX(0) = 0: dPosY(0) = 0
dPosX(1) = 450: dPosY(1) = 100
dPosX(2) = 750: dPosY(2) = 450
dPosX(3) = 1080: dPosY(3) = 750
dPosX(4) = 1300: dPosY(4) = 700
AxmContiBeginNodelCoordinate
AxmSplineWrite lCoordinate, 5, dPosX(0), dPosY(0), dVelocity, dAccel, dAccel, 1, 100
AxmContiEndNodelCoordinate
AxmContiSetAbsRelModelCoordinate, 0
AxmContiStartlCoordinate, 0, 0
AxmContiSetAxisMaplCoordinate, 4, axes(0)
AxmContiSetAbsRelModelCoordinate, 1
AxmHelixAngleMovelCoordinate, 500, 500, 360, 100, dVelocity, dAccel, dAccel, DIR_CW
Delphi
var
i : LongInt;
dVelocity, dAccel : Double;
lAxis : array [0..2] of LongInt;
dPosX : array [0..4] of Double;
dPosY : array [0..4] of Double;
lCoordinate : LongInt;
begin
dVelocity := 2000;
dAccel := 4000;
lCoordinate := 0;
for i := 0 to 2 do
begin
lAxis[i] := i;
end;
AxmContiWriteClear(lCoordinate);
AxmContiSetAxisMap(lCoordinate, 3, @lAxis);
AxmContiSetAbsRelMode(lCoordinate, 0);
dPosX[0] := 0; dPosY[0] := 0;
dPosX[1] := 450; dPosY[1] := 240;
dPosX[2] := 750; dPosY[2] := 610;
dPosX[3] := 1080; dPosY[3] := 500;
dPosX[4] := 1300; dPosY[4] := 800;
AxmContiBeginNode(lCoordinate);
AxmSplineWrite(lCoordinate, 5, @dPosX, @dPosY, dVelocity, dAccel, dAccel, 1, 100);
AxmContiEndNode(lCoordinate);
AxmContiSetAbsRelMode(lCoordinate, 0);
AxmContiStart(lCoordinate, 0, 0);
end;