장비&모션제어2012.01.11 00:17
이번 글에서는 아진 라이브러리를 가지고  보정 테이블 기능을 사용시 주의할점에 대해 설명합니다.


1. 보정 테이블 기능은 표준이 아니므로 반드시 담당자에게 새로운 라이브러리를 받아서 사용해야 합니다.
필요한 라이브러리 dll은 다음과 같습니다.
당연하겠지만  lib파일, 헤더파일도 기존 헤더파일을 사용하면 안됩니다.

FS 모듈용
AXTLIB.dll
EzBasic.dll 

QI모듈용
Axl.dll
EzBasicAxl.dll    


2. 아진 프로그램(드라이버)에서 최신 버전을 설치해야 합니다.
아진 다운로드 페이지에서 빨간색으로 표시한 프로그램입니다. (2012.1.11 현재)

EzSoftwareAXT V1.8.18 버전은 FS 모듈을 위한 프로그램 및 드라이버 입니다.
EzSoftwareRM V1.3.3 버전은 QI 모듈을 위한 프로그램 및 드라이버 입니다.


아진 다운로드 링크 



Posted by ICT 이성열

댓글을 달아 주세요

장비&모션제어2012.01.11 00:06



 



이번 글에서는 아진엑스텍 라이브러리에서 보정테이블 기능을 실제 사용하는 방법에 대해 설명합니다.

우리회사에서 실제 장비에 사용하는 루틴은 QI모듈과 FS모듈을 동시에 지원해야 하기 때문에
함수 내부에서 칩 옵션에 따라 각기 다른 아진 함수를 호출하고 있습니다. 
if( m_eChipType == T_QI ) 라고 되어 있는 조건문에서 분기합니다.

처음 작업할때는 QI라이브러리의 
AxmCompensationSet 함수나 FS 라이브러리의 CFS20set_comp_table  의 사용법이 완전히 같을 것이라고 생각했는데.. 막상 헤더 정의를 보니 약간 차이가 있습니다.

FS 라이브러리는 처음과 끝점 간격만 입력하고 보정 테이블을 넣어주는데
QI 라이브러리는 시작 포지션과 각각의 위치 테이블을 직접 배열로 넣어주게 되어 있습니다.
분명 어떤 개선을 위해서 그렇게 수정한 것이겠지만.. 함수의 일관성 측면에서는 아쉬운 부분이 있습니다.
하지만 사용하는데 크게 문제가 될 정도로 어려운 부분은 아니기 때문에 별 상관없은 없습니다.( 1~2분 코딩 시간이 늘어나는  정도이기 때문에 )

  
bool XMotor::SetCompTable(double start_pos, double end_pos, double interval, double *comp_table, int *nTableCnt)
{

  if (m_eChipType == T_QI)
  {
      #define MAX_COMP_DATA 10000
      double adPos[MAX_COMP_DATA];
      ZeroMemory(adPos , sizeof(double) * MAX_COMP_DATA );

      // Position 데이터 만들기
      int count = ((end_pos - start_pos) / interval + 1.);
      
      for (int i=0; i<count; i++)
      {
         adPos[i] = interval*i;
      }

      LOG_PRINTF("XMACHINE", "SetCompTable Axis[%d], count=%d, start_pos=%.3lf" ,m_iAxis, count, start_pos );

      // QI보드 함수는 성공시 0을 리턴
      if( AxmCompensationSet(m_iAxis , count , start_pos, adPos , comp_table , FALSE) == QI::AXT_RT_SUCCESS )
         return true;
      else
         return false;
   }
   else
   {
      return CFS20set_comp_table(m_iAxis, start_pos, end_pos, interval, comp_table, nTableCnt);
   }
}
     


다음은 아주 간단한 함수인 보정테이블을 사용할지 말지 설정하는 기능 함수입니다.

아진측 담당자 말로는 보정테이블을 먼저 세팅하고 사용 여부를 설정하라고 합니다. 
반대로하면 문제가 있을까  호기심은 있지만 그냥 시키는대로만 해보기로 했습니다.

  

//----------------------------------------------------------------------------
// 보정 테이블 사용할지 여부 설정
bool XMotor::SetCompTableUse( bool use)
{
  if (m_eChipType == T_QI)
  {
     return AxmCompensationEnable(m_iAxis, (BOOL)use);
   }
   else
   {
      // QI보드 함수는 성공시 0을 리턴
      if( CFS20set_comp_table_use(m_iAxis, (BOOL)use) == QI::AXT_RT_SUCCESS )
         return true;
      else
         return false;
   }
}
     


보정 테이블 적용을 크게 문제 없이 바로 적용 하여 기능이 정상적으로 동작하는 것을 확인 할 수 있었습니다. 
AxmCompensationEnable 의 리턴 값이 반대로 나오는 현상이 있는데 .. 리턴값이 FALSE로 나와도 정상적으로 보정 테이블 기능이 동작하였습니다. 


 


Posted by ICT 이성열

댓글을 달아 주세요

장비&모션제어2012.01.04 22:34

아진 모션 보드 라이브러리에는 기본적으로 위치 보정(보상)  기능이 없습니다.
업체에서 요청시 기능이 추가된 라이브러리를 보내주어서 위치 제어시 보정된 위치로 이동할 수 있도록 지원을 해주고 있습니다.
그나마 이런 기능이라도 없다면 보정 테이블 계산 기능을 직접 만들어야 하는 것인데.. 라이브러리 수준에서 만들어 놓은것을 보내주니까 모션 제어 개발자가 할 일이 훨씬 줄어들것 같습니다. 

이 글에서는 아래에 FS모듈용 헤더파일에 있는 함수들과  헤더파일 자체에 있는 설명들만 소개합니다.
( QI 모듈용 라이브러리가 별도로 AXL이라고 있으니 그 쪽은 다른 함수와 라이브러리를 사용해야 합니다. )


 





AxtCAMCFS20.h 헤더파일에 있는 내용을 그대로 긁어서 붙였습니다.
이것만 봐도 사용 설명이 필요  없을듯하네요
  

//========= 위치보상테이블 관련함수 ================================================================
    // 보상테이블을 생성하는 함수
    // > axis: 보상테이블을 적용할 축 번호
    // > start_pos: 보상테이블의 시작 위치(기구에서 위치보상영역의 하한위치) ※ end_pos보다 작은값이어야됨.
    // > end_pos: 보상테이블의 종료 위치(기구에서 위치보상영역의 상한위치) ※ start_pos보다 큰값이어야됨.
    // > interval: 보상테이블의 간격을 설정(기구의 절대 위치정도나 관리하고자 하는 위치절대 정도에 따라 조절함)
    // > *comp_table: 보상테이블의 위치보상값 배열 포인트(배열의 갯수는 nTableCnt = (fabs(end_pos - start_pos) / interval) + 1이됨)
    // ※ NOTANDUM
    // - 보상테이블의 앞/뒤 위치에 대한 에러양이 보상테이블의 간격(Interval)을 초과해서는 안됨.
    // - 보상테이블 배열의 개수는 반드시 nTableCnt값과 같거나 커야하며 작을 시 메모리 참조에러가 발생할 수 있음.
    // < *nTableCnt: 보상테이블이 생성된 갯수를 반환(값 반환을 원하지않을 때 0입력하면 됨)
    // { RETURN VALUE }
    // - [0] -> 축번호가 유효하지 않을 때
    // - [0] -> start_pos > end_pos일 때
    // - [0] -> interval이 0일 때
    // - [0] -> *comp_table 포인트가 NULL일 때
    BOOL    PASCAL EXPORT CFS20set_comp_table(INT16 axis, double start_pos, double end_pos, double interval, double *comp_table, int *nTableCnt);
    // 설정한 보상테이블의 사용유무를 지정
    // > axis: 보상테이블의 사용유무를 지정할 축 번호
    // > use: 보상테이블의 사용유무를 지정
    // - [0]DISABLE -> 보상테이블 사용안함
    // - [1]ENABLE -> 보상테이블 사용함
    BOOL    PASCAL EXPORT CFS20set_comp_table_use(INT16 axis, BOOL use);
    BOOL    PASCAL EXPORT CFS20get_comp_table_use(INT16 axis);
    // 설정된 보상테이블의 값을 읽어오는 함수
    // > axis: 보상테이블의 값을 읽을 축 번호
    // > real_pos: 보상테이블 값을 확인 할 실제 위치
    // < *comp_data: 실제 위치에 대한 보상테이블을 이용한 위치에러 보상값
    // { RETURN VALUE }
    // - [-1] -> 보상테이블이 생성되지않았을 때
    // - [-1] -> 입력한 real_pos값이 보상테이블 하한값과 상한값사이에 존재하지않을 때
    // - [**] -> 입력한 real_pos값에 해당되는 보상테이블의 시작 Index값을 반환함
    int     PASCAL EXPORT CFS20get_comp_table_data(INT16 axis, double real_pos, double *comp_data);
    // 지정한 위치에대한 보상값이 반영된 위치를 반환함
    // > axis: 보상값이 적용 될 위치를 확인할 축 번호
    // > real_pos: 보상값이 적용 될 위치값을 확인 할 위치
    // < *comp_pos: 지정한 위치값에 대한 에러보정값이 반영된 위치
    // { RETURN VALUE }
    // - [-1] -> 보상테이블이 생성되지않았을 때
    // - [-1] -> 입력한 real_pos값이 보상테이블 하한값과 상한값사이에 존재하지않을 때
    // - [**] -> 입력한 real_pos값에 해당되는 보상테이블의 시작 Index값을 반환함
    int     PASCAL EXPORT CFS20get_real_to_comp_pos(INT16 axis, double real_pos, double *comp_pos);
    // 지정한 보상위치에 대한 실제위치값을 반환함(사용자가 지정하는 위치)
    // > axis: 보상위치에 대한 실제 위치값을 확인할 축 번호
    // > comp_pos: 실제 위치값을 확인 할 보상위치
    // < *real_pos: 지정한 보상위치에 대한 실제 위치
    // { RETURN VALUE }
    // - [-1] -> 보상테이블이 생성되지않았을 때
    // - [-1] -> 입력한 comp_pos값이 보상테이블 하한값과 상한값사이에 존재하지않을 때
    // - [**] -> 입력한 comp_pos값에 해당되는 보상테이블의 시작 Index값을 반환함
    int     PASCAL EXPORT CFS20get_comp_to_real_pos(INT16 axis, double comp_pos, double *real_pos);
    // 보상값과 상관없이 실제 모션보드에서 출력되고 있는 지령위치
    // > axis: 모션보드에서 출력되고 있는 위치값을 확인할 축 번호
    // { RETURN VALUE }
    // - [**] -> 모터드라이브로 출력한 실제 위치값
    double  PASCAL EXPORT CFS20get_real_command_position(INT16 axis);
    // 보상값과 상관없이 실제 모터에서 반환된 엔코더위치
    // > axis: 모션보드에 입력된 엔코더값을 확인할 축 번호
    // { RETURN VALUE }
    // - [**] -> 모터드라이브에서 입력된 실제 엔코더 값
    double  PASCAL EXPORT CFS20get_real_actual_position(INT16 axis);
     


Posted by ICT 이성열

댓글을 달아 주세요

  1. 홍환민

    이왕이면 Doxygen 형태로 주석을 달아서 문서화했으면 더 좋았을 것 같네요.

    2012.01.23 02:51 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • 표준 라이브러리는 매뉴얼(pdf)을 제공해주긴하는데.. 라이브러리 업체에서 doxygen으로 만들어 주면 전체 소스 문서화하기 좋겠네요

      2012.01.27 11:31 신고 [ ADDR : EDIT/ DEL ]
  2. 안정환

    감사합니다. 보정 관련하여 자료를 찾고 있었는데, 여기서 찾았네요. 감사합니다.

    2013.07.03 11:16 신고 [ ADDR : EDIT/ DEL : REPLY ]