콘텐츠로 바로 가기

Application Note: Designing Signal Processing Applets for Programmable Frame Grabbers#

모든 프로그래머블 프레임 그래버는 그래픽 기반 FPGA 프로그래밍 환경인 VisualApplets를 사용하여 사용자가 직접 개별 이미지 처리 솔루션(applet)을 프로그래밍할 수 있도록 설계되었습니다.

VisualApplets의 GPI/GPO 연산자#

VisualApplets를 사용하면 애플리케이션에 특화된 자신만의 트리거 시스템을 설계할 수 있습니다. 예를 들어, 어떤 신호가 어떤 개별 물리적 입출력 핀에 의해 송수신되는지 결정할 수 있습니다.

VisualApplets에서는 개별 핀을 앱릿 디자인에 연결하기 위해 두 가지 연산자를 사용할 수 있습니다.

연산자 GPI (트리거 입력 신호용)

연산자 GPO (트리거 출력 신호용)

GPI 및 GPO 연산자를 사용한 VisualApplets 디자인

위 그림은 신호 처리를 구현하는 방법의 예를 보여줍니다. 구현하려는 신호 처리 기능은 특정 요구 사항에 따라 다릅니다. 애플리케이션에 적합한 연산자를 찾으려면 Signal Library를 방문하십시오. 또한 요구 사항에 따라 전면 GPIO를 선택하십시오.

위의 예는 두 개의 입력 신호에 대한 다운스케일링 기능을 보여줍니다. 두 개의 신호가 GPI1 및 Front GPI0에서 프로그래머블 프레임 그래버로 입력됩니다. 신호는 먼저 디바운스(debounced)되고, 상승 또는 하강 에지가 선택되며, 그 후 신호는 8 또는 3의 팩터만큼 다운스케일링됩니다. 두 신호 모두에 대해 신호 길이가 설정된 후, 신호는 FrontGPO0, GPO1, GPO2 및 카메라로 전달되어 이미지 취득을 제어합니다.

GPI/GPO 연산자 사용#

Front GPIO 또는 Trigger Extension Board에서 사용하려는 각 trigger IN / trigger OUT 핀을 GPI/GPO operator 인스턴스와 상호 연결해야 합니다.

정보

operator GPI와 operator GPO는 동일한 기능을 가지므로, 이하에서는 두 operator를 함께 설명합니다.

  1. 디자인 내의 operator 아이콘을 더블 클릭하여 Module Properties 창을 엽니다.

VisualApplets GPI Operator

Module Properties 창이 열립니다:

VisualApplets Module Properties 창

보시다시피, 해당 operator에는 두 가지 파라미터가 있습니다:

  • Pin_ID: Pin_ID 파라미터를 사용하면 선택한 커넥터에서 지정할 개별 핀을 정의할 수 있습니다.
  • ConnectorType: ConnectorType 파라미터를 사용하면 지정할 커넥터(Front GPIO 또는 GPIO를 통한 Trigger Extension Board)를 정의할 수 있습니다.

정보

CXP-12 frame grabbers의 경우, ConnectorType 파라미터가 포함되어 있습니다. Pin_ID 파라미터에 HTML 로그 파일(*.html)의 경로와 이름을 지정할 수 있습니다.

Parameter Connector Type#

이 파라미터를 통해 15핀 D-Sub 소켓에 제공되는 트리거 핀 그룹(Front GPIO) 또는 Trigger Extension Board에 제공되는 트리거 핀 그룹(GPIO) 중 지정할 트리거 핀 그룹을 정의할 수 있습니다. 이 파라미터의 값 범위는 {Front GPIO, GPIO}입니다.

Value Front GPIO#

값을 선택하는 경우 Front GPIO, 프로그래머블 frame grabber의 슬롯 브래킷에 있는 다음 커넥터(트리거 핀 그룹)를 지정하게 됩니다:

Frame Grabber의 Front GPIO

Value GPIO#

값을 선택하는 경우 GPIO, 프로그래머블 frame grabber의 다음 트리거 핀 그룹을 지정하게 됩니다:

Frame Grabber의 GPIO

GPIO는 Trigger Extension Board에 연결하는 데 사용됩니다:

GPIO를 통한 Trigger Board 연결

Parameter Pin_ID#

이 파라미터를 사용하면 선택한 커넥터(트리거 핀 그룹)에서 지정할 개별 핀을 정의할 수 있습니다. 파라미터의 값 범위 Pin_ID is {0;7} or {0;3} for connector type GPIO 또는 Front GPIO.

정보

파라미터의 값 범위 Pin_ID for marathon frame grabbers and operator GPO is {0;1}.

VisualApplets 연산자 참조를 포함한 전면 GPIO의 핀 구성#

Front GPIO 핀

VisualApplets 연산자 참조를 포함한 전면 GPIO의 핀 구성

차동 모드에서 핀 9는 Pin_ID=3인 GPI operator에서 하나의 싱글 엔드 신호를 수신하는 데 사용할 수 있으며, 모드 "Differential"(기본값)을 참조하십시오.

주의

프레임 그래버 트리거 시스템은 Voltage IN 핀에 공급 전압을 받아야 합니다. PWR 핀이 없는 장치를 연결하려면 외부 소스에서 Voltage IN 핀으로 전원 공급을 제공해야 합니다.

전면 GPIO의 Trigger INPUT#

만약 당신이

  • 사용 중인 GPI operator(트리거 입력 신호 정의용),
  • 설정된 매개변수 Connector Type 에서 Front GPIO,

매개변수의 값 Pin_ID 다음 핀 지정:

핀 ID가 포함된 Front GPIO

Front GPIO의 입력(GPI) 핀은 설정 가능합니다. 6개의 입력 핀을 사용하여 다음 중 하나를 수신할 수 있습니다.

  1. 3개의 차동 신호, 또는
  2. 2개의 차동 신호 및 1개의 싱글 엔드 신호, 또는
  3. 4개의 싱글 엔드 신호.

특정 신호 유형(차동 또는 싱글 엔드)에 대해 Front GPIO의 입력 핀을 설정하려면 두 가지 모드를 사용할 수 있습니다.

  • Mode Differential (옵션 a 및 b 제공)
  • Mode Single-ended (옵션 c 제공)

Front GPIO의 기본 모드는 다음 모드입니다. Differential. 모드 전환 방법에 대해서는 다음 항목을 참조하십시오. Input Configuration 프레임 그래버 설명서.

주의

기본 설정에서 Front GPIO의 GPIO 핀은 다음을 제공합니다.

  • 풀업 모드의 차동 입력 신호 3개 또는 차동 입력 신호 2개 및 싱글 엔디드 입력 신호 1개
  • 두 개의 TTL 출력 신호

입력 신호의 다른 설정이 필요한 경우, 즉:

  • Pull-down 모드,
  • 4개의 싱글 엔드 신호(차동 신호 없음),

요구 사항에 따라 GPI를 쉽게 설정할 수 있습니다. 설정하려면 Framegrabber SDK와 함께 시스템에 설치된 명령줄 도구를 사용합니다.

Mode Differential (기본값)#

모드에서 Differential (기본값) Front GPIO의 6개 입력 핀 모두 차동 신호를 수신하도록 구성됩니다.

  • 핀 8/9 -> 차동 신호 1개
  • 핀 11/12 -> 차동 신호 1개
  • 핀 13/14 -> 차동 신호 1개

또는 핀 쌍 8/9를 사용하여(모드 Differential에서) 단일 종단 신호 1개를 수신할 수도 있습니다.

  • 핀 9 -> 단일 종단 신호 1개
  • 핀 11/12 -> 차동 신호 1개
  • 핀 13/14 -> 차동 신호 1개

모드에서의 개별 핀 Differential:

"Differential" 모드에서의 개별 핀

핀 11 및 12:

  • 핀 11 및 12로 들어오는 신호는 하나의 차동 신호로 해석됩니다(핀 11은 +, 핀 12는 - 값).
  • VisualApplets 내에서 이 차동 신호를 수신하려면 Pin_ID = 0인 GPI operator 인스턴스를 사용하십시오.

핀 13 및 14:

  • 핀 13 및 14로 들어오는 신호는 하나의 차동 신호로 해석됩니다(핀 13은 +, 핀 14는 - 값).
  • VisualApplets 내에서 이 차동 신호를 수신하려면 Pin_ID = 1인 GPI operator 인스턴스를 사용하십시오.

핀 8 및 9:

  • 핀 8 및 9로 들어오는 신호는 하나의 차동 신호로 해석됩니다(핀 8은 +, 핀 9는 - 값).
  • VisualApplets 내에서 이 차동 신호를 수신하려면 Pin_ID = 2인 GPI operator 인스턴스를 사용하십시오.

또는 모드에도 불구하고 핀 쌍 8/9를 사용하여 단일 종단 신호 1개를 수신할 수 있습니다 Differential): 이 경우,

  • 단일 종단 입력 신호를 물리적 핀 9에 연결합니다.
  • VisualApplets 내에서 이 단일 종단 신호를 수신하려면 Pin_ID = 3인 GPI operator 인스턴스를 사용하십시오.

Mode Single-Ended#

모드에서 Single-ended (구성 가능) Front GPIO의 6개 입력 핀은 4개의 단일 종단 신호를 수신하도록 구성됩니다.

  • Pin 8 -> 1개의 싱글 엔디드(single-ended) 신호
  • 핀 9 -> 단일 종단 신호 1개
  • Pin 11 -> 1개의 싱글 엔디드(single-ended) 신호
  • Pin 13 -> 1개의 싱글 엔디드(single-ended) 신호

모드에서의 개별 핀 Single-ended:

"Single-ended" 모드에서의 개별 핀

Pin 11 및 Pin 12의 신호:

  • Pin 11의 입력 신호는 싱글 엔디드 신호로 해석됩니다.
  • VisualApplets 내에서 이 싱글 엔디드 신호를 수신하려면 Pin_ID = 0인 GPI operator 인스턴스를 사용하십시오.
  • Pin 12는 해당 모드에서 사용되지 않습니다. Single-ended.

Pin 13 및 Pin 14의 신호:

  • Pin 13의 입력 신호는 싱글 엔디드 신호로 해석됩니다.
  • VisualApplets 내에서 이 싱글 엔디드 신호를 수신하려면 Pin_ID = 1인 GPI operator 인스턴스를 사용하십시오.
  • Pin 14는 해당 모드에서 사용되지 않습니다. Single-ended.

핀 8 및 9:

  • Pin 8 및 Pin 9의 입력 신호는 두 개의 싱글 엔디드 신호로 해석됩니다.
  • VisualApplets 내에서 이러한 싱글 엔디드 신호를 수신하려면 다음을 사용하십시오.

    • Pin 8의 경우 Pin_ID = 2인 GPI operator 인스턴스, 그리고
    • Pin 9의 경우 Pin_ID = 3인 GPI operator 인스턴스.

트리거 OUTPUT TTL Front GPIO#

만약 당신이

  • 트리거 출력 신호를 정의하려면 GPO operator를 사용하고,
  • Connector Type 파라미터를 Front GPIO로 설정한 경우,

Pin_ID 파라미터 값은 다음 핀을 지정합니다.

Front GPIO TTL 출력 Pin-ID

이 두 핀은 TTL 신호(5V)를 전송합니다.

Front GPIO의 출력 TTL 신호(5V):

Front GPIO의 출력 TTL 신호(5V)

Trigger Extension Board를 지정하는 트리거 신호 (GPIO를 통해)#

GPIO 커넥터는 Trigger Extension Board에 연결하도록 설계된 프로그래머블 프레임 그래버의 물리적 트리거 인터페이스입니다.

프레임 그래버 및 트리거 보드의 GPIO

GPIO 커넥터(즉, 각 Trigger Extension Board)는 다음을 제공합니다.

  • 8개의 디지털 입력(IN 0 - 7)(8개의 싱글 엔드 신호 또는 4개의 차동 신호)
  • 8개의 디지털 출력(OUT 0 - 7)

8개의 입력에는 0부터 7까지의 인덱스가 지정되어 있습니다. 8개의 출력에도 마찬가지로 0부터 7까지의 인덱스가 지정되어 있습니다.

핀 배치에 대한 자세한 내용은 Pin Layout on SUB-D15 - TTL Trigger Board 또는 PIN Layout Opto-Coupled Trigger 5 - Opto-Coupled Trigger 5 Board 확장 보드를 참조하십시오.

Pin_ID TTL Trigger Extension Board에서의 할당#

포트 A#

핀 번호 Pin_ID VisualApplets에서의 할당
1 0
2 1
3 2
4 3
5
6
7
8
9
10
11 0
12 1
13 2
14 3
15 0

포트 B#

핀 번호 Pin_ID VisualApplets에서의 할당
(싱글 엔드 신호)
1 4
2 5
3 6
4 7
5
6
7
8
9
10
11 4
12 5
13 6
14 7
15

Pin_ID Opto Trigger 5 Extension Board에서의 할당#

포트 A#

핀 번호 Pin_ID VisualApplets에서의 할당
(싱글 엔드 신호)
Pin_ID VisualApplets에서의 할당
(차동 신호)
1 0
2 1
3 2
4 3
5
6
7
8
9
10
11 0 0
12 1 0
13 2 2
14 3 2
15

포트 B#

핀 번호 Pin_ID VisualApplets에서의 할당
(싱글 엔드 신호)
Pin_ID VisualApplets에서의 할당
(차동 신호)
1 4
2 5
3 6
4 7
5
6
7
8
9
10
11 4 4
12 5 4
13 6 6
14 7 6
15

트리거 시스템 구성#

트리거 구성에 액세스하는 방법에는 두 가지가 있습니다.

  • microDisplay X: 여기서 GUI를 통해 트리거 매개변수 값을 입력하여 특정 구성의 결과를 확인할 수 있습니다.
  • SDK: 프레임 그래버 프로그래밍 인터페이스를 특정 이미지 처리 소프트웨어 애플리케이션에 구현하기 위한 용도입니다.

트리거 시스템에 대한 요구 사항은 애플리케이션에 따라 다릅니다.

  • Area Scan의 경우 하나의 트리거 타입(프레임 트리거)만 필요합니다.
  • Line Scan의 경우 라인 트리거(각 라인마다 트리거 펄스 전송)와 프레임 트리거의 두 가지 트리거 타입이 필요합니다. Line Scan 애플리케이션에서 프레임 트리거는 이미지에 추가될 라인 수를 제어합니다.

영역 및 라인 스캔 카메라 트리거 방법에 대한 자세한 내용은 여기에서 확인할 수 있습니다.

정보

프레임 그래버 트리거 시스템에 대한 자세한 내용은 GPIO Connectors 항목을 참조하십시오.

정보

사용 가능한 매개변수 및 특정 설정이 미치는 영향에 대한 정보는 사용 중인 애플릿의 문서를 참조하십시오.

하드웨어에서 Applet 실행#

사전 요구 사항:

프로그래머블 프레임 그래버에서 애플릿을 실행하려면 먼저 다음을 복사해야 합니다. *.hap file (applet) into the Basler Framegrabber SDK installation on your host PC and flash it onto your programmable frame grabber.

정보

Flashing은 marathon frame grabbers에만 필요합니다.

VisualApplets 설계를 하드웨어 앱릿으로 변환하는 방법에 대한 자세한 내용은 Hardware Applet: From Idea to Application에서 확인할 수 있습니다.

  1. Copy the *.hap file that you have built in VisualApplets into the directory [Framegrabber SDK installation directory]/Hardware Applets/[frame grabber model]. If there is no subdirectory with the programmable frame grabber model name, create it. If you have used the default settings in VisualApplets, you will find your *.hap file in your VisualApplets installation directory, subdirectory Designs.

  2. Flashing에 설명된 대로 프로그래머블 프레임 그래버에 앱릿을 설치합니다.

이 작업을 완료한 후 다음을 수행할 수 있습니다.

  • Framegrabber SDK에 포함된 Basler 도구인 microDisplay X를 사용하여 앱릿을 테스트하고 앱릿의 이미지 처리 결과를 직접 확인할 수 있습니다. Configuring the Applet (microDisplay X) 항목을 참조하십시오.

예: 신호 처리 예제 디자인의 하드웨어 앱릿을 microDisplay X로 로드하면 아래 그림과 같이 파라미터 트리에서 축소 비율(downscaling factor) 및 신호 너비와 같은 동적 파라미터를 설정할 수 있습니다.

신호 처리 디자인 예제

사용자 소프트웨어에서 앱릿 시작#

자체 소프트웨어에서 앱릿 사용을 시작하려면 다음을 수행하십시오.

  1. Basler 애플리케이션 프로그래밍 인터페이스에서 호출 Fg_Init 을(를) 사용하여 앱릿을 시작합니다. 위치 경로를 지정합니다. *.hap VisualApplets로 생성한 파일입니다.

사용 가능한 모든 함수 호출에 대한 자세한 설명과 레퍼런스는 Framegrabber API Manual 및 Framegrabber API Function Reference를 참조하십시오.

C++ SDK의 기반으로 VisualApplets 내부 SDK 코드 생성기를 사용할 수 있습니다. 이 생성기는 VisualApplets의 아이콘 메뉴 또는 Build 및 Generate SDK example에서 찾을 수 있습니다. 이 함수는 해당 CMake 파일과 VisualStudio 프로젝트 파일을 자동으로 생성합니다(Hardware Applet: From Idea to Application 참조).

자동 SDK 코드에는 이미지 취득 및 파라미터 구성에 필요한 다음과 같은 기능 블록이 포함되어 있습니다.

  • 프레임 그래버 초기화
  • 버퍼용 메모리 할당
  • 정의 Get 및 Set 매개변수
  • 디스플레이 생성
  • 존재하는 각 포트에 대한 앱릿 및 카메라의 취득 시작
  • 이미지 그랩
  • 취득 중지
  • 디스플레이 닫기
  • 버퍼 메모리 해제
  • Frame grabber 초기화 해제

다음은 신호 처리 예제에 대한 C++ Framegrabber API 예제 코드입니다.

  • Frame Grabber 초기화 및 버퍼 메모리 할당:
int main ()
{

    // ---------------------------------------------------------------------------
    // Frame Grabber: Initialization
    // ---------------------------------------------------------------------------


    int nrOfCycles = 5000; // Acquire 5000 frames, TODO: insert the number according to your needs
    unsigned int boardIndex = 0; // TODO: Use the correct board index at multi frame grabber systems
    int rc = 0; // return code

    Fg_Struct* fg = Fg_Init("SignalProcessingDesign.hap", boardIndex);
    if(fg == NULL){
        fprintf(stderr, "Error in Fg_Init(): %s\n", Fg_getLastErrorDescription(NULL));
        fprintf(stderr, "Press <Return> to continue...\n");
        getchar();
        return -1;
    }

    int nrOfParameter = Fg_getNrOfParameter(fg);
    fprintf(stderr, "No. of Parameter: %d\n", nrOfParameter);

    int i;
    for (i = 0; i < nrOfParameter; i++) {
        const char *name = Fg_getParameterName(fg,i);
        fprintf(stderr," Param %d: %s,%x\n",i,name,Fg_getParameterId(fg,i));
    }


    / ---------------------------------------------------------------------------
    // Frame Grabber: Allocate memory for buffer(s)
    // ---------------------------------------------------------------------------


    // Feature Cnt 0,0
    int width0 = 1024;
    int height0 = 1024;
    int byteWidth0 = 1;
    size_t bufSize0 = width0 * height0 * (size_t)byteWidth0;
    const unsigned int mem0_bufs = 4;
    dma_mem *pmem0 = Fg_AllocMemEx(fg, bufSize0 * mem0_bufs, mem0_bufs);
    if(pmem0 == NULL){
        fprintf(stderr, "Error in Fg_AllocMemEx(): %s\n", Fg_getLastErrorDescription(fg));
        Fg_FreeGrabber(fg);
        fg = NULL;
        fprintf(stderr, "Press <Return> to continue...\n");
        getchar();
        return -1;
    }
  • 다음은 Get 및 Set 파라미터 섹션의 일부입니다. 여기에서는 동적 파라미터를 설정하는 방법을 확인할 수 있습니다. 다음 코드는 다운스케일 팩터를 설정하고 특정 펄스를 operator의 파라미터로 선택하는 방법을 보여줍니다. Device1_Process0_ByFactor8:
// ---------------------------------------------------------------------------
// Frame Grabber: Get* and Set* parameters for Process0
// ---------------------------------------------------------------------------


/*============ Downscale : ByFactor8 ============== */


int Device1_Process0_ByFactor8_Downscale_Id = Fg_getParameterIdByName(fg, "Device1_Process0_ByFactor8_Downscale");
if(Device1_Process0_ByFactor8_Downscale_Id <= 0) {
    fprintf(stderr, "\n");
    fprintf(stderr, "Error in Fg_getParameterIdByName(Device1_Process0_ByFactor8_Downscale): %s (%d)\n", Fg_getLastErrorDescription(fg), Device1_Process0_ByFactor8_Downscale_Id);
    fprintf(stderr, "Press <Return> to continue...\n");
    getchar();
}

unsigned int Device1_Process0_ByFactor8_Downscale;
Device1_Process0_ByFactor8_Downscale = 8;
rc = Fg_setParameterWithType(fg, Device1_Process0_ByFactor8_Downscale_Id, Device1_Process0_ByFactor8_Downscale, 0);
if(rc < 0) {
    fprintf(stderr, "\n");
    fprintf(stderr, "Error in Fg_setParameterWithType(Device1_Process0_ByFactor8_Downscale_Id): %s (%d)\n", Fg_getLastErrorDescription(fg), rc);
    fprintf(stderr, "Press <Return> to continue...\n");
    getchar();
}

int Device1_Process0_ByFactor8_SelectedPulse_Id = Fg_getParameterIdByName(fg, "Device1_Process0_ByFactor8_SelectedPulse");
if(Device1_Process0_ByFactor8_SelectedPulse_Id <= 0) {
    fprintf(stderr, "\n");
    fprintf(stderr, "Error in Fg_getParameterIdByName(Device1_Process0_ByFactor8_SelectedPulse): %s (%d)\n", Fg_getLastErrorDescription(fg), Device1_Process0_ByFactor8_SelectedPulse_Id);
    fprintf(stderr, "Press <Return> to continue...\n");
    getchar();
}

unsigned int Device1_Process0_ByFactor8_SelectedPulse;
Device1_Process0_ByFactor8_SelectedPulse = 1;
rc = Fg_setParameterWithType(fg, Device1_Process0_ByFactor8_SelectedPulse_Id, Device1_Process0_ByFactor8_SelectedPulse, 0);
if(rc < 0) {
    fprintf(stderr, "\n");
    fprintf(stderr, "Error in Fg_setParameterWithType(Device1_Process0_ByFactor8_SelectedPulse_Id): %s (%d)\n", Fg_getLastErrorDescription(fg), rc);
    fprintf(stderr, "Press <Return> to continue...\n");
    getchar();
}

정보

자동으로 생성된 C++ Framegrabber API 코드에서 이미지 취득 중 파라미터 설정과 관련이 없는 모든 파라미터를 삭제할 수 있습니다. 취득 중에 구성해야 하는 파라미터만 유지하십시오.

  • 디스플레이 생성, 취득 시작 및 이미지 그랩:
// ---------------------------------------------------------------------------
// Frame Grabber: Create the display(s)
// ---------------------------------------------------------------------------

int id0 = CreateDisplay(8 * byteWidth0, width0, height0);
if(id0 < 0) {
    fprintf(stderr, "Error in CreateDisplay(): %s (%d)\n", Fg_getLastErrorDescription(fg), id0);
    Fg_FreeMemEx(fg, pmem0);
    pmem0 = NULL;
    Fg_FreeGrabber(fg);
    fg = NULL;
    fprintf(stderr, "Press <Return> to continue...\n");
    getchar();
    return id0;
}
SetBufferWidth(id0, width0, height0);


// ---------------------------------------------------------------------------
// Frame Grabber: Start acquisition at applet and camera for each present port
// ---------------------------------------------------------------------------

rc = Fg_AcquireEx(fg, 0, nrOfCycles, ACQ_STANDARD, pmem0);
if(rc != 0) {
    fprintf(stderr, "Error in Fg_AcquireEx() for channel 0: %s\n", Fg_getErrorDescription(fg, rc));
    CloseDisplay(id0);
    Fg_FreeMemEx(fg, pmem0);
    pmem0 = NULL;
    Fg_FreeGrabber(fg);
    fg = NULL;
    fprintf(stderr, "Press <Return> to continue...\n");
    getchar();
    return rc;
}

// ---------------------------------------------------------------------------
// Frame Grabber: Grab images
// ---------------------------------------------------------------------------

frameindex_t frameNo0 = 0;
for(i = 1; i <= nrOfCycles; ++i){
frameNo0 = Fg_getLastPicNumberBlockingEx(fg, frameNo0 + 1, 0, 5, pmem0);
    if(frameNo0 < 0) {
        fprintf(stderr, "Error in Fg_getLastPicNumberBlockingEx(): %s (%d)\n", Fg_getLastErrorDescription(fg), frameNo0);
        fprintf(stderr, "Press <Return> to continue...\n");
        getchar();
        break;
    } else {
        fprintf(stderr, "grabbed image %d\n", frameNo0 );
    }

    void *iPtr0 = Fg_getImagePtrEx(fg, frameNo0, 0, pmem0);
    if(iPtr0 == NULL) {
        fprintf(stderr, "Error in Fg_getImagePtrEx(): %s\n", Fg_getLastErrorDescription(fg));
        Fg_stopAcquireEx(fg, 0, pmem0, 0);
        CloseDisplay(id0);
        Fg_FreeMemEx(fg, pmem0);
        pmem0 = NULL;
        Fg_FreeGrabber(fg);
        fg = NULL;
        fprintf(stderr, "Press <Return> to continue...\n");
        getchar();
        return -1;
    }
    DrawBuffer(id0, iPtr0, frameNo0, "");
}
  • 취득 중지, 디스플레이 닫기, 버퍼 메모리 해제:
// ---------------------------------------------------------------------------
// Frame Grabber: Stop acquisition
// ---------------------------------------------------------------------------

rc = Fg_stopAcquireEx(fg, 0, pmem0, 0);
if(rc < 0) {
    fprintf(stderr, "Error in Fg_stopAcquireEx(): %s (%d)\n", Fg_getLastErrorDescription(fg), rc);
    fprintf(stderr, "Press <Return> to continue...\n");
    getchar();
}


// ---------------------------------------------------------------------------
// Frame Grabber: Close the display
// ---------------------------------------------------------------------------

CloseDisplay(id0);


// ---------------------------------------------------------------------------
// Frame Grabber: Release the memory for buffer(s)
// ---------------------------------------------------------------------------

rc = Fg_FreeMemEx(fg, pmem0);
if(rc < 0) {
    fprintf(stderr, "Error in Fg_FreeMemEx(): %s (%d)\n", Fg_getLastErrorDescription(fg), rc);
    fprintf(stderr, "Press <Return> to continue...\n");
    getchar();
}
pmem0 = NULL;


// ---------------------------------------------------------------------------
// Frame Grabber: Uninitialization
// ---------------------------------------------------------------------------

rc = Fg_FreeGrabber(fg);
if(rc < 0) {
    fprintf(stderr, "Error in Fg_FreeGrabber(): %s\n", Fg_getLastErrorDescription(NULL));
    fprintf(stderr, "Press <Return> to continue...\n");
    getchar();
}
fg = NULL;


fprintf(stderr, "Press <Return> to exit...\n");
getchar();

return (0);
}

이 예제 코드를 더 큰 규모의 SDK 환경에 통합할 수 있습니다.