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) 의 접두어로 이름 지어진 이송 함수)들은 리스트모션으로 등록할 수 없습니다.

  • 리스트모션으로 등록 가능한 함수들은 아래 표와 같습니다.

리스트 모션으로 등록 사능한 함수 명

ecmSxCfg_SetSpeedPatt

ecmSxCfg_SetJerkRatio

ecmSxMot_MoveStart

ecmSxMot_MoveToStart

ecmIxCfg_MapAxes

ecmIxCfg_UnmapAxes

ecmIxCfg_SetSpeedPatt

ecmIxCfg_SetJerkRatio

ecmIxMot_LineStart

ecmIxMot_LineToStart

ecmIxMot_ArcAng_R_Start

ecmIxMot_ArcAng_A_Start

ecmIxMot_ArcPos_R_Start

ecmIxMot_ArcPos_A_Start

ecmIxMot_Arc3P_R_Start

ecmIxMot_Arc3P_A_Start

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);
 }