You are here

LabVIEW Tech-Tip 12호 - LabVIEW를 위한 STM (Simple TCP/IP Messaging) 프로토콜

 

원격 시스템 모니터링을 위한 통신 프로토콜 프로그래밍

 

제1편 STM의 개요와 필요성
CompactRIO나 Compact FieldPoint와 같은 원격에 설치되는 시스템을 사용할 때 효율적인 통신 프로토콜을 구축하는 일은 매우 중대한 작업입니다. 하나의 원격 시스템을 다양한 PC에서 모니터링해야 하는 경우도 자주 발생할 것입니다. 이러한 경우에는 더더욱 효율적인 통신 프로토콜의 중요성이 커집니다. STM (Simple TCP/IP messaging) 프로토콜은 분산 시스템의 성능, 사용성 및 유지관리 및 확장성을 향상시킵니다. 기존 TCP/IP 통신과는 다르게, 포맷화된 패킷을 사용하면 데이터 처리 관리가 더욱 수월해지며, 반복 데이터 전송을 최소화함으로써 처리량 향상을 구현합니다.

 

STM을 익히기 위한 학습 내용

 

배경지식

임베디드 LabVIEW 어플리케이션의 경우, 원격 클라이언트와의 통신은 프로젝트에 있어 중요한 부분입니다. 임베디드 어플리케이션은 그 주요 임무가 정보 (상태, 수집된 데이터, 분석된 데이터 등)를 클라이언트에 보고하는 것이므로, '데이터 서버'의 역할을 합니다. 또한 어플리케이션 특정 임무를 수행하기 위해 클라이언트로부터의 명령에 응답할 수 있습니다.

이러한 어플리케이션의 복잡성은 네트워크 통신 요구사항에 반영되어 나타납니다. LabVIEW Real-Time 통신 마법사가 솔루션을 제공하지만, 마법사 기반 도구의 기능을 능가하는 임베디드 타겟이나 어플리케이션의 경우에는 다른 방법이 필요합니다.

TCP/IP 프로토콜은 호스트간 정보 공유에 가장 일반적으로 사용되는 방법입니다. TCP/IP 프로토콜은 데이터 공유를 위한 매개체를 제공하지만, 성능을 최적화하고 데이터를 이해하는 로직을 실행하는 것은 어플리케이션의 몫입니다. 더욱 까다로운 어플리케이션의 경우, 통신 프로토콜의 일부로써 다음의 추가 기능이 도움이 됩니다.

편리한 데이터 처리를 위해 메타 정보 전송 기능
이름 규약으로 데이터 송수신
여러 데이터 타입 송수신 (스트링, I8, 배정도 배열, 클러스터 등)

본 문서는 이러한 요구사항을 해결하는 간단한 메시지 프로토콜에 대해 설명합니다.

어플리케이션 프로그래밍 인터페이스 (API) 및 예제 코드가 포함되어 있는 STM (Simple TCP/IP Messaging) 컴포넌트 인스톨러는 본 문서의 후반부에 링크되어 있습니다. 일부 예제는 LabVIEW Real-Time 어플리케이션이 요구되지만, 대부분은 LabVIEW 플랫폼에서 실행됩니다.

본 문서에서는 TCP/IP 프로토콜을 사용한 LabVIEW 네트워크 통신 방법을 설명합니다. 또한, 상위 레벨의 프로그래밍 인터페이스를 제공하며 여기에 설명된 모든 실행 세부사항을 요약하는 공유 변수에 대해 살펴보는 것도 좋습니다.

작동 이론

통신 프로토콜은 다음과 같은 특성을 갖추어야 합니다.

데이터를 편리하게 묶고 분석하는 기능
TCP 실행 세부정보 감춤
데이터를 필요 시에만 전송함으로써 네트워크 트래픽을 최소화
전반적인 오버헤드 및 처리량에 미치는 영향 최소화
LabVIEW 이외의 환경 (C, C++ 등)과 통신 허용

모든 메시지 프로토콜에는 받는 측에서 데이터 스트림 분석과 관련하여 사용하게 되는 일정 정도의 오버헤드 (메타 데이터)가 있습니다. 모든 패키지에서 메타 데이터의 전체 세트를 보내는 데에는 엄청난 오버헤드가 추가됩니다.

우리는 고성능 어플리케이션에 주안점을 두고 있으므로, 각 패킷마다 감소된 메타 정보 세트를 보냄으로써 통신 오버헤드를 최소화하고자 합니다. STM 프로토콜에서 사용되는 방식은 메타 정보의 인덱스 목록을 포함하는 개별 "메타 데이터" 메시지를 생성하는 것입니다. 이는 호스트간 STM 연결이 있을시마다 한 번 전송됩니다. 이러한 방식으로 각 호스트는 다음의 메시지를 해독하기 위해 필요한 모든 정보를 가지게 됩니다. 메시지 전송시마다, 호스트는 수신자가 정보 해독을 위해 사용할 수 있도록 데이터와 메타 데이터 인덱스를 패킷으로 묶습니다.

이러한 방식으로 사용자들이 TCP/IP 통신의 추상 (abstraction)화할 수 있으며, 따라서 사용자는 이름별로 데이터를 송수신할 수 있습니다. 배후의 전송 매커니즘은 완벽하게 감춰져 있습니다.

실행

지금까지 살펴본 개념을 바탕으로 LabVIEW 실행을 살펴보겠습니다.

메타 데이터는 클러스터의 배열로 실행됩니다. 각 배열 원소에는 하나의 변수값을 묶고 해독하기 위해 필요한 데이터 프로퍼티가 포함됩니다. 우리는 단지 '이름' 프로퍼티만을 정의하였지만, 클러스터를 사용하면 어플리케이션 요구에 따른 메타 프로퍼티 (데이터 타입 등)를 추가함으로써 STM을 맞춤화할 수 있습니다. 메타 데이터 클러스터는 타입정의이므로 프로퍼티 추가로 인해 기존 코드가 깨지지 않습니다.
다음의 그림은 두 가지 변수 'Iteration' 및 'RandomData'를 위해 구성된 메타 데이터 클러스터의 예입니다.

 

그림 1. 메타 데이터 클러스터 배열

각 데이터 변수가 전송되기 전에 데이터 크기, 메타 데이터 ID, 데이터에 대한 필드를 포함하는 패킷이 생성됩니다. 그림 2는 패킷 포맷을 나타냅니다.

 

그림 2. 패킷 포맷

메타 데이터 ID 필드는 데이터 변수에 따른 메타 데이터 배열 요소의 인덱스로 구성되어 있습니다. 받는 측의 호스트는 메타 데이터 ID를 사용하여 메타 데이터 배열을 인덱스화하여 메시지 데이터의 프로퍼티를 얻습니다. 본 매커니즘은 최소한의 오버헤드만을 허용하며 사용이 간편하므로 (변수 이름 읽기 및 쓰기) 매우 효율적입니다.

메타 데이터 ID만이 전송됩니다. 따라서 메타 데이터 클러스터가 전송 오버헤드에 영향을 미치지 않고 더 많은 정적 변수 프로퍼티를 포함하기 위해 어떻게 확장되는지 눈여겨 보십시오.

STM 프로토콜은 대용량의 데이터 양을 전송할 때에 더욱 효율적이며, 처리량이 높습니다. 각 메시지에는 데이터 크기 및 메타 데이터 ID에 대한 48 (32 + 16) 비트의 오버헤드가 있습니다. 실제 데이터를 전송하기 위해 사용하는 문자열은 하나의 캐릭터 (8 비트)로 표현됩니다. 데이터 값이 보내지면, 전송 효율성(전체 전송 데이터 대비 실제 데이터 량의 비율)은 8 비트/ (48 + 8) 비트, 즉 14%입니다. 그러나 1000개의 64비트 배정도 변수(double; 1000*64 비트) 배열이 보내지면, 전송 효율성은 더욱 높아집니다. (64,000 비트/ 64,048 비트 = 99.9%).

상당량의 개별 데이터 값을 스트리밍하는 경우, 전송하기 이전에 배열에 모으는 것이 좋습니다.

STM (Simple TCP/IP Messaging) API

STM API는 매우 간단합니다. 기본 작업의 경우, API는 [읽기]VI와 [쓰기]VI로 구성됩니다. 또한 메타 데이터의 전송을 돕는 두 가지 추가 VI가 있지만 필수는 아닙니다. 다음은 각 API VI에 대한 간단한 설명입니다.

STM Write Msg: 본 VI를 사용하여 모든 타입의 데이터를 원격 호스트에 보낼 수 있습니다. 본 VI는 데이터, 데이터 이름 및 메타 데이터 정보에 기반하여 패킷을 생성합니다. 본 VI가 호출되면, VI는 메타 데이터 배열에서 이름별로 지정된 변수의 인덱스를 추출합니다. 그 후 메시지 패킷을 조합하고, 연결 ID를 사용하여 TCP/IP를 통해 패킷을 원격 호스트로 보냅니다.

데이터는 TCP/IP 전송을 위해 반드시 문자열 포맷이어야 합니다. 메시지 데이터를 문자열로 변환하기 위해 [패턴화된 문자열로]를 사용하십시오.

연결 ID는 [TCP Listen] primitive에 의해 서버에서 획득되며, [TCP 연결 열기] primitive를 사용하여 클라이언트에서 확보됩니다.

 

STM Read Msg: 본 VI를 사용하여 원격 호스트로부터 모든 타입의 데이터를 받습니다. 본 VI는 메타 데이터 인덱스 및 패턴화된 문자열 데이터를 읽고 묶음을 풉니다. 본 VI는 메타 요소를 찾은 후 데이터 문자열과 함께 반환합니다. 그 후 어플리케이션은 이름이나 다른 메타 프로퍼티를 척도로 사용하여 패턴화된 데이터를 메시지 데이터 타입으로 변환합니다. 아래의 예에서, "RandomData"로 이름 붙여진 변수는 항상 "배정도의 배열" 데이터 타입으로 변환됩니다.

본 VI는 보통 루프 안에서 사용됩니다. 데이터가 주어진 시간에 전송된다는 보장이 없으므로, '타임아웃' 파라미터를 사용하여 루프가 주기적으로 실행되도록 하고, '타임 아웃?' 인디케이터를 사용하여 반환값 처리 여부를 확인하십시오.


STM Write Meta: 본 VI를 사용하여 메타 데이터 정보를 원격 호스트에 보낼 수 있습니다. 정확한 메시지 해석을 위해서, 메타 데이터는 반드시 받는 쪽과 보내는 쪽에서 일치해야 합니다. 각 호스트에서 데이터 복사본을 유지하는 대신, 서버에 메타 데이터를 보유하고 본 VI를 사용하여 메타 데이터를 클라이언트로 보낼 것을 권장합니다.

 


STM Read Meta: 본 VI를 사용하여 원격 컴퓨터로부터 메타 데이터 정보를 수신할 수 있습니다. 본 VI는 메타 데이터 배열을 읽고 묶음을 풉니다. 이는 [읽기] 및 [쓰기] VI로 전달됩니다.

 

STM API를 사용하여 데이터 전송하기

다음의 그림은 STM API를 사용한 데이터 서버의 예입니다. 연결된 즉시 본 프로그램이 메타 데이터를 원격 호스트에 보내는 것을 확인하십시오. 예제는 두 가지 값 (반복 카운터와 배정도의 배열)을 쓰기합니다. 메타 데이터에는 본 두 가지 변수 (그림 1 참조)에 대한 설명이 포함됩니다.

여기서, 사용자가 STM Write Msg VI에 변수 이름을 와이어링하기만 하면, VI가 메시지 패킷 생성 및 전송을 처리합니다. 이같은 추상 (abstraction) 기능으로 인해 사용자는 데이터를 이름별로 보내는 동시에 TCP/IP 프로토콜 내부의 복잡성은 감출 수 있습니다.

또한, 어플리케이션이 데이터가 전송되기 이전에 데이터를 문자열로 패턴화한다는 사실을 기억하십시오. 단순한 데이터 타입 (그림 3의 데이터 타입 등)의 경우, 타입캐스트 사용이 가능하며, 이는 [패턴화된 문자열로] VI 보다 더욱 신속합니다. 그러나 [패턴화된 문자열로] 또한 클러스터나 웨이브폼과 같은 복합 데이터 타입에 사용됩니다.


[+] 크게보기
그림 3. 기본적인 STM 서버 예제

알려진바와 같이 프로토콜은 어플리케이션 요구에 맞도록 맞춤 및 확장 가능합니다. 변수를 추가하고자 할 때, 메타 데이터 문자열 및 변수 해당 STM Write Msg VI에 엔트리를 추가하면 됩니다.

STM API를 사용하여 데이터 수신하기

데이터 수신 또한 매우 간단합니다. 그림 4의 디자인 패턴은 서버와 연결되었을 때 메타 데이터를 기다립니다. 그 후, 들어오는 메시지를 기다리기 위해 STM Read Msg VI를 사용합니다. 메시지가 수신되면, 데이터를 변환하여 메타 데이터 이름에 따라 로컬 값에 지정합니다.

데이터 이름에 따라 동작하는 케이스 구조는 데이터 변환 처리를 위한 확장가능한 방법을 제공합니다. 변수를 추가할 때, 변수를 적절한 타입으로 변환하고 적절한 위치로 보내기 위해 코드로 케이스를 생성하기만 하면 됩니다.

외부의 케이스 구조는 TCP/IP 타임아웃 이벤트를 처리합니다.


[+] 크게보기
그림 4. 기본적인 STM 클라이언트 예

본 디자인 패턴의 한 가지 장점은 데이터를 수신하여 데이터를 로컬 값으로 지정하는 코드를 종합할 수 있다는 것입니다.
다른 장점으로는 데이터가 수신 (또는 타임아웃 발생)될 때까지 STM Read Msg VI가 휴면 상태이므로, 루프는 들어오는 데이터의 속도로 동작한다는 점입니다. 이로 인해 어떠한 데이터도 손실되지 않으며, 들어오는 데이터 폴링에 CPU 시간이 낭비되지 않음을 보장합니다.

참고: 클라이언트는 런타임 전에는 메타 데이터에 대한 지식이 없습니다. 따라서 개발자는 어플리케이션이 모든 유입되는 변수를 처리할 수 있는지를 반드시 확인해야 합니다. '알려지지 않은' 변수를 에러 조건으로 트랩하기 위해 '기본' 케이스 구조를 실행하는 것도 좋습니다.

요약

STM 프로토콜은 생산성 및 클라이언트/서버 성능을 대폭 향상시킵니다. STM 프로토콜은 TCP/IP 계층을 추상화하므로 사용자가 확장 및 유지가 간편한 직관적인 코드를 생성하도록 합니다.

※ 상기 예에 대한 소스 코드를 포함한 STM 컴포넌트는 여기에서 다운로드할 수 있습니다.

 

다음 편에는..

실제 STM 컴포넌트를 설치하여 단계별로 위의 예제를 프로그래밍해보고, 이를 통하여 STM 프로토콜을 이용한 통신 프로그램을 만들어 보겠습니다. 이 결과물을 어떻게 원격 서버와 클라이언트에 배포하여 연결 및 사용할 수 있는지 실제 시스템을 구성하여 살펴보겠습니다.

 

추가 학습 자료

>> LabVIEW (한글판) 평가판 다운로드
>> LabVIEW 개발자 커뮤니티