16.1.5. ecmLmCtl_Begin¶
SYNOPSIS¶
t_success ecmLmCtl_Begin(
t_i32 NetID,
t_i32 LmMapIndex,
t_ui32 AxisMask1,
t_ui32 AxisMask2,
t_i32 *ErrCode
)
DESCRIPTION¶
이 함수는 하나의 리스트 모션맵에 대해서 리스트 모션 기능을 시작합니다.
리스트 모션이 시작 되면 해당 리스트 모션 맵에 포함된 축들의 이송 명령들은 리스트모션 테이블에 등록 되고 난 후에 ecmLmCtl_Run() 함수가 실행된 이후에 일괄적으로 실행되게 됩니다.
PARAMETER¶
NetID : Network 번호
LmMapIndex : 시작하고자 하는 대상 LIST-Motion 맵 인덱스. LIST -Motion 맵은 최대 8개까지 지원되므로 이 값은 0 ~ 7의 숫자이어야 합니다.
AxisMask1 : 0 ~ 31번 축 중에서 LIST-Motion에 참여하는 축을 선택하는 마스크 값입니다. 이 값의 각 비트 별 값의 의미는 아래 표와 같습니다.
Bit Number |
Meaning |
---|---|
BIT00 |
0번 축의 포함 여부 (0 : 포함안함, 1 : 포함) |
BIT01 |
1번 축의 포함 여부 (0 : 포함안함, 1 : 포함) |
BIT02 |
2번 축의 포함 여부 (0 : 포함안함, 1 : 포함) |
: |
|
BIT31 |
31번 축의 포함 여부 (0 : 포함안함, 1 : 포함) |
AxisMask2 : 32 ~ 63번 축 중에서 LIST-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 |
함수 수행에 성공하였음을 의미합니다. |
REFERENCE¶
이 함수를 실행한 이후에 리스트모션에 포함된 축들의 이송함수를 실행하면 해당 이송 명령은 리스트모션 테이블에 등록되게 됩니다. 그리고 실제 이송은 ecmLmCtl_Run() 함수가 실행된 이후에 수행됩니다.
ecmSxMot_VMoveStart 함수와 같이 목표위치가 결정되지 않는 이송명령은 리스트모션 으로 등록할 수 없습니다.
다축동시구동 함수(ecmMxMot) 의 접두어로 이름 지어진 이송 함수)들은 리스트모션으로 등록할 수 없습니다.
리스트모션으로 등록 가능한 함수들은 아래 표와 같습니다.
리스트 모션으로 등록 사능한 함수 명 |
---|
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 | //본 예제는 ListMoiton 을 등록하고 사용하는 예제입니다.
#include "ComiEcatSdk_Api.h"
#define AXIS 0
#define LM_MAP 0
#define VEL1 100000
#define VEL2 300000
#define VEL3 100000
#define ACC 800000
#define DEC 800000
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, AXIS, &Error_Num);
} //OnProgramInitial 함수 끝
/********************************************************************
* OnListMotion: 이 함수는 ListMotion 등록 및 시작 부분
* 많은 세팅 관련 함수가 있지만 경우에 따라 사용자가 선택해서 사용
*********************************************************************/
void OnListMotion ()
{
// 1) ListMotion 기능 활성화(시작)
ecmLmCtl_Begin (Device_Info.NetIdx, LM_MAP, (0x1<<AXIS), 0, &Error_Num);
// StepID를 0으로 설정 => 이후에 등록되는 스텝들은 모두 스텝아이가 0으로 부여된다.
ecmLmCfg_SetStepId (Device_Info.NetIdx, LM_MAP, 0, &Error_Num);
// 2) MOVE#1 작업 등록
ecmSxCfg_SetSpeedPatt(Device_Info.NetIdx, AXIS, ecmSMODE_TRAPE, 0, VEL1, VEL1, ACC, 0, &Error_Num);
ecmSxMot_MoveToStart(Device_Info.NetIdx, AXIS, 300000, &Error_Num);
// 3) 리스트모션 실행 시작
ecmLmCtl_Run (Device_Info.NetIdx, AXIS, & Error_Num);
// 4) MOVE#2 작업 등록
ecmSxCfg_SetSpeedPatt(Device_Info.NetIdx, AXIS, ecmSMODE_TRAPE, VEL1, VEL3, VEL2, ACC, DEC, &Error_Num);
ecmSxMot_MoveToStart(Device_Info.NetIdx, AXIS, 800000, &Error_Num);
// 5) MOVE#3 작업 등록
ecmSxCfg_SetSpeedPatt(Device_Info.NetIdx, AXIS, ecmSMODE_TRAPE, VEL3, 0, VEL3, 0, DEC, &Error_Num);
// StepID를 10으로 설정 => 이후에 등록되는 스텝들은 모두 스텝아이가 10으로 부여된다.
ecmLmCfg_SetStepId (Device_Info.NetIdx, LM_MAP, 0, & Error_Num);
// 마지막 스텝 등록, 이 스텝의 아이디는 10이 된다.
ecmSxMot_MoveToStart(Device_Info.NetIdx, AXIS, 800000, &Error_Num);
// 6) 리스트모션 실행 완료 체크
t_i32 LmRunSts, RunCount, RunStepId;
while(1){
LmRunSts = ecmLmSt_GetRunSts(Device_Info.NetIdx, LM_MAP, &Error_Num);
if(LmRunSts == ecmLM_STS_RUN_COMPT || LmRunSts == ecmLM_STS_DISABLED){
break; // 등록된 리스트모션의 스텝들이 모두 완료되었으므로 상태감시 완료!
}
ecmLmSt_GetRunStepInfo (Device_Info.NetIdx, LM_MAP, &RunCount, &RunStepId, NULL, &Error_Num);
TRACE("%d 번째 스텝이 실행되고 있습니다.\n", RunCount);
if(RunStepId == 10){
TRACE("마지막 스텝이 실행되고 있습니다.\n");
}
Sleep(10);
}
// 7) 리스트모션 기능 비봘성화(종료)
ecmLmCtl_End(Device_Info.NetIdx, LM_MAP, &Error_Num);
}
|