4.1.21. cmmCfgSetCtrlMode


SYNOPSYS

VT_I4 cmmCfgSetCtrlMode(
    [in] VT_I4 Axis, [in] VT_I4 CtrlMode
    )

DESCRIPTION

  • cmmCfgSetCtrlMode() 함수는 각 축의 제어모드를 결정합니다. 여기서 제어모드라는 것은 엔코더 피드백 값을 이송 명령에서 어떻게 활용하느냐 하는 것입니다. 이송 명령이 내려졌을 때 목표 좌표를 커맨드(COMMAND) 위치를 기준으로 적용할 것인지, 피드백(FEEDBACK) 위치를 기준으로 적용할 것인지를 결정하는 함수입니다.

PARAMETER

  • Axis: 축번호. 축번호는 상수값으로 [cmX1] 부터 0 번째 축을 기준 축으로 임의의 축을 설정할 수 있습니다.

  • CtrlMode : cmmCfgSetCtrlMode 함수의 인자이며, 제어모드를 설정합니다. 이 값의 의미는 다음과 같습니다.

Value

Meaning

0 (cmCTRL_OPEN)[초기값]

이 값은 제어모드를 Open loop 제어 모드로 설정합니다. 이 모드에서는 이송명령의 목표 좌표가 항상 커맨드 위치를 기준으로 설정됩니다.

1 (cmCTRL_SEMI_C)

이 값은 제어모드를 Semi-closed loop 제어 모드로 설정합니다. 이 모드에서는 이송명령의 목표 좌표가 항상 FEEDBACK 위치를 기준으로 설정됩니다. 예를 들어서 10000 의 좌표로 이송하라는 명령이 하달되었을 때 커맨드 위치는 무시하고

피드백 위치가 10000 이 되도록 이송의 목표좌표가 설정됩니다.

2 (cmCTRL_FULL_C)

이 값은 향후 버전을 위해서 예약된 값이며

현재는 사용되지 않는 값입니다.

RETURN VALUE

Value

Meaning

음수

수행 실패

cmERR_NONE

수행 성공

REFERENCE

  • 여기서 설정하는 제어모드는 절대 좌표 이송 명령에서만 영향을 미치고, 상대 좌표 이송 명령에서는 항상 Open loop 제어 모드로 운용됩니다.

  • 제어 모드에 따른 차이에 대한 이해(理解)를 돕기 위하여 예를 들어보겠습니다. 현재 커맨드 위치가 5000 , 피드백 위치가 4000 인 상태에서 cmmSxMoveTo() 함수를 사용하여 10000 의 위치로 이송하라는 명령을 하달하였을 때 • Open loop 제어모드에서는 현재 위치에서 5000 만큼 (+) 방향으로 이송 • Semi-Closed Loop 제어모드에서는 현재 위치에서 6000 만큼 (+) 방향으로 이송 을 하는 서로 다른 이송 결과를 나타낼 수 있습니다.

  • Semi-closed loop 제어모드로 설정하였을 때 이송 목표 좌표의 계산은 이송 명령을 수행하는 초기에 계산됩니다. 즉, 이송 명령을 실행하는 초기에 현재의 피드백 위치를 읽어서 목표 좌표와의 차이 만큼을 상대좌표 이송하는 방식으로 운용됩니다. 따라서 이송 명령이 끝나는 시점에서 피드백 위치를 확인하여 지령된 목표좌표에 피드백 위치가 항상 일치하는 것을 보장하는 Full-closed loop 방식과는 차이가 있습니다.

EXAMPLE

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
C/C++

#include “Cmmsdk.h”
#include “CmmsdkDef.h”

void OnSetCtrlMode ()
{
   long nAxisNo = 1; // 제어 모드를 설정할 축을 선택합니다.
   long nCtrlMode; // 제어 모드 정보.

   /* 설정되어 있는 제어 모드를 확인하여 Semi-Closed 제어 모드로 설정합니다.
   이 제어 모드에서는 이송 명령의 목표 좌표가 항상 피드백 위치를 기준으로 설정됩니다. 단, 절대 좌표 이송
   명령에서만 영향을 미치고, 상대 좌표 이송 명령에서는 Open Loop 제어 모드로 운용됩니다. */

   // 해당 축의 제어 모드 설정 상태를 확인하여, Semi-Closed Loop 제어 모드로 설정합니다.
   if (cmmCfgGetCtrlMode ( nAxisNo, nCtrlMode ) == cmERR_NONE )
   {
       if ( nCtrlMode != cmCTRL_SEMI_C )
       {
           // Semi-Closed Loop 제어 모드로 설정
           cmmCfgSetCtrlMode ( nAxisNo, cmCTRL_OPEN );
       }
   }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Visual Basic

Private Sub OnSetCtrlMode ()

   Dim nAxisNo As Long ‘ 제어 모드를 설정할 축을 선택합니다.
   Dim nCtrlMode As Long ‘ 제어 모드 정보.

   nAxisNo = 1

   ‘ 설정되어 있는 제어 모드를 확인하여 Semi-Closed 제어 모드로 설정합니다.
   ‘ 이 제어 모드에서는 이송 명령의 목표 좌표가 항상 피드백 위치를 기준으로 설정됩니다. 단, 절대 좌표 이송
   ‘ 명령에서만 영향을 미치고, 상대 좌표 이송 명령에서는 Open Loop 제어 모드로 운용됩니다.

   ‘ 해당 축의 제어 모드 설정 상태를 확인하여, Semi-Closed Loop 제어 모드로 설정합니다.
   If cmmCfgGetCtrlMode ( nAxisNo, nCtrlMode ) = cmERR_NONE Then

       If nCtrlMode <> cmCTRL_SEMI_C Then
           ‘ Semi-Closed Loop 제어 모드로 설정
           Call cmmCfgSetCtrlMode ( nAxisNo, cmCTRL_OPEN )
       End If
   End If

End Sub
 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
Delphi

procedure OnSetCtrlMode ();
var
   nAxisNo : LongInt; // 제어 모드를 설정할 축을 선택합니다.
   nCtrlMode : LongInt; // 제어 모드 정보.

begin
   nAxisNo := 1;

   { 설정되어 있는 제어 모드를 확인하여 Semi-Closed 제어 모드로 설정합니다.
   ‘이 제어 모드에서는 이송 명령의 목표 좌표가 항상 피드백 위치를 기준으로 설정됩니다. 단, 절대 좌표 이송
   명령에서만 영향을 미치고, 상대 좌표 이송 명령에서는 Open Loop 제어 모드로 운용됩니다. }

   // 해당 축의 제어 모드 설정 상태를 확인하여, Semi-Closed Loop 제어 모드로 설정합니다.
   if cmmCfgGetCtrlMode ( nAxisNo, @nCtrlMode ) = cmERR_NONE then
   begin
       if nCtrlMode <> cmCTRL_SEMI_C then
       begin
           // Semi-Closed Loop 제어 모드로 설정
           cmmCfgSetCtrlMode ( nAxisNo, cmCTRL_OPEN );
       end;
   end;

end;