Skip to content

인터럽트 함수

이 단원에서는 인터럽트에 관련된 함수들을 소개한다. 인터럽트는 특정 상황이 발생되었을 때 사용자에게 이것을 알려주기 위한 것이다. 인터럽트는 폴링 방식과 달리 CPU에 부하를 주지 않는 것이 장점이다.
윈도우 환경에서는 일반 Application 레벨에서 인터럽트를 처리할 수 없으므로 이벤트를 통하여 알려준다. 예를 들어, Command 카운터와 Actual 카운터의 편차를 비교하는 비교 기능의 인터럽트를 사용하고 싶다면 사용자가 인터럽트를 설정해놓고 편차의 한계를 지정한 후, 지정한 값보다 큰 편차가 발생하면 인터럽트를 발생하도록 할 수 있다.
AXM에서는 모션 구동 중에 발생하는 여러 이벤트들을 인터럽트 소스로 사용하여 인터럽트를 발생시킬 수 있는데, 축당 32개의 비트로 구성된 인터럽트 BANK라는 레지스터가 각각의 인터럽트 발생 시에 TRUE가 된다.
인터럽트가 발생했을 때 이를 처리하는 방법으로 AXM에서는 콜백 함수 방식, 윈도우 메시지 방식, 이벤트 방식의 3가지를 제공한다. 특히 이벤트 방식은 인터럽트의 발생 여부를 감시하는 특정 스레드나 While문을 이용하므로 시스템 자원을 더 많이 점유하지만, 가장 빠르게 인터럽트를 처리할 수 있다는 장점이 있다.

Note) 인터럽트 관련 기능은 PCI-N804/404에서만 사용할 수 있다.

Function Description
AxmInterruptSetAxis 인터럽트 메시지를 받아오기 위하여 윈도우 메시지 또는 콜백 함수를 사용한다.
AxmInterruptSetAxisEnable ReadInterruptFlag에서 설정된 내부 flag 변수를 읽는다.
AxmInterruptGetAxisEnable 해당 축 모션 모듈의 인터럽트 사용 여부를 설정한다.
AxmInterruptRead 해당 축 모션 모듈의 인터럽트 사용 여부를 반환한다.
AxmInterruptReadAxisFlag 해당 축의 인터럽트 플래그 값을 반환한다.
AxmInterruptSetUserEnable 지정 축의 사용자가 설정한 인터럽트 발생 여부를 설정한다.
AxmInterruptGetUserEnable 지정 축의 사용자가 설정한 인터럽트 발생 여부를 확인한다.

AxmInterruptSetAxis

Purpose

인터럽트 처리 방식에 따라 해당 인자를 설정한다.

A Serviceable Product

BPHR / BPFR BEHR / BEFR PCI-Nx04 PCIe-Nx04
O O O O
PCI-Rxx04 PCIe-Rxx04-RTEX PCI-Rxx04-MLII PCI-Rxx00-MLIII
A4N A5N/A6N PM A4N A5N/A6N PM SGDV SGDV SGD7 PM
O O O
PCI-Rxx04-SIIIH PCIe-Rxx04-SIIIH PCIe-Rxx05-MLIII PCIe-RxxIF-ECAT
MR-J4-B PM MR-J4-B PM SGDV SGD7 PM Servo PM
PCIe-Rxx05-ECAT PCIe-Rxx05-ECAT-E
Servo PM Servo PM

Format

C++
DWORD AxmInterruptSetAxis(long lAxisNo, HWND hWnd, DWORD uMessage, AXT_INTERRUPT_PROC pProc, HANDLE *pEvent);
C#
uint AxmInterruptSetAxis(int lAxisNo, uint hWnd, uint uMessage, CAXHS.AXT_INTERRUPT_PROC pProc, ref uint pEvent);

Parameters

[in/out] Name [Init Value] Explanation
[in]lAxisNo 축 번호(0 ~ (최대 축 수 - 1))
[in]hWnd 윈도우 핸들
[in]uMessage 윈도우 메시지
[in]pProc 콜백 함수
[in]pEvent 이벤트 사용

Return Values

[0000] AXT_RT_SUCCESS : 함수 실행 성공
[4053] AXT_RT_MOTION_NOT_INITIAL_AXIS_NO: 해당 축 모션 초기화 실패
[4101] AXT_RT_MOTION_INVALID_AXIS_NO: 해당 축이 존재하지 않음

Description

해당 축에 설정된 인터럽트 상황이 발생하였을 때 발생 시킬 메시지, 실행할 콜백 함수, 발생시킬 이벤트 핸들을 설정한다. 세 가지 인자 중 한 가지만 설정하여 사용하여야 한다.

예제 코드

// 인터럽트 메시지를 받아오기 위하여 윈도우 메시지 사용.
BEGIN_MESSAGE_MAP(CCAMCIPDlg, CDialog)
    //}}AFX_MSG_MAP
    // 선언함
    ON_MESSAGE(WM_CAMCIP_INTERRUPT,OnTriggerInterrupt)
END_MESSAGE_MAP()

// 인터럽트 발생 시 ‘OnTriggerInterrupt()’ 호출됨.
AxmInterruptSetAxis(0, m_hWnd, NULL, NULL);

AxmInterruptSetAxisEnable

Purpose

설정 축의 인터럽트 사용 여부를 설정한다.

A Serviceable Product

BPHR / BPFR BEHR / BEFR PCI-Nx04 PCIe-Nx04
O O O O
PCI-Rxx04 PCIe-Rxx04-RTEX PCI-Rxx04-MLII PCI-Rxx00-MLIII
A4N A5N/A6N PM A4N A5N/A6N PM SGDV SGDV SGD7 PM
O O O
PCI-Rxx04-SIIIH PCIe-Rxx04-SIIIH PCIe-Rxx05-MLIII PCIe-RxxIF-ECAT
MR-J4-B PM MR-J4-B PM SGDV SGD7 PM Servo PM
PCIe-Rxx05-ECAT PCIe-Rxx05-ECAT-E
Servo PM Servo PM

Format

C++
DWORD AxmInterruptSetAxisEnable(long lAxisNo, DWORD uUse);
C#
uint AxmInterruptSetAxisEnable(int lAxisNo, uint uUse);

Parameters

[in/out] Name [Init Value] Explanation
[in]lAxisNo 축 번호(0 ~ (최대 축 수 - 1))
[in]uUse [00h]인터럽트 설정 여부 : FALSE & TRUE
- [00h]인터럽트 사용 안 함
- [01h]인터럽트 사용함

Return Values

[0000] AXT_RT_SUCCESS : 함수 실행 성공
[4053] AXT_RT_MOTION_NOT_INITIAL_AXIS_NO: 해당 축 모션 초기화 실패
[4101] AXT_RT_MOTION_INVALID_AXIS_NO: 해당 축이 존재하지 않음

Description

해당 축의 인터럽트 발생 여부를 설정한다. 해당 축의 전체 인터럽트 조건에 대한 사용 여부를 설정 할 수 있다. 설정 축에 대한 Global interrupt mask 를 설정한다.

예제 코드

// 0번 축 인터럽트 사용 설정.
AxmInterruptSetAxisEnable(0, ENABLE);

// 0번 축 인터럽트 사용 설정 확인.
DWORD uIntUse;
AxmInterruptGetAxisEnable(0, &uIntUse);

AxmInterruptGetAxisEnable

Purpose

해당 축의 인터럽트 사용 여부 설정을 반환한다.

A Serviceable Product

BPHR / BPFR BEHR / BEFR PCI-Nx04 PCIe-Nx04
O O O O
PCI-Rxx04 PCIe-Rxx04-RTEX PCI-Rxx04-MLII PCI-Rxx00-MLIII
A4N A5N/A6N PM A4N A5N/A6N PM SGDV SGDV SGD7 PM
O O O
PCI-Rxx04-SIIIH PCIe-Rxx04-SIIIH PCIe-Rxx05-MLIII PCIe-RxxIF-ECAT
MR-J4-B PM MR-J4-B PM SGDV SGD7 PM Servo PM
PCIe-Rxx05-ECAT PCIe-Rxx05-ECAT-E
Servo PM Servo PM

Format

C++
DWORD AxmInterruptGetAxisEnable(long lAxisNo, DWORD *upUse);
C#
uint AxmInterruptGetAxisEnable(int lAxisNo, ref uint upUse);

Parameters

[in/out] Name [Init Value] Explanation
[in]lAxisNo 축 번호(0 ~ (최대 축 수 - 1))
[out]upUse [00h]인터럽트 설정 여부 : FALSE & TRUE
- [00h]인터럽트 사용 안 함
- [01h]인터럽트 사용함

Return Values

[0000] AXT_RT_SUCCESS : 함수 실행 성공
[4053] AXT_RT_MOTION_NOT_INITIAL_AXIS_NO: 해당 축 모션 초기화 실패
[4101] AXT_RT_MOTION_INVALID_AXIS_NO: 해당 축이 존재하지 않음

Description

AxmInterruptSetAxisEnable 설정한 해당 축의 인터럽트 사용 여부 설정을 반환한다.

예제 코드

// 0번 축 인터럽트 사용 설정.
AxmInterruptSetAxisEnable(0, ENABLE);

// 0번 축 인터럽트 사용 설정 확인
DWORD uIntUse;
AxmInterruptGetAxisEnable(0, &uIntUse);

AxmInterruptRead

Purpose

인터럽트 발생 여부를 반환한다.

A Serviceable Product

BPHR / BPFR BEHR / BEFR PCI-Nx04 PCIe-Nx04
O O O O
PCI-Rxx04 PCIe-Rxx04-RTEX PCI-Rxx04-MLII PCI-Rxx00-MLIII
A4N A5N/A6N PM A4N A5N/A6N PM SGDV SGDV SGD7 PM
O O O
PCI-Rxx04-SIIIH PCIe-Rxx04-SIIIH PCIe-Rxx05-MLIII PCIe-RxxIF-ECAT
MR-J4-B PM MR-J4-B PM SGDV SGD7 PM Servo PM
PCIe-Rxx05-ECAT PCIe-Rxx05-ECAT-E
Servo PM Servo PM

Format

C++
DWORD AxmInterruptRead(long *lpAxisNo, DWORD *upFlag);
C#
uint AxmInterruptRead(ref int lpAxisNo, ref uint upFlag);

Parameters

[in/out] Name [Init Value] Explanation
[in]lAxisNo 축 번호(0 ~ (최대 축 수 - 1))
[out]upFlag 인터럽트 설정 여부 : FALSE & TRUE
- [00h]인터럽트 발생하지 않음
- [01h]인터럽트 발생함

Return Values

[0000] AXT_RT_SUCCESS : 함수 실행 성공
[4053] AXT_RT_MOTION_NOT_INITIAL_AXIS_NO: 해당 축 모션 초기화 실패
[4101] AXT_RT_MOTION_INVALID_AXIS_NO: 해당 축이 존재하지 않음

Description

이벤트 방식의 인터럽트 처리 루틴에서 현재 발생된 이벤트의 축 위치와 해당 축이 속한 모듈의 인터럽트 Flag를 확인한다.

예제 코드

//해당 축의 인터럽트 발생 여부를 반환한다.
Long lAxisNo;
DWORD uFlag;
AxmInterruptRead(&lAxisNo, &uFlag);

AxmInterruptReadAxisFlag

Purpose

해당 축의 인터럽트 플래그 값을 반환한다.

A Serviceable Product

BPHR / BPFR BEHR / BEFR PCI-Nx04 PCIe-Nx04
O O O O
PCI-Rxx04 PCIe-Rxx04-RTEX PCI-Rxx04-MLII PCI-Rxx00-MLIII
A4N A5N/A6N PM A4N A5N/A6N PM SGDV SGDV SGD7 PM
O O O
PCI-Rxx04-SIIIH PCIe-Rxx04-SIIIH PCIe-Rxx05-MLIII PCIe-RxxIF-ECAT
MR-J4-B PM MR-J4-B PM SGDV SGD7 PM Servo PM
PCIe-Rxx05-ECAT PCIe-Rxx05-ECAT-E
Servo PM Servo PM

Format

C++
DWORD AxmInterruptReadAxisFlag(long lAxisNo, long lBank, DWORD *upFlag);
C#
uint AxmInterruptReadAxisFlag(int lAxisNo, int lBank, ref uint upFlag);

Parameters

[in/out] Name [Init Value] Explanation
[in]lAxisNo 축 번호(0 ~ (최대 축 수 - 1))
[in]lBank 해당 축의 인터럽트 뱅크 번호
(0: Bank1 , 1:Bank2)
[out]upFlag 인터럽트 발생 상태 값 : FALSE & TRUE
- [00h]인터럽트 발생하지 않음
- [01h]인터럽트 발생함

Return Values

[0000] AXT_RT_SUCCESS : 함수 실행 성공
[4053] AXT_RT_MOTION_NOT_INITIAL_AXIS_NO: 해당 축 모션 초기화 실패
[4101] AXT_RT_MOTION_INVALID_AXIS_NO: 해당 축이 존재하지 않음

Description

사용하는 모션 모듈에 장착된 모션 칩에는 32 비트 인터럽트 플래그 레지스터가 2 개의 뱅크로 존재한다.
각각의 뱅크의 인터럽트 플래그 값을 확인하여 출력된 인터럽트의 원인을 확인할 수 있다.
이 함수로 확인한 값은 인터럽트 처리 루틴 안에서만 유효하며, 그 외의 경우 함수 출력값은 최후의 인터럽트 발생 결과로 해석된다.

참고 : AXT_MOTION_QIINTERRUPT_BANK1_DEF, AXT_MOTION_QIINTERRUPT_BANK2_DEF

예제 코드

//해당 축의 1번 뱅크의 인터럽트 플래그 값을 반환한다.
Long upAxisNo;
DWORD upFlag;

AxmInterruptReadAxisFlag(&upAxisNo, 0, &upFlag);

AxmInterruptSetUserEnable

Purpose

지정 축에 사용자가 원하는 인터럽트의 발생 여부를 설정한다.

A Serviceable Product

BPHR / BPFR BEHR / BEFR PCI-Nx04 PCIe-Nx04
O O O O
PCI-Rxx04 PCIe-Rxx04-RTEX PCI-Rxx04-MLII PCI-Rxx00-MLIII
A4N A5N/A6N PM A4N A5N/A6N PM SGDV SGDV SGD7 PM
PCI-Rxx04-SIIIH PCIe-Rxx04-SIIIH PCIe-Rxx05-MLIII PCIe-RxxIF-ECAT
MR-J4-B PM MR-J4-B PM SGDV SGD7 PM Servo PM
PCIe-Rxx05-ECAT PCIe-Rxx05-ECAT-E
Servo PM Servo PM

Format

C++
DWORD AxmInterruptSetUserEnable(long lAxisNo, long lBank, DWORD uInterruptNum);
C#
uint AxmInterruptSetUserEnable(int lAxisNo, int lBank, uint uInterruptNum);

Parameters

[in/out] Name [Init Value] Explanation
[in]lAxisNo 축 번호(0 ~ (최대 축 수 - 1))
[in]lBank 사용자가 원하는 인터럽트 뱅크 번호(0,1) :
AXT_MOTION_QIINTERRUPT_BANK1_DEF
AXT_MOTION_QIINTERRUPT_BANK2_DEF
[in]uInterruptNum 사용자가 원하는 인터럽트 Bit 조합(0Bit– 31Bit)

Return Values

[0000] AXT_RT_SUCCESS : 함수 실행 성공
[4053] AXT_RT_MOTION_NOT_INITIAL_AXIS_NO: 해당 축 모션 초기화 실패
[4101] AXT_RT_MOTION_INVALID_AXIS_NO: 해당 축이 존재하지 않음

Description

해당 축의 인터럽트 발생 종류를 설정한다. 각 축의 해당 제품에 대한 인터럽트 종류는 다음의 표를 참조하여 원하는 인터럽트 발생 조건에 해당하는 bit 를 ‘1’로 설정한다. 해당 축에 여러 개의 인터럽트 조건을 설정할 수 있다.

interrupt

예제 코드

// 0축의 펄스 출력 완료 후 인터럽트 발생 여부를 확인.
AxmInterruptSetUserEnable (0, 1 , QIINTBANK2_9);
DWORD uInterruptNum;

AxmInterruptGetUserEnable (0, 1 , &uInterruptNum);

AxmInterruptGetUserEnable

Purpose

지정 축에 사용자가 원하는 인터럽트 조건 사용 여부를 확인한다.

A Serviceable Product

BPHR / BPFR BEHR / BEFR PCI-Nx04 PCIe-Nx04
O O O O
PCI-Rxx04 PCIe-Rxx04-RTEX PCI-Rxx04-MLII PCI-Rxx00-MLIII
A4N A5N/A6N PM A4N A5N/A6N PM SGDV SGDV SGD7 PM
PCI-Rxx04-SIIIH PCIe-Rxx04-SIIIH PCIe-Rxx05-MLIII PCIe-RxxIF-ECAT
MR-J4-B PM MR-J4-B PM SGDV SGD7 PM Servo PM
PCIe-Rxx05-ECAT PCIe-Rxx05-ECAT-E
Servo PM Servo PM

Format

C++
DWORD AxmInterruptGetUserEnable(long lAxisNo, long lBank, DWORD *upInterruptNum);
C#
uint AxmInterruptGetUserEnable(int lAxisNo, int lBank, ref uint upInterruptNum);

Parameters

[in/out] Name [Init Value] Explanation
[in]lAxisNo 축 번호(0 ~ (최대 축 수 - 1))
[in]lBank 사용자가 원하는 인터럽트 뱅크 번호(0,1) :
AXT_MOTION_QIINTERRUPT_BANK1_DEF
AXT_MOTION_QIINTERRUPT_BANK2_DEF
[out]upInterruptNum 사용자가 원하는 인터럽트 번호(0 – 31) : AXT_USE
- [00h]인터럽트 사용 안 함
- [01h]인터럽트 사용함

Return Values

[0000] AXT_RT_SUCCESS : 함수 실행 성공
[4053] AXT_RT_MOTION_NOT_INITIAL_AXIS_NO: 해당 축 모션 초기화 실패
[4101] AXT_RT_MOTION_INVALID_AXIS_NO: 해당 축이 존재하지 않음

Description

AxmInterruptSetUserEnable로 설정한 32 비트의 인터럽트 값을 읽어올 때 사용한다.

interrupt

예제 코드

// 0축의 펄스 출력 완료 후 인터럽트 발생 여부를 확인.
AxmInterruptSetUserEnable (0, 1 , QIINTBANK2_9);
DWORD uInterruptNum;
AxmInterruptGetUserEnable (0, 1 , &uInterruptNum);