cmmMsRegisterSlave


SYNOPSIS

VT_I4 cmmMsRegisterSlave(
    [in] VT_I4 Axis, [in] VT_R8 MaxSpeed, [in] VT_I4 IsInverse
    )

DESCRIPTION

  • 지정한 축을 Slave 축으로 등록/해제 합니다. 이때 마스터축은 자동으로 결정되며, 축 번호상 앞의 축이 자동적으로 Master 축으로 됩니다. 단, 해당 축의 Master/Slave 모드를 설정하는 하드웨어 스위치가 연결되지 않은 경우에는 Slave 축이 등록되어도 Master/Slave 동작이 정상적으로 동작하지 않습니다.

PARAMETER

  • Axis: Slave 축으로 지정/해제할 축번호. 축 번호는 0 부터 시작합니다.

  • MaxSpeed : Slave 축이 구동될 수 있는 최대속도. Master 축이 이 값보다 큰 속도로 구동되면 오동작할 수 있습니다. 속도의 단위는 “Unit speed”에 의해 정의되는 논리적 속도입니다.

  • IsInverse : Slave 축의 구동방향과 Master 축의 구동방향을 반대로 할 것인지를 결정합니다.

Value

Meaning

0 또는 cmFALSE

Master 축과 Slave 축의 구동방향을 동일하게 함.

1 또는 cmTRUE

Master 축과 Slave 축의 구동방향을 반대로 함.

RETURN VALUE

Value

Meaning

음수

수행 실패

cmERR_NONE

수행 성공

REFERENCE

  • 이 함수가 수행되면 지정한 축은 Manual Pulsar 모드로 전환되게 됩니다. Maser/Slave 에 관련된 하드웨어 스위치 설정이 적절하게 되었으면 지정한 축의 PA/PB 입력핀에 Master 축의 Command 펄스 신호가 자동으로 입력되고, 따라서 두 축이 동기제어됩니다.

  • Master 축의 Command 출력모드는 반드시 “CW & CCW 모드 (출력모드 4 ~ 5 번)”로 설정되어 있어야 합니다. Master 축의 Command 출력모드가 “Pulse & Direction 모드 (출력모드 0 ~ 3 번)”로 설정된 경우에는 Slave 축이 한쪽방향으로만 구동되게 됩니다. Command 출력모드의 설정에 관해서는 cmmCfgSetOutMode() 함수 설명편을 참조하시기 바랍니다.

  • Master 축의 Command 출력 모드가 “Pulse & Direction 모드” 로 설정된 경우 (출력모드 0~3) 에는 Master / Slave 기능을 양방향에서 원할하게 사용할 수 없습니다.

  • 이 함수가 성공적으로 수행되었으면 cmmStReadMotionState() 함수의 반환값이 8(cmMST_WAIT_PLSR)이 됩니다. 이를 확인하면 지정한 축이 Slave 모드로 전환되었는지를 확인할 수 있습니다. 그러나 하드웨어 스위치 설정은 소프트웨어적으로 확인되지 않습니다.

  • Slave 축은 CLR(Counter Clear) 입력과 INP 입력이 자동으로 Disable 됩니다. 따라서 이 함수를 호출한 이후에 CLR 입력과 INP 입력을 Enable 시키는 환경설정을 수행해서는 안됩니다.

  • Slave 모드가 해제되면 해당 축의 CLR 입력모드와 INP 입력모드는 cmmMsRegisterSlave() 함수가 호출되기 이전의 설정으로 복원됩니다.

EXAMPLE

본 예제는 1 번(Y1) 축을 Slave 축으로 설정하여 Master/Slave 동기제어를 수행하는 예제입니다. 1 번축의 마스터축은 자동으로 0 번축으로 설정됩니다. 본 예제에서는 원점복귀 하는 함수를 두 가지 방식으로 예시합니다. 사용자는 두 가지 방식중에 하나를 선택적으로 사용하시면 됩니다.

★. 하드웨어적인 SYNC 스위치 중에서 “0->1“ 로 표기된 두 개의 스위치를 연결하여 합니다.

★. 마스터축인 0 번 축의 Command 출력모드는 반드시 “CW & CCW 모드 (출력모드 4 ~ 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
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
C/C++
#include "Cmmsdk.h"
#include "CmmsdkDef.h"
#define N_AXES 2     // 2 축

/***************************************************************
* OnProgramInitial : 이 함수는 가상의 함수로서 프로그램 초기화 루틴이
* 적용되는 부분을 의미합니다.
***************************************************************/
void OnProgramInitial()
{

   long m_nNumAxes;

   cmmLoadDll();
   if(cmmGnDeviceLoad(cmTRUE, &m_nNumAxes) != cmERR_NONE)
   {

       //Handle 은 사용자가 생성한 폼의 핸들 값입니다.
       cmmErrShowLast(Handle);
       return;
   }

   // 1 번(Y1) 축을 Slave 축으로 등록합니다. => 마스터는 0 번(X1) 축 //
   if(cmmMsRegisterSlave (cmY1, 500000, cmFALSE) != cmERR_NONE){
       cmmErrShowLast(Handle);
   }
}

/***************************************************************
* OnHomeReturn1() : 이 함수에서는 원점복귀시에는 1 번축의 Slave 모드를 해제한 상태에서 0 번과 1 번축이 동시에
원점복귀를 수행한 후, 원점복귀가 완료되면 다시 1 번축의 Slave 모드를 복원하는 방식을 취하였습니다.
* OnHomeReturn1() 대신에 OnHomeReturn2() 방식을 사용할 수도 있습니다.
****************************************************************/
void OnHomeReturn1()
{
   /////////////////////////////////////////////////////////////
   // 원점복귀를 하기 위해 1 번축을 Slave 모드에서 해제한다.
   if(cmmMsUnregisterSlave (cmY1) != cmERR_NONE){
       cmmErrShowLast(Handle);
       return;
   }

   //X1 축과 Y1 축의 홈복귀 속도 패턴을 설정 합니다. 참고적으로 역방향 속도는 100 으로 설정하였습니다.
   cmmHomeSetSpeedPattern(cmX1, cmSMODE_S, 10000, 30000, 30000, 100);
   cmmHomeSetSpeedPattern(cmY1, cmSMODE_S, 10000, 30000, 30000, 100);

   // X1&Y1 축 원점복귀 동시 수행//
   long nAxes[2]={cmX1, cmY1};
   long nDirList[2]={cmDIR_N, cmDIR_N};
   if(cmmHomeMoveAll(2, nAxes, nDirList, cmFALSE) != cmERR_NONE){
       cmmErrShowLast(Handle);
       return;
   }

   // 1 번(Y1) 축을 Slave 축으로 다시 등록합니다. //
   if(cmmMsRegisterSlave (cmY1, 500000, cmFALSE) != cmERR_NONE){
       cmmErrShowLast(Handle);
   }
}

/***************************************************************
* OnHomeReturn2() : 이 함수는 Master/Slave 시스템에서의 원점복귀를 수행하는 함수입니다. 이 함수에서는
원점복귀시에도 Master/Slave 모드를 유지한채 0 번축만 원점복귀를 수행합니다. 1 번축은 Slave 이므로 0 번축의
모션을 똑같이 추종합니다. OnHomeReturn2() 대신에 OnHomeReturn1() 방식을 사용할 수도 있습니다.
***************************************************************/
void OnHomeReturn2()
{
   // X1 축 홈복귀 속도패턴 설정 //
   cmmHomeSetSpeedPattern(cmX1, cmSMODE_S, 10000, 30000, 30000);

   // X1 축 원점복귀 시작 //
   if(cmmHomeMoveStart(cmX1, cmDIR_N) != cmERR_NONE){
       cmmErrShowLast(Handle);
       return;
   }
   if(cmmHomeWaitDone(cmX1, cmFALSE) != cmERR_NONE){
       cmmErrShowLast(Handle);
       return;
   }
}

/**************************************************************
* OnDoMotion() : 모션을 수행하는 가상의 함수. 이 함수에서는 0 번축만 제어
* 하지만 실제제어되는 것은 0 번축과 1 번축이 함께 제어됩니다.
**************************************************************/
void OnDoMotion()
{
   cmmCfgSetSpeedPattern(cmX1, cmSMODE_S, 10000, 100000, 100000);

   cmmSxMove(cmX1, 1000, cmFALSE); // Move 1000
   cmmSxMove(cmX1, 1000, cmFALSE); // Move 1000
   cmmSxMove(cmX1, -1000, cmFALSE); // Move -1000
   cmmSxMove(cmX1, -1000, cmFALSE); // Move -1000
}

/**************************************************************
* OnStop() : “Stop”명령시에 호출되는 가상의 함수
**************************************************************/
void OnStop()
{
   cmmMxStopEmg(N_AXES, nAxisList);
}
  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
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
Visual Basic

'/**************************************************************
'* OnProgramInitial : 이 함수는 가상의 함수로서 프로그램 초기화 루틴이
'* 적용되는 부분을 의미합니다.
'***************************************************************

Private Sub OnProgramInitial()
   If cmmGnDeviceLoad(cmTRUE, m_nNumAxes) <> cmERR_NONE Then
   'Handle 은 사용자가 생성한 폼의 핸들 값입니다.
     Call cmmErrShowLast(thisform.Hwnd)
   End

End If

   '1 번(Y1) 축을 Slave 축으로 등록합니다. => 마스터는 0 번(X1) 축
   If cmmMsRegisterSlave(cmY1, 500000, cmFALSE) <> cmERR_NONE Then
     Call cmmErrShowLast(thisform.Hwnd)
   End If

End Sub

'/*************************************************************
'* OnHomeReturn1() : 이 함수에서는 원점복귀시에는
‘* 1 번축의 Slave 모드를 해제한 상태에서 0 번과 1 번축이 동시에 원점복귀를
‘* 수행한 후, 원점복귀가 완료되면 다시 1 번축의 Slave 모드를 복원하는
‘* 방식을 취하였습니다.
'* OnHomeReturn1() 대신에 OnHomeReturn2() 방식을 사용할 수도 있습니다.
'***************************************************************

Private Sub OnHomeReturn1()

   ' // 원점복귀를 하기 위해 1 번축을 Slave 모드에서 해제한다.
   If cmmMsUnregisterSlave(cmY1) <> cmERR_NONE Then
     Call cmmErrShowLast(thisform.Hwnd)
     End
   End If

   '//X1 축과 Y1 축의 홈복귀 속도 패턴을 설정 합니다.
   Call cmmHomeSetSpeedPattern(cmX1, cmSMODE_S, 10000, 30000, 30000, 100)
   Call cmmHomeSetSpeedPattern(cmY1, cmSMODE_S, 10000, 30000, 30000, 100)

   '// X1&Y1 축 원점복귀 동시 수행//
   Dim nAxes(2) As Long
   Dim ndirList(2) As Long

   nAxes(0) = cmX1
   nAxes(1) = cmY1

   ndirList(0) = cmDIR_N
   ndirList(1) = cmDIR_N

   If cmmHomeMoveAll(2, nAxes(0), ndirList(0), cmFALSE) <> cmERR_NONE Then
     Call cmmErrShowLast(thisform.Hwnd)
     End
   End If

   '// 1 번(Y1) 축을 Slave 축으로 다시 등록합니다. //
   If cmmMsRegisterSlave(cmY1, 500000, cmFALSE) <> cmERR_NONE Then
     Call cmmErrShowLast(thisform.Hwnd)
   End If

End Sub

'/**************************************************************
'* OnHomeReturn2(): 이 함수는 Master/Slave 시스템에서의 원점복귀를 수행
'* 하는 함수입니다. 이 함수에서는 원점복귀시에도 Master/Slave 모드를 유지한
'* 채 0 번축만 원점복귀를 수행합니다.1 번축은 Slave 이므로 0 번축의 모션을 똑
'* 같이 추종합니다. OnHomeReturn2()대신에 OnHomeReturn1() 방식을 사용할
'* 수도 있습니다.
'**************************************************************/
Private Sub OnHomeReturn2()

   '// X1 축 홈복귀 속도패턴 설정 //
   Call cmmHomeSetSpeedPattern(cmX1, cmSMODE_S, 10000, 30000, 30000)
   '// X1 축 원점복귀 시작 //
   If cmmHomeMoveStart(cmX1, cmDIR_N) <> cmERR_NONE Then
     cmmErrShowLast (thisform.Hwnd)
     End
   End If

   If cmmHomeWaitDone(cmX1, cmFALSE) <> cmERR_NONE Then
     cmmErrShowLast (thisform.Hwnd)
     End
   End If

End Sub

'/**************************************************************
'* OnDoMotion() : 모션을 수행하는 가상의 함수. 이 함수에서는 0 번축만 제어
'* 하지만 실제제어되는 것은 0 번축과 1 번축이 함께 제어됩니다.
 '**************************************************************/
Private Sub OnDoMotion()

   Call cmmCfgSetSpeedPattern(cmX1, cmSMODE_S, 10000, 100000, 100000)

   Call cmmSxMove(cmX1, 1000, cmFALSE) '// Move 1000
   Call cmmSxMove(cmX1, 1000, cmFALSE) '// Move 1000
   Call cmmSxMove(cmX1, -1000, cmFALSE) '// Move -1000
   Call cmmSxMove(cmX1, -1000, cmFALSE) '// Move -1000

End Sub

'/**************************************************************
'* OnStop() : "Stop"명령시에 호출되는 가상의 함수
'**************************************************************/
Private Sub OnStop()

    Call cmmMxStopEmg(2, nAxisList(0))

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
Delphi

// ****************************************************************************
// Master/Slave 동기 구동을 하기 위해 슬레이브 축을 등록 합니다.
// ****************************************************************************
procedure OnSetMsRegisterSalve ();
var
   nSlaveState : LongInt; // 슬레이브 축 등록 상태 정보.
   nMasterAxis : LongInt; // 마스터 축 정보.

begin

   // 1 번 축을 슬레이브 축으로 등록합니다. 자동으로 마스터 축은 0(cmX1)번 축이 됩니다.
   if cmmMsRegisterSlave (cmY1, 655350, cmFALSE ) = ceERR_NONE then
   begin
       // 슬레이브 축의 등록 상태를 확인 합니다.
       cmmMsCheckSlaveState (cmY1, @nSlaveState );

       if nSlaveState <> cmTRUE then
       begin
                   ShowMessage ( ‘Slave axis registered failed’ );
       end;

       // 슬레이브 축의 마스터 축을 확인합니다.
       cmmMsGetMasterAxis (cmY1, @nMasterAxis );

       if nMasterAxis <> cmX1 then
       begin
             ShowMessage ( ‘Slave axis registered failed’ );
       end;
   end;

end;

// ****************************************************************************
// 마스터 축에 대해 단축 이송 작업을 수행합니다. 슬레이브 축이 등록
// 되어 있으므로 마스터 축 제어 시 슬레이브 축이 함께 제어됩니다.
// ****************************************************************************
procedure OnMove ();
begin
   // 마스터 축 속도 환경을 설정합니다.
   cmmCfgSetSpeedPattern (cmX1, cmSMODE_S, 5000, 30000, 30000 );

   // 마스터 축 단축 이송 수행 시 슬레이브 축이 함께 이송합니다.
   cmmSxMove (cmX1, 15000, cmFALSE );

end;