인터럽트 함수
이 단원에서는 인터럽트에 관련된 함수들을 소개한다. 인터럽트는 특정 상황이 발생되었을 때 사용자에게 이것을 알려주기 위한 것이다.
인터럽트는 폴링 방식과 달리 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’로 설정한다. 해당 축에 여러 개의 인터럽트 조건을 설정할 수 있다.
예제 코드
// 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 비트의 인터럽트 값을 읽어올 때 사용한다.
예제 코드
// 0축의 펄스 출력 완료 후 인터럽트 발생 여부를 확인.
AxmInterruptSetUserEnable (0, 1 , QIINTBANK2_9);
DWORD uInterruptNum;
AxmInterruptGetUserEnable (0, 1 , &uInterruptNum);