cmmIxxHelOnce¶
SYNOPSIS¶
VT_I4 cmmIxxHelOnce(
[in] VT_I4 HelId, [in] VT_I4 NumAxes, [in] VT_PI4 AxisList,
[in] VT_PR8 CoordList, [in] VT_R8 ArcAngle, [out] VT_PR8 DistU,
[in] VT_I4 IsBlocking)
DESCRIPTION¶
2 축 원호보간과 1 축 또는 2 축 직선보간을 동시에 시작하고 동시에 종료하는 헬리컬보간 구동을 시작합니다. cmmIxxHelOnce() 함수는 모션이 완료되기 전까지 반환되지 않으며, cmmIxxHelOnceStart() 함수는 모션을 시작시킨 후에 바로 반환됩니다.
헬리컬보간 구동에서 원호보간 이동은 그 속도와 이동량이 U 축(4 축 모션보드인 경우 Axis3, 8 축 모션보드인 경우 Axis3 또는 Axis7)과 동기되어 움직입니다. 따라서 U 축은 헬리컬보간에서 반드시 포함되어야 하며, 채널리스트의 마지막 축이 반드시 U 축으로 설정되어야 합니다. 그리고 U 축은 원호보간과 동기되어 움직이므로 이송량이 자동으로 결정됩니다.
원호보간을 위한 2 축과 Z 축은 4 축 모션보드인 경우에 CH0, CH1, CH2 그리고 8 축 모션보드인 경우에 CH0, CH1, CH2 축 중에서, 혹은 CH4, CH5, CH6 축 중에서 임의로 조합하여 사용할 수 있습니다. 이 때에 CH0~2, CH4~6 이 각각의 그룹으로서 서로 교차하여 조합할 수는 없습니다.
PARAMETER¶
HelId : 이송하고자 하는 헬리컬 보간 이송 작업의 아이디를 지정합니다. CMMSDK 는 통합라이브러리이므로 여러 개의 보드가 장착되어 있는 경우에 여러 개의 헬리컬 보간 작업을 동시에 수행할 수도 있습니다. 따라서 각각의 작업을 구분지어줄 아이디가 필요합니다. cmmIxxHelOnceSetSpeed()의 헬리컬 이송 속도를 설정하는 함수도 HelId 를 입력하게 되어 있는데, 동일한 HelId 로 설정한 속도 패턴이 적용되게 됩니다.
nNumAxes : 헬리컬보간에 사용되는 축 수. 이 값은 3 또는 4 이어야 합니다.
nAxisList : 헬리컬보간에 사용되는 축 배열의 주소값. 이 배열의 마지막 Element 값은 4 축 모션 보드인 경우에는 반드시 3 이어야 하며 8 축 모션 보드인 경우에는 반드시 3 또는 7 이어야 합니다. 이 배열의 구성은 다음과 같이 하면 됩니다.
nAxisList[0] : 원호보간의 X 축. nAxisList[1] : 원호보간의 Y 축. nAxisList[2] : Z 축 (3 축만 사용하는 경우에는 U 축) nAxisList[3] : U 축 (3 축만 사용하는 경우에는 이 매개 변수는 사용안함)
CoordList : 좌표 배열 주소. 3 축을 사용하는 경우와 4 축을 사용하는 경우에 이 배열의 구성은 다음과 같이 하면 됩니다.
□ 3 축을 사용하는 경우 nCoordList[0] : 원호 중심의 X 상대좌표값 nCoordList[1] : 원호 중심의 Y 상대좌표값 nCoordList[2] : U 축 방향 (0 또는 음수: 음의 방향, 양수: 양의 방향)
□ 4 축을 사용하는 경우 nCoordList[0] : 원호 중심의 X 상대좌표값 nCoordList[1] : 원호 중심의 Y 상대좌표값 nCoordList[2] : Z 축 이동거리(상대좌표) nCoordList[3] : U 축 방향 (0 또는 음수: 음의 방향, 양수: 양의 방향)
ArcAngle : 원호보간 이동 각도. 이 값이 음수이면 시계방향으로 양수이면 반시계 방향으로 원호를 그리게 되며, 이 값의 절대값이 360 보다 클수 없습니다.
DistU : 헬리컬 보간은 X 축과 Y 축의 원호보간과 U 축의 직선 보간이 동기 되어 동작되는 보간법입니다. 이 보간 법을 통해 동작하는 X 축과 Y 축의 원호 보간에 의해 이송되는 원의 둘레에 대한 거리는 U 축의 이송거리와 동일하게 됩니다. DistU 매개 변수는 U 축의 이송 거리를 반환하는 매개 변수입니다. U 축의 실제 이송한 거리를 알기 위하실 경우 유용하게 사용하실 수 있습니다.
IsBlocking : 함수의 동작시에 블록킹 처리에 대한 매개변수를 요구합니다. 블록킹(Blocking) 처리는 함수의
동작시에 윈도우 메시지를 처리 여부를 결정하게 됩니다.
EXAMPLE 1
아래의 코드는 하나의 360 도 원을 그리면서 Z 축도 +3000 만큼 이송하는 헬리컬 보간을 수행하는 예입니다. 이때 Z 축 속도를 V=5000, ACC=DEC=25000 으로 설정하고, 원호보간 속도는 원주 길이와 Z 축 이동거리의 비에 따라 자동으로 설정되도록 합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | C/C++
#define HEL_ID 0 // Helical ID
cmmIxxHelOnceSetSpeed(HEL_ID, 2, cmSMODE_S, 5000, 25000, 25000);
// 대상 축 설정
long nAxes[4] = {0, 1, 2, 3};
// 보간 이송 위치 결정
double fCoords[4] = {5000, 5000, 3000, cmDIR_P};
// 헬리컬 보간 이송
cmmIxxHelOnce(HEL_ID, 4, nAxes, fCoords, 360, NULL, TRUE);
…
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | Visual Basic
‘HEL_ID 는 이미 선언되어 있다고 가정함.
Call cmmIxxHelOnceSetSpeed(HEL_ID,2, cmSMODE_S, 5000, 25000, 25000)
Dim nAxes(4) As Long
Dim fCoords(4) As Double
‘ 대상 축 설정
nAxes(0) = 0
nAxes(1) = 1
nAxes(2) = 2
nAxes(3) = 3
‘ 보간 이송 위치 설정
fCoords(0) = 5000
fCoords(1) = 5000
fCoords(2) = 3000
fCoords(3) = cmDIR_P
‘ 헬리컬 보간 이송
Call cmmIxxHelOnce(HEL_ID, 4, nAxes(0), fCoords(0), 360, Null, True)
…
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | Delphi
Const HEL_ID = 0; // Helical ID
var
nAxes : Array[0..3] of LongInt;
fCoords : Array[0..3] of Double;
begin
cmmIxxHelOnceSetSpeed(HEL_ID, 2, cmSMODE_S, 5000, 25000, 25000);
// 대상 축 설정
nAxes[0] := 0;
nAxes[1] := 1;
nAxes[2] := 2;
nAxes[3] := 3;
// 보간 이송 위치 결정
fCoords[0] := 5000;
fCoords[1] := 5000;
fCoords[2] := 3000;
fCoords[3] := cmDIR_P;
// 헬리컬 보간 이송
cmmIxxHelOnce(HEL_ID, 4, @nAxes, @fCoords, 360, NIL , cmTRUE);
…
|
end;
EXAMPLE 2¶
아래 그림 9-3 과 같이 X,Y 축에 대하여 5 회의 원호보간을 수행하면서 동시에 Z 축을 이동하면서 헬리컬보간을 수행하는 예제입니다. 이때 마지막 ARC 의 각도는 90 도로 하여 처음 시작점을 기준으로 90 도 원호를 그리고 종료하도록 합니다. 5 회의 원호보간 이송이 연속적으로 수행되도록 하기 위해서 리스트모션을 사용하였습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | C/C++
#define LM_MAP 0
#define HEL_ID 0
long nAxisList[4] = {cmX1, cmY1, cmZ1, cmU1};
double fCoords[4] = {5000, 5000, 3000, cmDIR_P};
// X1&Y1&Z1&U1 축을 리스트모션에 관계된 축으로 설정 //
cmmLmMapAxes (LM_MAP, 0xf, 0x0);
// 모션 리스트 등록 시작 //
cmmLmBeginList (LM_MAP);
// 처음 이동은 가속=25000, 감속구간 없음(0)으로 설정 //
// 헬리컬보간 이동 : 원호중심=(5000,5000), 원호이동각도=360, //
cmmIxxHelOnceSetSpeed(HEL_ID, 2, cmSMODE_T, 5000, 25000, 0)
// Z 축 이동량=3000, U 축 Direction=+방향 //
fCoords[0] = 5000; fCoords[1] = 5000;
fCoords[2] = 3000; fCoords[3] = cmDIR_P;
// 헬리컬 보간 이송 시작
cmmIxxHelOnceStart(HEL_ID, 4, nAxisList, fCoords,360, NULL);
// 두번째 부터는 Constant 속도 모드로 설정 //
cmmIxxHelOnceSetSpeed (HEL_ID, 2, cmSMODE_C, 5000, 0, 0)
cmmIxxHelOnceStart (HEL_ID, 4, nAxisList, fCoords,360, NULL);
cmmIxxHelOnceStart (HEL_ID, 4, nAxisList, fCoords,360, NULL);
cmmIxxHelOnceStart (HEL_ID, 4, nAxisList, fCoords,360, NULL);
cmmIxxHelOnceStart (HEL_ID, 4, nAxisList, fCoords,360, NULL);
// 모션리스트 등록을 마침 //
cmmLmEndList (LM_MAP);
cmmLmStartMotion (LM_MAP);// 리스트모션 수행 시작 //
long lIsDone = FALSE;
while(!lIsDone){
long nCurOperIdx=0;
cmmLmIsDone(LM_MAP, &lIsDone);
// 현재 수행되는 작업 번호를 확인하여 화면에 표시 //
// 아래 DisplaySequence 함수는 가상의 함수입니다. //
cmmLmCurSequence (LM_MAP, (long *)&nCurOperIdx);
DisplaySequence(nCurOperIdx);
Sleep(1);
}
}
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | Visual Basic
‘LM_MAP 은 이미 선언되어 있다고 가정함.
Dim nAxisList(4) As Long
Dim fCoords(4) As Double
‘ 대상 축 설정
nAxisList(0) = cmX1
nAxisList(1) = cmY1
nAxisList(2) = cmZ1
nAxisList(3) = cmU1
‘ 이송 거리 설정
fCoords(0) = 5000
fCoords(1) = 5000
fCoords(2) = 3000
fCoords(3) = cmDIR_P
'// X1&Y1&Z1&U1 축을 리스트모션에 관계된 축으로 설정 //
Call cmmLmMapAxes(0, &HF, &H0)
'// 모션 리스트 등록 시작 //
Call cmmLmBeginList(0)
'// 처음 이동은 가속=25000, 감속구간 없음(0)으로 설정 //
Call cmmIxxHelOnceSetSpeed(0, 2, cmSMODE_T, 5000, 25000, 0)
'// 헬리컬보간 이동 : 원호중심=(5000,5000), 원호이동각도=360, //
'// Z 축 이동량=3000, U 축 Direction=+방향 //
Call cmmIxxHelOnceStart(4, nAxisList(0), fCoords(0), 360, 0)
'// 두번째 부터는 Constant 속도 모드로 설정 //
Call cmmIxxHelOnceSetSpeed(0, 2, cmSMODE_C, 5000, 0, 0)
Call cmmIxxHelOnceStart(0, 4, nAxisList(0), fCoords(0), 360, Null)
Call cmmIxxHelOnceStart(0, 4, nAxisList(0), fCoords(0), 360, Null)
Call cmmIxxHelOnceStart(0, 4, nAxisList(0), fCoords(0), 360, Null)
Call cmmIxxHelOnceStart(0, 4, nAxisList(0), fCoords(0), 360, Null)
Call cmmLmEndList(0) '// 모션리스트 등록을 마침 //
Call cmmLmStartMotion(0) '// 리스트모션 수행 시작 //
Dim nIsDone As Long
Dim nCurOperIdx As Long
nIsDone = False
Do While(Not (nIsDone))
Call cmmLmIsDone(LM_MAP, nIsDone)
'// 현재 수행되는 작업 번호를 확인하여 화면에 표시 //
‘//아래의 DisplaySequence 함수는 가상의 함수입니다.
Call cmmLmCurSequence(LM_MAP, nCurOperIdx)
DisplaySequence(nCurOperIdx)
Loop
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | Delphi
Const LM_MAP = 0;
Const HEL_ID = 0; // Helical ID
var
nAxisList : Array[0..3] of LongInt;
fCoords : Array[0..3] of Double;
lIsDone : LongInt;
nCurOperIdx : LongInt;
begin
nAxisList [0] := cmX1;
nAxisList [1] := cmY1;
nAxisList [2] := cmZ1;
nAxisList [3] := cmU1;
fCoords[0] := 5000;
fCoords[1] := 5000;
fCoords[2] := 3000;
fCoords[3] := cmDIR_P;
// X1&Y1&Z1&U1 축을 리스트모션에 관계된 축으로 설정 //
cmmLmMapAxes (LM_MAP, $f, $0);
// 모션 리스트 등록 시작 //
cmmLmBeginList (LM_MAP);
// 처음 이동은 가속=25000, 감속구간 없음(0)으로 설정 //
// 헬리컬보간 이동 : 원호중심=(5000,5000), 원호이동각도=360, //
cmmIxxHelOnceSetSpeed(HEL_ID, 2, cmSMODE_T, 5000, 25000, 0);
// Z 축 이동량=3000, U 축 Direction=+방향 //
fCoords[0] := 5000;
fCoords[1] := 5000;
fCoords[2] := 3000;
fCoords[3] := cmDIR_P;
// 헬리컬 보간 이송 시작
cmmIxxHelOnceStart(HEL_ID, 4,@nAxisList, @fCoords,360, NIL);
// 두번째 부터는 Constant 속도 모드로 설정 //
cmmIxxHelOnceSetSpeed (HEL_ID, 2, cmSMODE_C, 5000, 0, 0);
cmmIxxHelOnceStart (HEL_ID, 4, @nAxisList, @fCoords,360, NIL);
cmmIxxHelOnceStart (HEL_ID, 4, @nAxisList, @fCoords,360, NIL);
cmmIxxHelOnceStart (HEL_ID, 4, @nAxisList, @fCoords,360, NIL);
cmmIxxHelOnceStart (HEL_ID, 4, @nAxisList, @fCoords,360, NIL);
// 모션리스트 등록을 마침 //
cmmLmEndList (LM_MAP);
cmmLmStartMotion (LM_MAP);// 리스트모션 수행 시작 //
lIsDone := cmFALSE;
while lIsDone =0 do
begin
nCurOperIdx := 0;
cmmLmIsDone(LM_MAP, @lIsDone);
// 현재 수행되는 작업 번호를 확인하여 화면에 표시 //
// 아래 DisplaySequence 함수는 가상의 함수입니다. //
cmmLmCurSequence (LM_MAP,@nCurOperIdx);
//DisplaySequence(nCurOperIdx);
Sleep(1);
end;
end;
|
See also
ref:cmmIxxHelOnceStart