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 축의 실제 이송한 거리를 알기 위하실 경우 유용하게 사용하실 수 있습니다.

pulsemotion/06.Advanced_Motion_Control/확장_보간제어(Extended_Interpolation_Motion)/Basic Functions/6장_1.jpg
  • 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 회의 원호보간 이송이 연속적으로 수행되도록 하기 위해서 리스트모션을 사용하였습니다.

pulsemotion/06.Advanced_Motion_Control/확장_보간제어(Extended_Interpolation_Motion)/Basic Functions/6장_2.jpg
 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