AXC 라이브러리 사용법
1. AXC 개요
모터 드라이버로부터 입력되는 Encoder 신호를 입력 받아 위치 정보를 생성하고 특정한 위치 정보에 따라 트리거 출력 신호를 생성하는 제어 모듈이 CNT(Counter)모듈이다. CNT 모듈은 PC 시스템에 장착되는 Local board type과 Network master와 연결되는 Network slave type이 있다. AXL library에서는 CNT 모듈에 대한 설정 및 정보 확인등의 다양한 API를 제공하는데, 다음의 그룹으로 나뉘어 진다.
보드 및 모듈 정보 확인
입력 신호 설정 및 카운터 정보 관련 설정 및 확인
트리거 기능 관련 설정
범용 입출력 관련 기능
AXC 라이브러리에서 지원하는 제품 내역은 다음과 같다.
모듈 ID(이름) | 설명 | 트리거 기능 | 기타 |
---|---|---|---|
AXT_SIO_CN2CH (VER : 0xB0) | 2CH, 28bit counter | 시간 주기, 절대 위치 | Local type |
AXT_SIO_CN2CH (VER : 0xA6) | 2CH, 28bit counter | 시간 주기, 주기 위치 | Local type |
AXT_SIO_HPC4 (VER < 0xB0) | 4CH, 32bit counter | 시간 주기, 절대 위치, 주기위치 | Local type |
AXT_SIO_RCNT2SIIIH | 2CH, 28bit counter | 주기 위치, 절대 위치 | Network type |
AXT_SIO_RCNT2SIIIH_R | 2CH, 28bit counter | 주기 위치, 절대 위치 | Network type |
AXT_SIO_RCNT2RTEX | 2CH, 28bit counter | 주기 위치, 절대 위치 | Network type |
AXT_SIO_RCNT2MLIII | 2CH, 28bit counter | 주기 위치, 절대 위치 | Network type |
AXT_SIO_RCNT2MLII | 2CH, 32bit counter | 지원하지 않음 | Network type |
AXC 함수의 기본 규칙
모든 AXL 함수의 기본적인 규칙이기도 하지만, AXC 함수군에서도 각각의 함수들은 기본적으로 함수의 수행 결과를 리턴한다. 리턴 값은 아래의 표에서와 같이 해당 함수가 정상적으로 수행되었는지, 아니면 어떠한 이유로 실행되지 못했는지를 알려준다. 함수의 리턴 값을 확인하고자 한다면, 다음과 같이한다.
DWORD Code = AxcInfoIsCNTmodule(&uStatus);
if(Code == AXT_RT_SUCCESS)
printf ("정상적으로 실행되었습니다.”);
else
printf ("AxcInfoIsCNTmodule() : ERROR ( Return FALSE ) code 0x%x\n",Code);
CNT 라이브러리와 관련된 일반적인 리턴값은 다음과 같으며, 이외 다른 리턴 값은 다른 라이브러리와 공통으로 사용된다.
필요한 기능 설정을 위해 매개변수를 통하여 입력하고, 확인이 필요한 값은 변수의 포인터를 입력하여 함수 실행 후 그 결과를 확인하면 된다. 다음의 예제에서는 AxcTriggetSetFucntion 를 실행하기 위해 lChNo와 uMode 값을 설정하고, 이를 확인하기위해 uModeRead의 포인터 값을 사용한다.
long lChNo;
DWORD uMode, uModeRead;
lChNo = 0;
uMode = 1;
AxaTriggerSetFunction(lChNo, uMode); // 설정
AxaTriggerGetFunction(lChNo, &uModeRead); // 확인
AXC 함수 그룹 설명
AXC 함수는 다음과 같은 함수 접두어 그룹으로 나뉜다.
접두 분류 | 설명 |
---|---|
Axc CNT | 모듈 관련 함수 |
AxcInfo | 보드 및 모듈 정보 확인 함수 |
AxcSinal | CNT 모듈 신호 입력 설정 및 확인 함수 |
AxcStatus | CNT 모듈의 현재 Counter 값에 대한 확인 및 설정 함수 |
AxcMot | CNT 모듈의 위치 정보 단위(S/W) 확인 및 설정 함수 |
AxcTrigger | CNT 모듈의 트리거 기능에 대한 설정 및 확인 함수 |
2. 초기화 및 종료
AXL 라이브러리의 초기화 작업은 AxlOpen 함수를 실행함으로써 이루어진다. AxlOpen 함수를 실행하면, 내부적으로 라이브러리의 초기화뿐만 아니라 설치되어 있는 보드 및 보드에 존재하는 모듈을 모두 초기화하게 된다. 그러므로 사용자는 AXC 라이브러리를 사용하기 전에 반드시 CNT 모듈이 존재하는가를 확인하여야 한다.
라이브러리의 초기화
라이브러리의 초기화
AxlOpen: AxlOpen 함수는 라이브러리를 초기화 하는 함수이다. 사용자가 인터럽터를 사용할 경우 인터럽터를 처리할 IRQ 번호를 등록한다.
특히 PCI 타입의 베이스 보드에서는 IRQ번호를 자동으로 생성하므로 라이브러리 초기화 시 입력한 IRQ번호는 무시된다.
이 함수는 리턴 값으로 에러코드가 아닌 BOOL값을 리턴하므로 아래에서처럼 사용할 수 있다.
// 라이브러리를 초기화한다.
// 7은 IRQ를 뜻한다. PCI에서는 자동으로 IRQ가 설정된다.
if (AxlOpen(7) == AXT_RT_SUCCESS)
printf(“라이브러리가 초기화되었습니다.”);
라이브러리 초기화 여부의 확인
AxlIsOpened: AxlIsOpened 함수는 라이브러리의 초기화 여부를 확인하는 함수이다. 이 함수 또한 에러코드가 아닌 BOOL 값을 리턴한다. 라이브러리가 초기화되어 있다면, TRUE를 반환하고, 초기화되어 있지 않다면 FALSE를 리턴한다.
// 라이브러리가 초기화되어 있는지 확인한다.
if (AxlIsOpened())
printf(“라이브러리가 초기화되어 있습니다.”);
else
printf(“라이브러리가 초기화되지 않았습니다.”);
CNT 모듈의 존재 여부 확인
AxcInfoIsCNTModule: AxcInfoIsCNTModule 함수는 실제 CNT 모듈이 존재하는가 여부를 확인하는 함수이다. AIO 관련 함수를 사용하기 전에 AIO 모듈이 있는지를 먼저 확인하기 위해 사용한다. 모듈이 존재하는지를 확인하려면 아래와 같이 한다.
// AIO 모듈이 있는지 확인한다.
DWORD uStatus;
AxcInfoIsCNTModule(&uStatus);
if(uStatus == STATUS_EXIST)
printf("CNT 모듈이 존재합니다.");
else
printf ("CNT 모듈이 존재하지 않습니다.");
CNT 모듈 및 CNT 채널의 개수 확인
AxcInfoGetModuleCount: AxcInfoGetModuleCount 함수는 전체 시스템에 장착되어 있는 CNT 모듈의 개수를 확인하는 함수이다.
// CNT 모듈의 개수를 확인한다.
long lCount;
AxcInfoGetModuleCount(&lCount);
printf(“CNT 모듈의 개수는 %d개입니다.”, lCount);
AxcInfoGetChannelCount: AxcInfoGetChannelCount 함수는 지정한 CNT 모듈에서 채널의 개수를 확인하는 함수이다.
// 0번째 모듈의 CNT 채널 개수를 확인한다.
long lCount;
AxcInfoGetChannelCount(0, &lCount);
printf(“0번째 CNT 모듈의 채널 개수는 %d개 입니다.”, lCount);
AxcInfoGetTotalChannelCount: AxaiInfoGetTotalChannelCount 함수는 전체 CNT 채널의 개수를 확인하는 함수이다.
//등록되어 있는 전체 CNT 채널의 개수를 반환
long lCntChannelCounts;
Code = AxcInfoGetTotalChannelCount(&lCntChannelCounts);
printf(“등록되어 있는 전체 CNT 채널 개수는 %d개입니다.”, lCntChannelCounts);
//지정 CNT 모듈의 정보를 반환
long lBoardNo, lModulePos;
DWORD uMuduleID;
Code = AxcInfoGetModule (0, &lBoardNo, &lModulePos, &uMuduleID);
printf(“0번째 CNT 모듈 : %d 보드, %d 위치, ID : 0x%02X 입니다.\n”, lBoardNo, lModulePos, uModuleID);
AxcInfoGetFirstChannelNoOfModuleNo: AxcInfoGetFirstChannelNoOfModuleNo함수는 지정 CNT 모듈의 첫번째 CNT 채널 번호를 확인하는 함수이다.
//지정 CNT 모듈의 첫번째 CNT 채널 번호를 반환
long lChNo
Code = AxcInfoGetFirstChannelNoOfModuleNo(0, &lChNo);
printf(“0번째 모듈의 첫 번째 채널 번호 : %d\n”, lChNo);
모듈 및 채널 번호의 의미
SIO-HPC4을 기준으로 설명하면 SIO-HPC4 모듈에는 4개의 CNT 채널이 존재한다. 만약 SIO-HPC4 모듈이보드 두 개에 장착되었다면 모듈과 각 채널의 인덱스의 할당 결과는 다음과 같다.
모듈 번호 | 장착 모듈 | 채널 인덱스 |
---|---|---|
0 | SIO-HPC4 | 0~3 |
1 | SIO-HPC4 | 4~7 |
라이브러리의 종료
AxlClose: AxlClose 함수는 라이브러리를 종료하는 함수이다. 라이브러리를 사용한 후에는 마지막에 반드시 종료시켜서 할당된 메모리를 반환하여야 한다. 함수가 정상 실행되어 라이브러리가 종료되면 TRUE를 반환하고, 그렇지 않은 경우에는 FALSE를 반환한다.
// 라이브러리를 종료한다.
if (AxlClose())
printf(“라이브러리가 종료되었습니다.”);
다음은 CNT 모듈을 사용하기 위한 초기화 과정의 프로그램 예이다.
// Ex1_AXC_InitAndClose.cpp : Defines the entry point for the console application.
// 라이브러리를 초기화하고, 입출력 정보를 확인한 후 종료한다.
#include "stdafx.h"
#include "AXL.h"
#include "AXC.h"
#include <conio.h>
#include "stdio.h"
void main(void)
{
// 라이브러리를 초기화한다.
// 7은 IRQ를 뜻한다. PCI에서 자동으로 IRQ가 설정된다.
DWORD Code = AxlOpen(7);
if (Code == AXT_RT_SUCCESS)
{
printf("라이브러리가 초기화되었습니다.\n");
//CNT 모듈이 있는지 검사
DWORD uStatus;
Code = AxcInfoIsCNTModule(&uStatus);
if(Code == AXT_RT_SUCCESS)
{
if(uStatus == STATUS_EXIST)
{
printf("CNT 모듈이 존재합니다.\n");
//CNT 모듈의 개수를 확인
long lModuleCounts;
Code = AxcInfoGetModuleCount(&lModuleCounts);
if (Code == AXT_RT_SUCCESS)
printf("CNT 모듈의 개수 : %d\n",lModuleCounts);
else
printf("AxcInfoGetModuleCounts() : ERRORcode 0x%x\n",Code);
//CNT 채널의 개수를 확인
long lChCounts;
for(int ModuleNo=0;ModuleNo<lModuleCounts;ModuleNo++)
{
Code = AxcInfoGetChannelCount(ModuleNo,&lChCounts);
if (Code == AXT_RT_SUCCESS)
printf ("%d번째 모듈 : CNT 채널 %d개 \n", ModuleNo,lChCounts);
if (Code != AXT_RT_SUCCESS)
printf ("AxcnfoGetChannelcount()) : ERROR code 0x%x\n",Code);
}
//등록되어 있는 전체 CNT 채널의 개수를 반환
long lCntChannelCounts;
Code = AxcInfoGetTotalChannelCount(&lCNTChannelCounts);
printf("등록되어 있는 전체 CNT채널 개수는 %d개입니다.\n", lCNTChannelCounts);
}
else
printf ("AxcInfoIsCNTModule() : ERROR ( NOT STATUS_EXIST ) code 0x%x\n",Code);
}
else
printf ("AxcInfoIsCNTModule() : ERROR ( Return FALSE ) code 0x%x\n",Code);
}
else
printf ("AxlOpen() : ERROR code 0x%x\n",Code);
// 라이브러리를 종료한다.
if (AxlClose())
printf("라이브러리가 종료되었습니다.\n");
else
printf("라이브러리가 정상적으로 종료되지 않았습니다.\n");
}
라이브러리가 초기화 되었습니다.
CNT 모듈이 존재합니다.
CNT 모듈의 개수 : 2
0번째 모듈 : CNT 채널 4개
1번째 모듈 : CNT 채널 4개
3. 트리거 기능 사용
CNT 모듈을 이용하여 외부 인코더 신호로 전달되는 위치 정보를 기준으로 트리거 펄스를 생성할 수 있다. 트리거 펄스를 생성 기능은 사용 방법에 따라 다음의 세가지 방식으로 나뉘어 진다.
1) 시간 주기에 따른 트리거 펄스 생성
2) 지정된 절대 위치에 트리거 펄스 생성
3) 위치 주기에 따른 트리거 펄스 생성
SIO-HPC4를 기준으로 트리거 펄스 생성 기능을 상세히 설명하면 다음과 같다.
시간 주기에 따른 트리거 펄스 생성 기능
필요에 따라 특정한 주파수로 원하는 펄스 폭의 트리거 펄스를 생성할 필요가 있다. 이때 Axc 라이브러리를 다음과 같이 사용하면 시간 주기에 따른 트리거 펄스를 생성할 수 있다.
//라이브러리 초기화 과정 진행 후
AxcTriggerSetEnable(0, FALSE); //트리거 출력 신호를 Disable 한다.
AxcTriggetSetFunction(0, 0x1); //트리거 출력 기능을 시간 주기 모드로 설정한다.
AxcTriggerSetLevle(0, 1); //트리거 출력 레벨을 설정한다.
AxcTriggerSetTime(0, 1000); //트리거 출력 펄스 폭을 1mSec로 설정한다.
AxcTriggerSetFreq(0, 100); // 트리거 출력 주파수를 100hZ로 설정한다.(트리거 발생 주기 10mSec)
AxcTriggetSetEnable(0, TRUE);
시간 주기 모드의 트리거 기능을 중지하기 위해서는 AxcTriggetSetEnable 함수를 이용하여 기능 사용을 중지하면 된다.
지정된 절대 위치에 트리거 펄스 생성
외부 인코더 신호로 생성된 위치 정보를 기준으로 사용자에 의해 지정된 절대 위치에 트리거 펄스를 생성하는 기능이다.
//라이브러리 초기화 과정 진행 후(펄스 단위 위치 정보 관리)
AxcSignalSetEncInputMethod(0, 0x3); // 인코더 입력 방식을 2상 4체배로 설정
// CNT 채널의 현재 위치 정보를 초기화 한다. 필요 따라 Offset 값을 설정할 수 있다.
AxcStatusSetActPos(0, 0);
AxcTriggerSetEnable(0, FALSE); //트리거 출력 신호를 Disable 한다.
AxcTriggetSetFunction(0, 0x2); //트리거 출력 기능을 절대 위치 모드로 설정한다.
AxcTriggerSetLevle(0, 1); //트리거 출력 레벨을 설정한다.
AxcTriggerSetTime(0, 1000); //트리거 출력 펄스 폭을 1mSec로 설정한다.
double dAbsPos[10] = {1000, 2000, 3000, 4000, 5000, 5500, 5600, 7000, 7200, 8000};
AxcTriggetSetAbs(0, 10, dAbsPos, 0); // 트리거 위치 정보를 설정한다.
AxcTriggetSetEnable(0, TRUE);
지정 절대 위치 모드의 트리거 기능을 중지하기 위해서는 AxcTriggetSetEnable 함수를 이용하여 기능 사용을 중지하면 된다.
위치 주기에 트리거 펄스 생성
외부 인코더 신호로 생성된 위치 정보를 기준으로 사용자에 의해 지정된 위치 주기에 따라 트리거 펄스를 생성하는 기능이다.
//라이브러리 초기화 과정 진행 후(펄스 단위 위치 정보 관리)
AxcSignalSetEncInputMethod(0, 0x3); // 인코더 입력 방식을 2상 4체배로 설정
// CNT 채널의 현재 위치 정보를 초기화 한다. 필요 따라 Offset 값을 설정할 수 있다.
AxcStatusSetActPos(0, 0);
AxcTriggerSetEnable(0, FALSE); //트리거 출력 신호를 Disable 한다.
AxcTriggetSetFunction(0, 0x3); //트리거 출력 기능을 절대 위치 모드로 설정한다.
AxcTriggerSetLevle(0, 1); //트리거 출력 레벨을 설정한다.
AxcTriggerSetTime(0, 1000); //트리거 출력 펄스 폭을 1mSec로 설정한다.
AxcTriggetSetBlock(0, 100, 1000, 100); // 트리거 주기 위치 정보를 설정한다.(100 ~ 1000 사이 100 주기)
AxcTriggetSetDirectionCheck(0, 1); // 위치 정보 증가 할 경우에 한하여 트리거 주기 마다 펄스 발생
AxcTriggetSetEnable(0, TRUE);
위치 주기 모드의 트리거 기능을 중지하기 위해서는 AxcTriggetSetEnable 함수를 이용하여 기능 사용을 중지하면 된다.
4. AXC Command 매뉴얼 정보
본 매뉴얼은 아진엑스텍의 CNT 모듈을 Windows OS환경에서 Microsoft VC++6.0 ~ 2015, Visual Basic, Borland C-Builder, Delphi등의 언어에서 구동하기 위해 필요한 매뉴얼이며, 포함된 라이브러리 함수를 기능별로 분류하여 설명하였다.
헤더파일
C++: AXC.h
C#: AXC.cs
Visual Basic: AXC.bas
Delphi: AXC.pas
5. 함수 용어
본 매뉴얼의 함수 이름
본 매뉴얼에서 사용된 함수 이름들은 접두어(Prefix)에 의해 동작을 구분할 수 있도록 되어있다.
라이브러리 함수 Prefix
접두 분류 | 설명 |
---|---|
Axa | Axc 전용 함수임을 나타낸다. Axc로 시작되는 함수들은 모두 Axc.h에 정의되어 있다. |
AxcInfo | 보드 및 모듈 정보 확인 함수 |
Signal | CNT 모듈 입력 신호에 대한 설정 및 확인 |
Trigger | 트리거 기능과 관련된 설정 및 확인 |
Read | 상태 및 값을 읽는다. |
Write | 값을 쓴다. |
Set | 칩의 레지스터나 변수들을 설정한다. |
Get | Set과 한 쌍으로 Set함수에 의해 설정된 변수값을 확인하거나 칩 레지스터의 상태를 읽는다. |
본 매뉴얼의 인자 이름
본 매뉴얼에서 사용된 함수들의 공통적인 인자들은 다음과 같은 의미를 가진다.
long lBoardNo: 초기화된 베이스 보드(Base Board)의 첫 번째 보드부터 오름차순으로 자동 정렬된다.
보드 번호는 ‘0’부터 시작한다.
long lModuleNo: CNT 모듈 초기화 시에 첫 번째 보드의 모듈부터 오름차순으로 자동 정렬된다. 모듈 번호는 ‘0’부터 시작한다.
long lChannelNo: CNT 채널 번호, 채널 번호는 ‘0’부터 시작한다.