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))
{
//실패시 에러 처리
}
}
|