티스토리 뷰

TestStand API 함수와 프로퍼티는 다수의 객체가 포함이 되어 있어 TestStand 객체 모델을 접속할 수 있는 기능을 제공합니다. 이 글에서는 이 객체 모델의 기본적인 구조만을 다룹것입니다. 추가적으로 NI TestStand Help와 NI TestStand API Reference Poster를 통해서 모든 TestStand API 객체, 함수, 프로퍼티에 대한 내용을 확인할 수 있습니다. 


ActiveX 서버 인터페이스 컴포넌트


진행하기에 앞서, ActiveX 서버 인터페이스의 아래의 컴포넌트를 이해하는 것이 중요합니다


  • Class: 사용자가 클래스의 인스턴스로 만들 객체에 대해서 사용할 수 있는 방법과 프로퍼티의 목록을 제공합니다. 클래스는 데이터형 정의와 비슷합니다. 그러나 클래스는 객체를 적용하지 변수를 적용하지 않습니다.
  • Object: 객체는 클라이언트의 접속을 가능하게 해주는 ActiveX 서버의 서비스입니다. 클래스는 어떠한 내용을 정의한 것이고, 객체는 이 정의에 대한 인스턴스입니다. 
  • Method: 함수는 객체의 기능을 수행합니다.
  • Property: 프로퍼티는 객체의 설정 혹은 속성을 저장하고 유지합니다.

 

이전에 언급한 것처럼, 사용자는 TestStand API 접근을 위해서 ActiveX/COM을 지원하는 어떠한 언어도 사용할 수 있습니다. 

(참고 : 2014/12/31 - [National Instruments/TestStand] - TestStand의 아키텍처 개요 ) 


사용자가 사용하는 언어에 따라 TestStand API와 통신하는 방식을 달라집니다. 예를 들어 LabVIEW는 ActiveX/COM와 통신을 하기 위해서 프로퍼티와 인보크 노드를 사용합니다. 


LabWindows/CVI의 경우 API 혹은 ActiveX/Com 호출로 둘러싸인 인스트르먼트 드라이버 Wrapper 함수를 사용합니다. .NET의 경우 TestSTand API를 바로 호출하거나, Interop 어셈블리를 사용합니다. TestStand는 API에 접속하기 위해서 자체 ActiveX/COM 어뎁터를 제공합니다. 사용자는 API에 바로 접근하기 위해서 이러한 표현식을 사용할 수 있습니다. 모든 환경이 동일한 TestStand의 API에 접근하기 때문에 API에 접근하는 방식에 관계없이 결과는 항상 동일합니다. 


참고: 개발 환경에서 TestStand API를 바로 접근하면, 어플리케이션에서 충돌을 발생시킬 수 있는 메모리 릭이나 예상치 못한 행동을 피하기 위해서 모든 레퍼런스를 종료해야 합니다. NI TestStand의 Adding and Releasing References은 특정 개발 환경에서 레퍼런스를 처리할 수 있는 관련 정보를 제공합니다. 


API 상속


OOP에서 상속은 기존에 존재하는 클래스로부터 새로운 클래스에 기능을 제공하는 것을 말합니다. 상속 클래스라고 불리는 새로운 클래스는 부모 클래스의 모든 프로퍼티와 함수를 상속받고, 클래스가 초기화 되면 이러한 프로퍼티와 함수를 사용할 수 있게 끔 하거나 객체로 전환을 합니다. TestStand는 아래 그림 같이 상속 모델을 구현합니다. 이는 NI TestStand Help의 API Inheritance에도 나와 있습니다.

 



그림과 같이, 대부분의 TestStand AP 클래스는 TestStand 객체가 공유하는 공통 함수와 프로퍼트를 포함하는 기본 PropertyObject 클래스로부터 상속을 받습니다. 사용자는 다른 클래스의 객체에서 PropertyObject의 함수와 프로퍼티를 사용할 수 있습니다. TestStand 객체 모델 내에서 다른 클래스를 상속받는 객체를 이해하는 것은 TestStand API를 이용하여 어플리케이션 개발을 할 때 필요합니다. 


PropertyObject 클래스는 이름, 숫자 포맷과 같은 프로퍼티를 정의하고, 복사, 값 설정 및 가져오기, 객체 생성 및 해제, 배열 처리와 같은 객체 관리에 필요한 일반적인 함수를 제공합니다. PropertyObject의 이름을 가져오는 방법에 대해서 학습을 하면, 다른 객체에 대한 이름을 가져오는 방법에 대해서도 알 수 있습니다. 비슷하게 PropertyObject 객체에 대한 함수 사용 방법을 이해하면, PropertyObject를 상속하는 다른 객체에 대한 함수 사용 방법도 알 수 있습니다. 


대부분의 개발 환경을 직접 부모 클래스의 속성에 액세스 할 수 없습니다. 마찬가지로, TestStand에 직접 Type 속성을 호출하여 그 단계의 Type을 얻을 수는 없습니다. 


사용자는 PropertyObject 객체의 함수와 프로퍼티에 접근을 할려면 먼저 PropertyObject 클래스에서 상속 모든 개체에 대해서 AsPropertyObject 메소드를 호출하여 부모 클래스로 객체를 변환해야 합니다. 이 함수를 호출하는 것은 객체의 PropertyObject 형을 가져오는 것이고, 이로 인해 사용자는 연관된 프로퍼티와 함수에 접근을 할 수 있습니다. 


예를 들어 MYTYPE = Step.AsPropertyObject.GetType를 호출하면 제대로 작동하지만 MYTYPE = Step.Type를 호출하면 동작을 하지 않습니다. 이러한 접근방식을 사용하는 것은 사용자가 프로그래밍 적으로 어떤 객체의 타입을 실행하기 위해서 하나의 코드를 작성할 수 있습니다. 또한 이는 GetType 함수를 통해 반환되는 타입을 기초로 특정 기능을 수행할 수 있습니다. 


PropertyObject로 상속 받은 객체는 PropertyObject의 모든 기능을 사용할 수 있습니다. API inheritance와 PropertyObject  클래스 프로퍼티 및 함수에 대한 상세 내역을 NI TestStand Help 파일에서 확인할 수 있습니다.

 

API Containment

TestStand API에서, 많은 객체들은 객체의 다른 타입을 포함하고 있습니다. 예를 들어 SequenceFile 객체는 Sequence 객체들을 포함하고 있습니다. Sequence 객체는 Step 객체를 포함하고 있습니다. NI TestStand Help 의 API Containment 에서 확인할 수 있는 이 내용은 아래의 그림을 통해서 TestStand API 내의 객체들 사이의 관계에 대해서 보여줍니다.

 


 Containment의 개념을 이해하는 것은 사용자에게 TestStand API를 활용하기 위한 특정 객체를 찾는데 도움을 줍니다. 사용자는 개발언어에서 배열을 사용하는 것과 같이 Containment를 생각할 수 있습니다. 


예를 들어, SequenceFile 객체는 Sequence 객체의 배열을 포함하고 있습니다. 배열의 각 요소는 하나의 특정 Sequence를 포함하고, 각 Sequence는 Step 객체의 배열을 의미합니다. 아래의 예제는 사용자가 어떻게 myContainer 객체 내에 있는 myNumber 변수로부터 값을 받아오는지를 나타냅니다. 

 

myValue  = myContainer.GetNthSubProperty(4).GetValNumber

 

위의 예제는 사용자가 받고자 하는 객체의 인덱스를 정확히 알고 있다는 가정을 한 것입니다. 인덱스를 모를 때 특정 이름을 통해서 정보를 반환해 올 수도 있습니다. 아래의 예를 이를 나타냅니다. 

 

count = myContainer.GetNumSubProperties

Loop until, myContainer.GetNthSubProperty(i).name == 'myNumber'

myValue = myContainer.GetNthSubProperty(i).GetValNumber 


사용자는 개발환경에서 표현식을 사용할 수 있으며, PropertyObject로의 변환을 통해서 각 객체와 관련 있는 가치 있는 정보를 발견할 수도 있습니다. 이전 예제에서 보여준 것과 같이, 컨테이너 내에 있는 요소의 수를 받아와서 Loop 구문을 구성하여 각 요소에 대한 정보를 획득하기 위해서 반복 작업을 수행할 수도 있습니다. 


사용자는 AsPropertyObject 함수를 통해서 PropertyObject 로 변환을 한 뒤 PropertyObject로부터 상속받은 다른 TestStand 객체에 이러한 방식을 적용할 수 있습니다. 이 예제에서 보여주듯이, 사용자는 TestStand API 객체를 프로그래밍적으로 수정할 수 있으며, 이는 강력한 유연성을 제공합니다. 

 

TestStand API 객체 기반 호출하기


이전 섹션에서 설명했듯이, 객체를 기반의 호출은 정보를 받아오는 유효한 방식입니다. 때때로 사용자가 필요한 정보가 Read 타입이 아니거나, 현재 객체로부터 접근을 할 수 없을 때도 있습니다. 그러나 TestStand API 객체 사이의 관계를 이해하고 있으면, 사용자는 언제든지 메모리 내의 객체에 대한 호출이 가능합니다. 아래의 그림은 TestStand 객체 사이의 관계를 보여줍니다. 색으로 표시된 부분은 복사된 아이템을 나타냅니다. 



아래의 예제는 객체 모델에서 정보를 획득하기 위한 호출 방법을 나타냅니다. UIMessage를 받았다고 가정하면 GUI에 적절히 업데이트 하기 위해서 메시지로부터 받은 시퀀스의 이름을 정확히 알고 있어야 합니다. 위의 그림을 기반으로 시퀀스의 경로를 찾아가면 UIMessage 객체로부터 UIMessage>>Execution>>Thread>>Sequence Context>>Sequence가 됩니다. 


이 예는 객체에 접근하기 위해 정확한 구문을 사용하지는 않지만 객체가 어떻게 연관되어 있는지를 보여줍니다. 아래의 pseudocode는 객체에 접근하기 위한 호출을 하기 위해 실제 메소드와 프로퍼티를 보여줍니다.

  

?myExecution = UIMessage.Execution

mySeqContext = myThread.GetSequenceContext (callStackIndex, frameId)

mySequence = mySeqContext.Sequence

mySequenceName = mySequence.AsPropertyObject.Name?


이 글에서는 TestStand에서 사용할 수 있는 API에 대해서 알아보았습니다. 


이 글이 도움이 되셨나요? 그렇다면 아래의 그림을 클릭해주세요.



댓글