TestStand 사용자 인터페이스 메시지 (UI 메시지) 사용

업데이트 됨 Jul 30, 2023

환경

소프트웨어

  • TestStand
  • LabVIEW
  • LabWindows/CVI

이 튜토리얼은 TestStand 사용자 인터페이스 메시지 (UI 메시지)에 대한 개요와 이를 TestStand와 사용자 인터페이스 간의 통신에 사용하는 방법을 제공합니다. 또한 이 튜토리얼에서는 메시지 게시 및 처리에 대한 구현 예제를 제공합니다.

UI 메시지란 무엇입니까?

TestStand는 UI 메시지 개체를 사용하여 엔진 상태 및 현재 실행에 대한 정보를 운영자 인터페이스 또는 시퀀스 편집기에 전달합니다. 예를 들어 TestStand 엔진은 단계가 완료되면 운영자 인터페이스에 알리는 UI 메시지를 게시합니다. 그러면 운영자 인터페이스는 업데이트된 단계 결과를 표시하기 위해 실행창 컨트롤을 새로 고치는 등 이 UI 메시지에 대한 응답으로 작업을 수행할 수 있습니다.

각 UI 메시지에는 실행 이벤트와 관련된 다음 데이터가 포함됩니다.

  • 메시지 ID-전송되는 메시지 유형을 나타냅니다.
  • 숫자 데이터
  • 문자열 데이터
  • 개체 참조 데이터


이 기사의 기본 TestStand UI 메시지 섹션에서는 기본적으로 엔진이 보내는 UI 메시지에 대한 자세한 내용이 제공됩니다.

경우에 따라 추가 실행 이벤트를 운영자 인터페이스에 알리거나 사용자 정의 데이터를 사용자 인터페이스에 전달해야 할 수 있습니다. 이를 위해 TestStand API를 사용하여 사용자 정의 UI 메시지를 보낼 수 있습니다. 사용자 지정 UI 메시지에는 UIMsg_UserMessageBase 상수 (기본적으로 10000)보다 큰 메시지 ID가 있어야 합니다. 사용자 정의 UI 메시지의 가능한 응용 프로그램은 다음과 같습니다.

  1. 테스트가 완료되면 테스트된 총 장치 수에 대한 정보를 사용자 인터페이스에 전달
  2. 테스트에서 특정 숫자 결과를 전달하고 UI의 그래프에 추가합니다.


이 튜토리얼에서는 TestStand API를 사용하여 UI 메시지를 게시하는 방법과 사용자 정의 운영자 인터페이스에서 UI 메시지를 처리하는 방법에 대해 자세히 설명합니다.

UI 메시지를 사용하는 이유

UI 메시지는 TestStand 사용자 인터페이스와 시퀀스 파일간에 통신하는 가장 좋은 방법입니다. 통신 수단으로 시퀀스 파일 속성 또는 UI 변수를 사용하는 대안 (예: 시퀀스에서 전역 파일을 업데이트 한 다음 사용자 인터페이스에서 상태 확인)은 시퀀스 파일과 사용자 인터페이스 간에 원치 않는 종속성을 생성합니다. UI 메시지는 다음 두 가지 이유로 선호됩니다.

  1. UI 및 시퀀스 파일의 독립성 - 사용자 인터페이스는 항상 시퀀스 파일과 함께 실행되어야 하며 그 반대의 경우도 마찬가지입니다. UI 메시지를 사용하면 사용자 인터페이스와 함께 사용할 때 시퀀스 파일에 특정 속성이 존재하지 않아도 됩니다. UI 메시지를 사용하면:

    • 사용자 인터페이스는 특정 메시지를 구현하지 않는 시퀀스를 실행할 수 있습니다(사용자 인터페이스의 처리 코드는 실행되지 않음).

    • 사용자 지정 메시지를 게시하는 시퀀스는 이를 처리하도록 빌드 되지 않은 UI에서 실행할 수 있습니다(UI 메시지는 사용자 인터페이스에서 무시됨).

  2. 유지 관리 - UI 메시지는 시퀀스 파일 속성 또는 UI 변수에 대한 의존성을 방지하므로 시퀀스 파일 및 사용자 인터페이스 개발자가 유지 관리할 필요가 적습니다.

기본 TestStand UI 메시지

TestStand 엔진은 다양한 이벤트가 발생했음을 알리기 위해 다양한 실행 지점에서 TestStand UI 메시지를 운영자 인터페이스에 자동으로 게시합니다. 이러한 메시지는 사용자 인터페이스에서 실행 상태에 대한 정보를 얻는 데 사용됩니다. TestStand 엔진은 여러 메시지 유형 (메시지 ID로 지정됨)을 정의하고 이러한 이벤트가 발생하면 UI 메시지를 자동으로 게시합니다. 이러한 UI 메시지는 TestStand 도움말에 정의되어 있습니다.

이 문서는 메시지가 게시된 시기와 메시지와 함께 전달되는 데이터(있는 경우)에 대한 세부 정보도 제공합니다. 이러한 메시지는 UI 메시지 게시 섹션에서 자세히 설명하는 TestStand API를 사용하여 수동으로 게시할 수도 있습니다. 많은 기본 UI 메시지는 UI에서 이벤트를 트리거하지만 TestStand 엔진에 의해 자동으로 전송되지는 않습니다.

사용자 인터페이스는 특정 UI 메시지가 발생할 때 코드를 실행하도록 구성할 수 있습니다. 이 프로세스는 이 문서의 UI 메시지 수신 및 처리 섹션에서 자세히 설명합니다.

사용자 정의 UI 메시지

UIMsg_UserMessageBase 상수 (10,000)의 값보다 크거나 같은 메시지 ID를 사용하여 고유 한 사용자 정의 UI 메시지를 정의할 수 있습니다. 이러한 메시지는 기본 메시지와 거의 동일한 방식으로 사용되지만 모든 기능은 개발자가 구현해야 합니다.

  • 시퀀스 파일에 메시지 게시-엔진이 사용자 지정 UI 메시지를 자동으로 게시하지 않습니다.
  • 사용자 인터페이스에서 메시지 처리-TestStand UI 관리자 컨트롤은 기본적으로 사용자 지정 메시지를 처리하는 코드를 실행하지 않습니다.

이러한 프로세스는 다음 섹션에서 자세히 설명합니다.

UIMessage 게시

UI 메시지를 게시하려면 다음 두 가지 TestStand API 메소드 중 하나를 사용하십시오.

  • Thread.PostUIMessageEx 메서드 (일반) - 시퀀스에서 UI 메시지를 게시할 때이 메서드를 사용합니다. 현재 스레드 및 실행 참조를 사용합니다.
  • Engine.PostUIMessage 메서드 - 시퀀스에서 메시지를 게시하지 않을 때 이 메서드를 사용합니다. 이 메서드는 엔진에서 직접 호출됩니다. 이전 메서드와 달리 이 메서드를 호출할 때 실행 및 스레드 참조를 지정해야 합니다.

이러한 방법을 사용하면 메시지 ID 및 메시지와 관련된 데이터를 지정할 수 있습니다. PostUIMessageEx 메서드의 매개 변수는 다음과 같습니다.

PostUIMessageEx (eventCode, numericDataParam, stringDataParam, activeXDataParam, synchronous)

참고 : 최종 매개 변수는 UI 메시지가 사용자 인터페이스 (일반적으로 애플리케이션 관리자 UI 컨트롤)에서 확인 될 때까지 메서드가 대기할지 여부를 결정합니다. 일반적으로 이 매개 변수는 가능한 메시지 오버 플로우를 방지하기 위해 true로 설정됩니다. 이는 메시지가 UI에서 인식 할 수 있는 것보다 빠르게 전송되는 경우 발생할 수 있습니다.

TestStand API 호출과 마찬가지로 몇 가지 방법으로 원하는 메서드를 호출 할 수 있습니다.

  1. TestStand ActiveX 단계

  2. 외부 코드 모듈-LabVIEW 및 LabWindows / CVI 구현은 다음과 같습니다.

    LabVIEW

    LabWindows / CVI

    // get a reference to the current thread from sequence context
    tsErrChk (TS_SeqContextGetThread (
        seqContext,
        &errorInfo,
        &threadRef));
    
    //get the RunState.SequenceError.Msg property value
    tsErrChk (TS_SeqContextGetRunTimeErrorMessageEx (
        seqContext,
        &errorInfo,
        &errorMessage,
        NULL,
        NULL));
    
    //post the UI message
    tsErrChk (TS_ThreadPostUIMessageEx (
        threadRef,
        &errorInfo,
        TS_UIMsg_UserMessageBase + 1,
        0,
        errorMessage,
        NULL,
        TRUE));

     

  3. Statement 단계 (TestStand 4.0 이상)

이 예에서 현재 시퀀스 오류 메시지 (있는 경우)는 UI 메시지의 문자열 매개 변수를 통해 전송됩니다. 이벤트 코드의 일부로 UIMsg_UserMessageBase 매개 변수를 사용하는 것에 유의하십시오. 이 값을 추가하면 이 메시지가 TestStand 기본 UI 메시지와 충돌하지 않습니다.

이 단계가 실행될 때마다 스레드는 Parameters.Result.Status의 문자열 값을 전달하는 사용자 정의 UIMessage (ID 10,001)를 게시합니다. 다음 섹션에서는 UI 메시지를 처리하도록 사용자 인터페이스를 구성하는 방법에 대해 설명합니다.

UI 메시지 수신 및 처리

시퀀스 편집기 또는 TestStand 운영자 인터페이스 내에서 애플리케이션 관리자는 자동으로 UI 메시지를 확인하고 기본 UI 메시지 이벤트를 처리합니다. 그러나 두 개의 Application Manager 이벤트 중 하나에 대한 이벤트 콜백을 추가하여 UI 메시지가 처리될 때 사용자 정의 코드를 실행하도록 운영자 인터페이스를 구성 할 수 있습니다.

  • UImessage 이벤트 - 이 이벤트는 응용 프로그램 관리자가 UI 메시지를 처리할 때마다 시작됩니다. 지정된 이벤트 콜백은 기본 UI 메시지 처리 작업 전에 실행됩니다. 취소 출력 이벤트 인수는 콜백 내에서 True로 설정하여 기본 이벤트 작업을 재정의 할 수 있습니다.
  • UserMessage 이벤트 - 이 이벤트는 사용자 지정 UI 메시지 (메시지 ID가 10,000 이상인 메시지)에 대해서만 발생합니다.

LabVIEW 및 LabWindows/CVI에서 사용자 정의 UI 메시지를 처리하기위한 구현은 다음 섹션에서 자세히 살펴 봅니다.

LabVIEW 구현

이 섹션에서는 위의 예에서 사용자 정의 UI 메시지를 처리하기 위해 간단한 운영자 인터페이스를 수정합니다. 간단한 운영자 인터페이스는 다음 디렉토리에 있습니다.

<TestStand Public>\UserInterfaces\Simple\LabVIEW\TestExec.llb

Simple Operator Interface에서 TestStand 이벤트는 Simple OI-Configure Event Callbacks subVI에 등록됩니다. 이 VI에서는 이벤트가 발생할 때 실행할 콜백 VI를 지정하여 이벤트가 발생할 때 취할 조치를 설정합니다. 이벤트 처리 콜백 구성은 Register Event Callback Node를 사용하여 수행됩니다.

사용자 정의 UI 메시지가 수신될 때 실행할 코드를 구현하려면 먼저 UserMessage 이벤트에 대한 콜백 VI를 구현해야 합니다.

  1. 추가 이벤트를 포함하려면 이벤트 등록 노드를 확장하십시오. 세 개의 추가 입력이 표시되어야 합니다.
  2. 애플리케이션 관리자 참조를 첫 번째 새 입력에 연결하십시오. 이것은 우리가 응용 프로그램 관리자의 이벤트를 처리하고 있음을 지정합니다.
  3. 첫 번째 입력을 마우스 왼쪽 버튼으로 클릭하여 애플리케이션 관리자 이벤트 목록에서 사용자 메시지 이벤트를 선택하십시오.
  4. 두 번째 입력 (VI 참조)의 노드를 마우스 오른쪽 버튼으로 클릭하고 컨텍스트 메뉴에서 콜백 생성 VI를 선택합니다. 이렇게 하면 사용자 정의 UI 메시지가 수신될 때마다 실행되는 새로운 콜백 VI가 생성됩니다.
  5. 콜백에서 사용할 추가 데이터를 User Parameter 노드에 전달합니다 (이 경우 추가 데이터가 필요하지 않음).

이러한 수정 사항이 적용된 Simple OI-Configure Event Callbacks VI는 다음과 같습니다.

이제 사용자 정의 UI 메시지가 수신될 때 실행되어야 하는 콜백 VI 내에서 코드를 구현해야 합니다.

  1. 위의 4 단계에서 생성 한 콜백 VI를 더블 클릭하여 엽니다. VI의 매개 변수는 이벤트를 기반으로 생성됩니다.
  2. UI 메시지 데이터에 액세스하려면 Event Data 매개 변수를 풀고 uiMsg 객체에 액세스 한 다음이 객체에서 속성 노드를 만듭니다. 이 객체는 UserMessage 이벤트를 발생시킨 UI 메시지의 데이터를 나타냅니다.
  3. 이 이벤트 콜백은 모든 사용자 지정 UI 메시지에 대해 실행되므로 먼저 메시지의 ID를 확인해야합니다. 이렇게 하려면 케이스 구조에 대한 선택 데이터로 Event 속성을 사용합니다. 맞춤 이벤트 (10001)의 ID에 대한 케이스를 추가해야 합니다.
  4. 케이스 구조 내에서 실행할 코드를 만듭니다. 이 경우 UI 메시지 내에서 전송된 오류 정보를 표시하는 대화 상자를 시작합니다.


완성된 콜백 VI는 아래와 같습니다.



이제 수정이 완료되었으며 이제 UI가 사용자 정의 UI 메시지를 처리합니다. 추가 사용자 정의 메시지를 처리하려면 각각의 새 UI 메시지 ID에 대한 콜백 VI에 추가 케이스를 추가하기만 하면 됩니다.

LabWindows/CVI

이 섹션에서는 위의 예에서 사용자 정의 UI 메시지를 처리하도록 Simple Operator Interface를 수정합니다. 간단한 운영자 인터페이스는 다음 디렉토리에 있습니다.

<TestStand Public>\UserInterfaces\Simple\CVI\TestExec.cws

간단한 운영자 인터페이스에서 TestStand 이벤트는 SetupActiveXControls () 함수에 등록됩니다. 이 함수에서는 이벤트 등록 함수를 호출하여 다양한 이벤트가 발생했을 때 취할 조치를 설정합니다. 각 이벤트 유형에는 연관된 별도의 기능이 있습니다. User 메시지 이벤트를 처리하기 위해 다음 함수를 사용합니다.

errChk (TSUI__ApplicationMgrEventsRegOnUserMessage (gMainWindow.applicationMgr, ApplicationMgr_OnUserMessage, NULL, 1, NULL));

이 함수는 사용자 메시지 수신 시 실행할 콜백 함수를 구성합니다. 5 개의 매개 변수가 필요합니다.

  1. 이벤트를 처리하는 개체-이 경우 응용 프로그램 관리자
  2. 이벤트 발생시 실행할 콜백 함수-여기에 지정된 함수 (ApplicationMgr_OnUserMessage)를 생성해야 합니다.
  3. 콜백 데이터-콜백 함수에 필요한 추가 데이터-이 경우에는 아무것도 필요하지 않습니다.
  4. 콜백 활성화-콜백을 이벤트에 즉시 연결할지 여부를 설정합니다. 대부분의 경우 1 또는 true로 설정해야 합니다.
  5. (반환 매개 변수) 콜백 ID-이 매개 변수를 사용하여 콜백의 고유 ID에 액세스합니다. 이 튜토리얼에는 이 데이터가 필요하지 않습니다.


이 기능은 다른 이벤트 등록 기능과 함께 삽입해야 합니다 (라인 277-281). 이 함수와 다른 TestStand API 함수에 대한 문서는 CVI 함수 패널에서 제공됩니다.

이제 사용자 정의 UI 메시지를 받을 때 실행해야 하는 콜백 함수 내에서 코드를 구현해야 합니다. 이 기능의 프로토 타입은 위의 등록 기능에 대한 문서에서 제공됩니다.


완성된 콜백 함수는 다음과 같습니다. 설명은 각 호출에 대한 자세한 정보를 제공합니다.

HRESULT CVICALLBACK ApplicationMgr_OnUserMessage (
CAObjHandle caServerObjHandle,
void * caCallbackData,
TSUIObj_UIMessage uiMsg)
{
    char * stringData;
    enum TSEnum_UIMessageCodes messageID;
    int error = 0;

    // obtain message ID from UI message object
   tsErrChk (TS_UIMessageGetEvent (
                 uiMsg,
                 & errorInfo,
                 & messageID));

    switch (messageID)
    {
         case 10001 :
         //run only for this message type (ID 10001)             

           //get the UI message string data
           tsErrChk (TS_UIMessageGetStringData (
                 uiMsg,
                 & errorInfo,
                 & stringData));  

            //display the string data to the user
            MessagePopup ( "Sequence Error", stringData);
        break;
    }
    Error : //handle errors (same as other callbacks)
       DisplayError (error);
       return error <0? E_FAIL : S_OK;
}


이제 수정이 완료되었으며 이제 UI가 사용자 정의 UI 메시지를 처리합니다. 추가 사용자 지정 메시지를 처리하려면 각 새 UI 메시지 ID에 대한 콜백 함수에 추가 케이스를 추가하면 됩니다.

수정된 TestExec.c 파일은 첨부 파일에서 찾을 수 있습니다.