17.1.2. ecmPtmCtl_Begin


SYNOPSIS

t_success  ecmPtmCtl_Begin(
  t_i32  NetID,
  t_i32  PtmMapIndex,
  t_ui32  AxisMask1,
  t_ui32   AxisMask2,
  t_i32  *ErrCode
)

DESCRIPTION

  • 이 함수는 PtmMapIndex로 지정된 PT-Motion 맵에 대해서 PT-Motion 기능을 시작하는 함수입니다.

  • 이 함수가 호출된 이후에 ecmPtmCfg_AddItem_PT() 함수를 실행하면 등록된 Position-Table 값에 해당하는 이송이 이루어짐니다.

PARAMETER

  • NetID : Network 번호

  • PtmMapIndex : 시작하고자 하는 대상 PT-Motion 맵 인덱스. PT-Motion 맵은 최대 8개까지 지원되므로 이 값은 0 ~ 7의 숫자이어야 합니다.

  • AxisMask1 : 0 ~ 31번 축 중에서 PT-Motion에 참여하는 축을 선택하는 마스크 값입니다. 이 값의 각 비트 별 값의 의미는 아래 표와 같습니다.

Bit Number

Meaning

BIT00

0번 축의 포함 여부 (0 : 포함안함, 1 : 포함)

BIT01

1번 축의 포함 여부 (0 : 포함안함, 1 : 포함)

BIT02

2번 축의 포함 여부 (0 : 포함안함, 1 : 포함)

:

BIT31

31번 축의 포함 여부 (0 : 포함안함, 1 : 포함)

  • AxisMask2 : 32 ~ 63번 축 중에서 PT-Motion에 참여하는 축을 선택하는 마스크 값입니다. 이 값의 각 비트 별 값의 의미는 아래 표와 같습니다.

Bit Number

Meaning

BIT00

32번 축의 포함 여부 (0 : 포함안함, 1 : 포함)

BIT01

33번 축의 포함 여부 (0 : 포함안함, 1 : 포함)

BIT02

34번 축의 포함 여부 (0 : 포함안함, 1 : 포함)

:

BIT31

63번 축의 포함 여부 (0 : 포함안함, 1 : 포함)

  • ErrCode : 이 매개 변수를 통하여 현재의 에러 코드를 반환합니다. 단, 이 매개 변수에 NULL을 전달하면 에러 코드를 반환하지 않습니다.

RETURN VALUE

  • 이 리턴값은 불 형(Boolean Type) 을 가지고 있습니다.

Value

Meaning

0

함수 수행이 실패했음을 의미합니다.

1

함수 수행이 성공했음을 의미합니다.

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
 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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
//본 예제는 PT Motion 관련 예제입니다.
#include "ComiEcatSdk_Api.h"

// SetBit() : 지정한 변수의 특정 비트의 값을 변경한다. 매크로이므로 함수명과 괄호가 떨어지면 않됨에 주의!
// v:대상 변수, n:bit번호, s:변경값(state)
#define ecSetBit(v,n,s)        if(s) (v)|=(1<<(n)); else (v)&=~(1<<(n))

#define AXIS            0
#define PTM-MAP                0
#define VEL_HIGH       500000.0
#define ACC_TIME       100
#define DEC_TIME       100
#define VWORK_TIME     2000
#define DELTA_T                0.001 // Delta-T (sec)

#define NUM_AXES       3
int g_nAxisList[NUM_AXES] = {0, 1, 2};

t_32 Error_Num =  0;//함수 별  에러 코드 저장 변수

/***************************************************************
* OnProgramInitial : 이 함수는 가상의 함수로서 프로그램 초기화 루틴이
* 적용되는 부분을 의미합니다.      //5~9장 사이 내용 참고
***************************************************************/
void OnProgramInitial()
{
       TEcDevInfo Device_Info;  //디바이스 정보 저장 할 구조체
       t_i32 Device_Num = 0;

       t_success nIsLoaded = ecDll_Load ();

       if(!ecGn_LoadDevices(&Error_Num)){   //장치 로드
               //로드 실패시 예외  처리
       }

       if(!ecGn_GetDevInfo(Device_Num,&Device_Info, &Error_Num)){
               //디바이스 정보 로드 실패 시 예외 처리
       }
       //ALState OP모드로 전환
       ecNet_SetAlState(Device_Info.NetIdx,  ecAL_STATE_OP, &Error_Num);

ecmSxCtl_SetSvon(Device_Info.NetIdx, AXIS0, &Error_Num);

} //OnProgramInitial 함수 끝

/********************************************************************
* OnPTMotion: 이 함수는 PT모션 등록 및 시작 부분
* 많은 세팅 관련 함수가 있지만 경우에 따라 사용자가 선택해서 사용
*********************************************************************/
void OnPTMotion ()


{
       t_f64 WorkVelList[NUM_AXES] = {300000, 400000, 500000};
       t_f64 Acc[NUM_AXES], Dec[NUM_AXES];
       t_f64 PosDataList[NUM_AXES];
       t_f64 InstVel;
       t_i32 RegStepCount = 0;
       t_i32 RemStepCount = 0;
       t_i32 RunStepCount = 0, RunStepSts = 0;
       t_ui32 g_dwAxisMask1, g_dwAxisMask2;

       // 1) PT-Motion 맵번호
       int nPtmMapIndex = PTM-MAP;

       // 2) 각 축의 가속도와 감속도 계산
       g_dwAxisMask1 = g_dwAxisMask2 = 0; // 축 마스크 리셋
       for(i=0; i<NUM_AXES; i++){
               Acc[i] = (WorkVelList[i] / (double)ACC_TIME);
               Dec[i] = (WorkVelList[i] / (double)DEC_TIME);
               // 축마스크 비트 셋팅
               if(g_nAxisList[i] < 32){ // 축번호 0~31은 AxisMask1을 통해서 전달.
                       ecSetBit(g_dwAxisMask1, g_nAxisList[i], 1);
               }else{ // 축번호 32~63은 AxisMask2을 통해서 전달.
                       ecSetBit(g_dwAxisMask2, (g_nAxisList[i]-32), 1);
               }
       }

       // 3) PT-Motion 활성화
      if(!ecmPtmCtl_Begin(Device_Info.NetIdx,  nPtmMapIndex,  g_dwAxisMask1, g_dwAxisMask2, &Error_Num)){
               // 실패시 에러 처리
       }

       // 4) 가속구간의 Position Table 등록
       for(i=0; i<ACC_TIME; i++){
               for(int j=0; j<NUM_AXES; j++){
                       InstVel = (i+1) * Acc[j];
               // 가속도를 반영하여 각 미소구간에서 적용되어야 하는 평균 속도 계산
                       PosDataList[j] = InstVel * DELTA_T;  // 평균 속도에 미소시간을 곱하여 해당 구간에서 이송해야 하는 이송 거리 계산
               }
               // Position Table 등록
               ecmPtmCmd_AddItem_PT(Device_Info.NetIdx,  nPtmMapIndex,  DELTA_T, PosDataList, NUM_AXES, FALSE, & Error_Num);
       }

       // 5) 정속구간의 Position Table 등록
       for(i=0; i<VWORK_TIME; i++){
               for(int j=0; j<NUM_AXES; j++){
               PosDataList[j] = WorkVelList[j] * DELTA_T; // 평균 속도에 미소시간을 곱하여 해당 구간에서 이송해야 하는 이송 거리 계산
               }
       // Position Table 등록
       ecmPtmCmd_AddItem_PT(Device_Info.NetIdx,  nPtmMapIndex,  DELTA_T, PosDataList, NUM_AXES, FALSE, & Error_Num);
       }

       // 6) 감속구간의 Position Table 등록
       for(i=0; i<ACC_TIME; i++){
               for(int j=0; j<NUM_AXES; j++){
                       InstVel = WorkVelList[j] - ((i+1) * Dec[j]);
// 가속도를 반영하여 각 미소구간에서 적용되어야 하는 평균 속도 계산
                       PosDataList[j] = InstVel * DELTA_T;
// 평균 속도에 미소시간을 곱하여 해당 구간에서 이송해야 하는 이송 거리 계산
               }
               // Position Table 등록
               ecmPtmCmd_AddItem_PT(Device_Info.NetIdx,  nPtmMapIndex,  DELTA_T, PosDataList, NUM_AXES, FALSE, & Error_Num);
       }

       // 7) PT-Motion 완료 체크
       MSG msg;
       EEcmPtmSts RunSts;
       while(1){
               RunSts = ecmPtmSt_GetRunSts(Device_Info.NetIdx, nPtmMapIndex, NULL, NULL, & Error_Num);
               if(RunSts == ecmPTM_STS_RUN_COMPT || RunSts == ecmPTM_STS_DISABLED){
                       break; // 등록된 PT모션이 모두 완료되었으므로 상태감시 완료!
               }
               Sleep(10);

               while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){
                       TranslateMessage(&msg);
                       DispatchMessage(&msg);
               }
       }

       // 8) PT-Motion 종료
       if(!ecmPtmCtl_End(Device_Info.NetIdx, nPtmMapIndex, &Error_Num)){
               ecUtl_ShowError_A (GetSafeHwnd(), "ecmPtmCtl_End() functions fail!, ec = %d", nErrCode);
               return;
       }
}

/********************************************************************
* OnPTHOLD: 이 함수는 PT모션 HOLD 하는 부분
* 많은 세팅 관련 함수가 있지만 경우에 따라 사용자가 선택해서 사용
*********************************************************************/
void OnPTHOLD ()
{
       t_bool isHold = 0;  //Hold 상태

       if(!ecmPtmCtl_SetHold(Device_Info.NetIdx,  nPtmMapIndex, isHold, &Error_Num))
       {
               //실패시 에러 처리
       }
}

/********************************************************************
* OnPTEnd: 이 함수는 PT모션 종료 하는 부분
* 많은 세팅 관련 함수가 있지만 경우에 따라 사용자가 선택해서 사용
*********************************************************************/
void OnPTEnd ()
{
       if(!ecmPtmCtl_End(Device_Info.NetIdx,  PTM-MAP, &Error_Num))
       {
               //실패시 에러 처리
       }
}