LabVIEW 공유 변수 사용하기

개요

LabVIEW는 분산 어플리케이션을 생성하기 위한 다양한 기술에 대한 액세스를 제공합니다. 공유 변수는 이러한 어플리케이션에 필요한 프로그래밍을 단순화하는 데 중요한 요소입니다. 이 어플리케이션 노트에서는 공유 변수에 대해 소개하며, LabVIEW 8.20부터 최신 버전의 LabVIEW까지의 기능과 성능에 대해 설명합니다.

내용

공유 변수 생성하기

공유 변수를 사용하면 단일 다이어그램의 루프 또는 네트워크의 VI 간에 데이터를 공유할 수 있습니다. UDP/TCP, LabVIEW 큐 및 리얼타임 FIFO 등 LabVIEW의 기존 데이터 공유 방법과 달리, 일반적으로 프로퍼티 대화 상자를 사용하여 편집시 공유 변수를 설정하므로 어플리케이션에 설정 코드를 포함시킬 필요가 없습니다.

단일 프로세스 및 네트워크 공유라는 두 가지 타입의 공유 변수를 생성할 수 있습니다. 이 백서에서는 단일 프로세스 및 네트워크 공유 변수에 대해 자세히 설명합니다. 공유 변수를 생성하려면 프로젝트 트리에서 "내 컴퓨터" 또는 리얼타임 타겟과 같은 계산 디바이스를 마우스 오른쪽 버튼으로 클릭하고 새로 만들기≫변수를 선택하여 공유 변수 프로퍼티 대화 상자를 표시합니다. 표시된 대화 상자에서 새 변수의 설정을 지정합니다.

프로젝트를 열어야만 공유 변수를 생성할 수 있습니다. 프로젝트에 공유 변수를 추가하려면, 프로젝트 탐색기 윈도우에서 타겟, 프로젝트 라이브러리 또는 프로젝트 라이브러리 내의 폴더를 마우스 오른쪽 버튼으로 클릭하고, 바로 가기 메뉴에서 새로 만들기≫변수를 선택하여 공유 변수 프로퍼티 대화 상자를 표시합니다. 공유 변수 설정 옵션 중에서 선택하고 확인 버튼을 클릭합니다.

프로젝트 라이브러리 내에 있지 않은 타겟이나 폴더를 마우스 오른쪽 버튼으로 클릭하고, 바로 가기 메뉴에서 새로 만들기≫변수를 선택하여 공유 변수를 생성하면, LabVIEW는 새 프로젝트 라이브러리를 생성하고 공유 변수를 내부에 위치시킵니다. 변수 및 라이브러리에 대한 자세한 내용은 공유 변수 수명 섹션을 참조하십시오.

그림 1은 단일 프로세스 공유 변수에 대한 공유 변수 프로퍼티 대화 상자를 보여줍니다. LabVIEW Real-Time Module과 LabVIEW Datalogging and Supervisory Control(DSC) Module은 공유 변수에 추가 기능과 설정 가능한 프로퍼티를 제공합니다. 이 예제에서는 LabVIEW Real-Time Module과 LabVIEW DSC Module이 모두 설치되어 있지만, LabVIEW DSC Module이 네트워크 공유 변수에 대해서만 추가하는 기능을 사용할 수 있습니다.

그림 1. 단일 프로세스 공유 변수 프로퍼티


데이터 타입

새로운 공유 변수에 대해 많은 표준 데이터 타입 중에서 선택할 수 있습니다. 이러한 표준 데이터 타입 외에도 데이터 타입 풀다운 목록에서 사용자 정의를 선택하고 사용자 정의 제어로 이동하여 사용자 정의 데이터 타입을 지정할 수 있습니다. 그러나 스케일링 및 리얼타임 FIFO와 같은 일부 기능은 일부 사용자 정의 데이터 타입에서 작동하지 않습니다.  또한 LabVIEW DSC Module을 설치한 경우, 사용자 정의 데이터 타입을 사용할 때, 알람은 잘못된 상태 알림으로 제한됩니다.

공유 변수 프로퍼티를 설정하고 확인 버튼을 클릭하면, 그림 2와 같이 사용자가 선택한 라이브러리 또는 타겟 아래 프로젝트 탐색기 윈도우에 공유 변수가 나타납니다.

그림 2. 프로젝트의 공유 변수


공유 변수가 속한 타겟은 LabVIEW가 공유 변수를 배포하고 호스트하는 타겟입니다. 공유 변수 배포 및 호스팅에 대한 자세한 내용은 배포 및 호스팅 섹션을 참조하십시오.

 

변수 참조

공유 변수를 LabVIEW 프로젝트에 추가한 후, 공유 변수를 VI의 블록 다이어그램으로 끌어와서 그림 3과 같이 공유 변수를 읽거나 쓸 수 있습니다. 다이어그램의 읽기 및 쓰기 노드를 공유 변수 노드라고 합니다.

그림 3. 공유 변수 노드를 사용하여 공유 변수 읽기 및 쓰기

노드를 변수에 연결하는 방법에 따라 공유 변수 노드를 절대 또는 타겟 기준으로 설정할 수 있습니다. 절대 공유 변수 노드는 변수를 생성한 타겟의 공유 변수에 연결됩니다. 특정 타겟 공유 변수 노드는 노드가 포함된 VI를 실행하는 타겟의 공유 변수에 연결됩니다.

특정 타겟 공유 변수 노드가 포함된 VI를 새로운 타겟으로 이동하는 경우, 공유 변수를 새로운 타겟으로 이동해야 합니다. VI와 변수를 다른 타겟으로 이동할 것으로 예상되는 경우 특정 타겟 공유 변수 노드를 사용합니다.

절대 공유 변수 노드가 기본입니다. 노드를 마우스 오른쪽 버튼으로 클릭하고 참조 모드 ≫특정 타겟 또는 참조 모드≫절대를 선택하여 공유 변수 노드가 공유 변수에 연결되는 방법을 변경합니다. 

프로젝트 탐색기 윈도우에서 공유 변수를 마우스 오른쪽 버튼으로 클릭하고 언제든지 공유 변수 프로퍼티를 편집할 수 있습니다. LabVIEW 프로젝트는 새로운 설정을 메모리의 모든 공유 변수 참조에 전파합니다. 변수 라이브러리를 저장하면, 디스크에 저장된 변수 정의에도 이러한 변경 사항이 적용됩니다.

단일 프로세스 공유 변수


단일 프로세스 변수를 사용하여, 동일한 VI의 병렬 루프처럼 와이어로 연결할 수 없는 동일한 VI의 서로 다른 두 위치 간의 데이터를 전송하거나, 동일한 어플리케이션 인스턴스 내의 서로 다른 두 VI 간의 데이터를 전송합니다. 단일 프로세스 공유 변수의 기본 구현은 LabVIEW 글로벌 변수의 구현과 유사합니다. 기존 글로벌 변수에 비해 단일 프로세스 공유 변수의 주요 이점은 단일 프로세스 공유 변수를 네트워크의 모든 노드가 액세스 할 수 있는 네트워크 공유 변수로 변환할 수 있다는 것입니다.

단일 프로세스 공유 변수 및 LabVIEW Real-Time

결정론을 유지하기 위해, 리얼타임 어플리케이션은 비차단, 결정론적 메커니즘을 사용하여 우선 순위가 높은 Timed 루프 및 시간 결정적 우선 순위 VI와 같은 코드의 결정론적 섹션에서 코드의 비결정론적 섹션으로 데이터를 전송해야 합니다. LabVIEW Real-Time Module을 설치할 때 공유 변수 프로퍼티 대화 상자에서 리얼타임 FIFO 기능을 활성화하여 리얼타임 FIFO를 사용하도록 공유 변수를 설정할 수 있습니다. NI는 리얼타임 FIFO를 사용하여 시간 결정적 루프와 우선 순위가 낮은 루프 간에 데이터를 전송할 것을 권장합니다. 단일 프로세스 공유 변수에서 리얼타임 FIFO를 활성화하면 하위 레벨 리얼타임 FIFO VI를 사용하지 않아도 됩니다.

8.6 이전 버전의 LabVIEW에서 LabVIEW는 공유 변수 노드가 처음 공유 변수에 쓰거나 공유 변수에서 읽으려고 할 때 리얼타임 FIFO를 생성합니다. 이 동작으로 인해 후속 사용에 비해 각 공유 변수를 처음 사용할 때 실행 시간이 약간 길어집니다. 어플리케이션에 매우 정확한 타이밍이 필요한 경우 액세스 시간의 이러한 변동을 고려하기 위해 시간 결정적 루프에 초기 "가동 준비" 반복을 포함시키거나 시간 결정적 루프 외부에서 변수를 한 번 이상 읽으십시오.  LabVIEW 8.6 및 이후 버전에서, LabVIEW는 VI가 실행 예약되어 있을 때(대부분의 경우 어플리케이션의 최상위 VI가 실행되기 시작할 때) 리얼타임 FIFO를 생성하므로 공유 변수 노드의 첫 번째 실행을 특별히 고려할 필요가 없습니다.  

그림 4. 리얼타임 FIFO 지원 공유 변수


LabVIEW는 각 단일 프로세스 공유 변수에 여러 발신자 및 수신자가 있는 경우에도 각 공유 변수에 대해 단일 리얼타임 FIFO를 생성합니다. 데이터 완전성을 보장하기 위해, 여러 발신자는 여러 수신자와 마찬가지로 서로를 차단합니다. 하지만 수신자가 발신자를 차단하거나, 발신자가 수신자를 차단하지는 않습니다. 시간 결정적 루프에 사용되는 단일 프로세스 공유 변수의 여러 발신자 또는 여러 수신자는 사용하지 않는 것이 좋습니다.

그림 5. 단일 FIFO를 공유하는 여러 발신자 및 수신자


리얼타임 FIFO를 활성화하면, FIFO가 활성화된 변수의 두 가지 타입 중 하나를 선택할 수 있습니다. 이는 단일 원소 버퍼와 여러 원소 버퍼로 이 두 가지 타입의 차이는 근소합니다. 이 두 가지 타입의 버퍼가 보이는 차이점 한 가지는 단일 원소 FIFO의 경우 오버플로우 또는 언더플로우 조건에서 경고를 보고하지 않는다는 것입니다. 또 다른 차이점은 여러 수신자가 비어 있는 버퍼를 읽을 때 LabVIEW가 반환하는 값입니다. 단일 원소 FIFO의 여러 수신자가 동일한 값을 받을 경우, 발신자가 이 변수에 다시 쓸 때까지 단일 원소 FIFO는 동일한 값을 반환합니다. 비어 있는 여러 원소 FIFO의 여러 수신자는 각자 버퍼에서 읽은 최종값을 받거나, 변수에서 읽은 값이 전혀 없는 경우 변수 데이터 타입의 기본값을 받습니다. 이 동작은 아래와 같습니다.

그림 6. 마지막 읽기 동작 및 여러 원소 리얼타임 FIFO 공유 변수


어플리케이션에서 각 수신자가 여러 원소 FIFO 공유 변수에 작성되는 데이터 포인트를 모두 받아야 하는 경우, 각 수신자에 대해 별개의 공유 변수를 사용합니다.

네트워크 공유 변수


네트워크 공유 변수를 사용하면 이더넷 네트워크를 통해 공유 변수에 쓰고 읽을 수 있습니다. 네트워킹 구현은 전적으로 네트워크 변수에 의해 처리됩니다.

네트워크를 통해 데이터를 사용할 수 있게 하는 것 외에도 네트워크 공유 변수는 단일 프로세스 공유 변수로는 사용할 수 없는 많은 기능을 추가합니다. 이 추가 기능을 제공하기 위해 네트워크 공유 변수의 내부 구현은 단일 프로세스 공유 변수의 구현보다 훨씬 복잡합니다. 다음 몇 섹션에서는 이 구현의 몇 가지 측면에 대해 설명하고, 네트워크 공유 변수에서 최상의 성능을 얻는 권장 사항을 제공합니다.

NI-PSP

NI 게시 및 구독 프로토콜(NI-PSP)은 네트워크 공유 변수의 전송에 최적화된 네트워킹 프로토콜입니다.  NI-PSP의 최하위 프로토콜은 TCP/IP이며 데스크탑 시스템과 NI의 RT 타겟 모두에서 성능에 맞게 완벽하게 조정되었습니다(비교 벤치마크는 아래 참조).  

LogosXT의 작동 이론

그림 7은 네트워크 공유 변수의 소프트웨어 스택을 보여줍니다.  여기서 사용되는 작동 이론은 LogosXT라는 스택 수준에 따라 다르므로 이를 이해하는 것이 중요합니다.  LogosXT는 공유 변수의 처리량을 최적화하는 일을 담당하는 다층 계층입니다.

 

그림 7. 공유 변수 네트워크 다층

그림 8은 LogosXT 전송 알고리즘의 주요 구성 요소를 보여줍니다.  본질적으로 매우 간단합니다.  두 가지 중요한 액터가 있습니다

    1. 8킬로바이트(KB) 전송 버퍼
    2. 10밀리초(ms) 타이머 스레드

그림 8. LogosXT 액터.  버퍼가 가득 차거나 10ms가 만료되면 전송됩니다.

이러한 수치는 데이터 처리량을 최적화하기 위해 다양한 패킷 크기와 시간을 철저히 프로파일링하여 얻어진 것입니다.  알고리즘은 다음과 같습니다.

    • 10ms 타이머가 시작되기 전에 전송 버퍼가 용량(8KB)이 채워지면, 해당 버퍼의 데이터는 쓰기를 시작한 동일한 스레드의 TCP로 즉시 전송됩니다.  공유 변수의 경우 스레드는 공유 변수 엔진 스레드가 됩니다.
    • 버퍼가 최대 용량을 채우지 않고 10ms가 경과되면 데이터는 타이머의 스레드로 전송됩니다.

중요 공지: 두 개의 서로 다른 끝포인트 사이의 모든 연결에 대해 하나의 전송 버퍼가 있습니다.  즉, 서로 다른 두 시스템 간의 연결을 나타내는 모든 변수는 하나의 버퍼를 공유합니다.  이 전송 버퍼를 공유 변수의 버퍼링 프로퍼티와 혼동하지 마십시오.  이 전송 버퍼는 변수를 하나의 TCP 연결로 다중화하고 네트워크 처리량을 최적화하는 매우 낮은 수준의 버퍼입니다.

LabVIEW 다이어그램의 코드에 부수적인 영향을 미치기 때문에 이 네트워크 다층 계층의 기능을 이해하는 것이 중요합니다.  이 알고리즘은 10ms를 기다립니다. 단일 전송 작업에서 최대한 많이 전송하는 것이 처리량에 효율적이기 때문입니다.  모든 네트워크 작업에는 시간과 패킷 크기 모두에서 고정된 오버헤드가 있습니다.  총 B 바이트를 포함하는 많은 작은 패킷(N 패킷이라고 함)을 보내면 네트워크 오버헤드를 N 번 지불합니다.  대신 B 바이트를 포함하는 하나의 큰 패킷을 보내면 고정 오버헤드를 한 번만 지불하며 전체 처리량이 훨씬 커집니다.

이 알고리즘은 가장 높은 처리 속도로 타겟에서 또는 타겟으로 데이터를 스트리밍하려는 경우 매우 효과적입니다.  드물긴 하지만, 작은 패킷을 보내는 경우도 있습니다. 예를 들어, 릴레이 열기(1바이트의 불리언 데이터)와 같은 작업을 수행하기 위해 명령을 타겟에 보내는데, 최대한 빨리 도착하게 하고 싶다면, 대기 시간을 최적화해야 합니다.  LabVIEW 8.5에는 LogosXT가 버퍼를 강제로 비우게 만드는 후크가 없었습니다.  대신, 시스템상에서 최소 10ms의 대기 시간이 보장되므로, 해당 프로그램은 전송 버퍼가 채워질 때까지 기다렸다가, 최종적으로 10초 타이밍에 맞춰 데이터를 보낼 수 있습니다.  

어플리케이션에서 대기 시간을 최적화하는 것이 더 중요한 경우, LabVIEW 8.5.1 이후 버전에는 공유 변수 팔레트에 Flush Shared Variable Data.vi라는 새로운 함수가 있습니다.  이 VI를 사용하여 공유 변수 엔진과 네트워크를 통해 LogosXT의 전송 버퍼를 강제로 비웁니다.  이렇게 하면 대기 시간이 크게 줄어듭니다.  

그러나 위에서 언급한 것처럼 한 시스템을 다른 시스템에 연결하는 모든 공유 변수는 공유 변수 데이터 비우기를 호출하여 동일한 전송 버퍼를 공유하므로 시스템의 많은 공유 변수에 영향을 미칩니다.  높은 처리량에 의존하는 다른 변수가 있는 경우 Flush Shared Variable Data.vi를 호출하게 되면 변수에 부정적인 영향을 미칩니다 (그림 9).

 

그림 9. Flush Shared Variable Data.vi

 

배포 및 호스팅

네트워크에서 공유 변수 값을 호스트하는 공유 변수 엔진(SVE)에 네트워크 공유 변수를 배치해야 합니다. 공유 변수 노드에 쓸 때, LabVIEW는 변수를 배포하고 호스트한 SVE에 새로운 값을 보냅니다. 그런 다음 SVE 처리 루프는 값을 게시하여 구독자가 업데이트된 값을 얻도록 합니다. 그림 10은 이 프로세스를 보여줍니다. 클라이언트/서버 용어를 사용하자면, SVE는 공유 변수의 서버이고, 모든 참조는 변수에 쓰든 변수에서 읽든 관계없이 클라이언트입니다. SVE 클라이언트는 각 공유 변수 노드 구현의 일부이며, 이 백서에서 클라이언트구독자라는 용어는 서로 바꿔 사용할 수 있습니다.

그림 10. 공유 변수 엔진 및 네트워크 공유 변수 값 변경



네트워크 변수 및 LabVIEW 리얼타임

네트워크 공유 변수를 사용하여 리얼타임 FIFO를 활성화할 수 있지만 FIFO 지원 네트워크 공유 변수는 리얼타임 FIFO 지원 단일 프로세스 공유 변수와 비교하여 중요한 동작 차이가 있습니다. 단일 프로세스 공유 변수를 사용하면 모든 발신자와 수신자가 단일 리얼타임 FIFO를 공유합니다. 네트워크 공유 변수의 경우에는 이에 해당되지 않습니다. 네트워크 공유 변수의 각 수신자는 아래에 표시된 것처럼 단일 원소 및 다중 원소 모두에서 자체 리얼타임 FIFO를 얻습니다.

그림 11. 리얼타임 FIFO 지원 네트워크 변수



네트워크 버퍼링

네트워크 공유 변수와 함께 버퍼링을 사용할 수 있습니다. 그림 12와 같은 공유 변수 프로퍼티 대화 상자가 나타납니다.

그림 12. 네트워크 공유 변수에서 버퍼링 활성화


버퍼링을 활성화하면 데이터 타입 단위로 버퍼 크기(이 경우 두 배)를 지정할 수 있습니다.

버퍼링을 사용하면 변수의 읽기/쓰기 속도 간의 일시적인 변동을 처리할 수 있습니다. 발신자보다 느린 속도로 변수를 읽는 수신자는 일부 업데이트를 놓칠 수 있습니다. 어플리케이션에서 누락된 데이터 포인트를 허용할 수 있는 경우, 읽기 속도가 느려도 어플리케이션에 영향을 미치지 않으므로 버퍼링을 활성화할 필요가 없습니다. 그러나 수신자가 모든 업데이트를 받아야 하는 경우 버퍼링을 활성화하십시오. 공유 변수 프로퍼티 대화 상자의 변수 페이지에서 버퍼 크기를 설정할 수 있으므로 어플리케이션이 이전 데이터 덮어 쓰기를 시작하기 전에 유지할 업데이트 수를 결정할 수 있습니다.

위의 대화 상자에서 네트워크 버퍼를 설정하면 실제로 두 개의 다른 버퍼 크기를 설정하게 됩니다.  아래 그림 13에서 SVE(Shared Variable Engine)라고 표시된 상자 내부의 버퍼로 표시되는 서버 측 버퍼는 자동으로 작성되어 클라이언트 측 버퍼와 동일한 크기로 설정되며 1분 안에 해당 버퍼에 추가됩니다.  클라이언트 측 버퍼는 버퍼링을 활성화한 공유 변수를 설정할 때 필요한 버퍼일 가능성이 높습니다.  클라이언트 측 버퍼(그림 13의 오른쪽에 표시)는 이전 값의 큐를 유지 관리하는 버퍼입니다.  이 버퍼는 루프 속도 또는 네트워크 트래픽의 변동으로부터 공유 변수를 격리시킵니다.

모든 발신자와 수신자가 동일한 리얼타임 FIFO를 공유하는 리얼타임 FIFO 지원 단일 프로세스 변수와 달리, 네트워크 공유 변수의 각 수신자는 자체 버퍼를 가져오므로 수신자는 서로 상호 작용하지 않습니다 .

그림 13. 버퍼링


버퍼링은 읽기/쓰기 속도가 일시적으로 변동하는 상황에서만 도움이 됩니다. 어플리케이션이 무한정 실행되는 경우, 발신자보다 느린 속도로 읽는 수신자는 사용자가 지정한 버퍼 크기에 관계없이 데이터를 잃게 됩니다. 버퍼링은 모든 구독자에게 버퍼를 할당하므로 불필요한 메모리 사용을 피하려면 필요할 때만 버퍼링을 사용하십시오.

네트워크 및 리얼타임 버퍼링

네트워크 버퍼링과 리얼타임 FIFO를 모두 활성화하는 경우 공유 변수의 구현에 네트워크 버퍼와 리얼타임 FIFO가 모두 포함됩니다. 리얼타임 FIFO가 활성화된 경우, 각 발신자 및 수신자에 대해 새로운 리얼타임 FIFO가 생성되므로 여러 발신자 및 수신자가 서로 차단하지 않습니다.

그림14. 네트워크 버퍼링 및 리얼타임 FIFO



이 두 버퍼의 크기를 독립적으로 설정할 수 있지만, 대부분의 경우 동일한 크기를 유지하는 것이 좋습니다. 리얼타임 FIFO를 활성화하면, LabVIEW는 각 발신자와 수신자를 위해 새로운 리얼타임 FIFO를 생성합니다. 따라서 여러 발신자와 수신자가 서로를 차단하지 않습니다.

버퍼 수명

LabVIEW는 버퍼의 위치에 따라 초기 쓰기 또는 읽기에서 네트워크 및 리얼타임 FIFO 버퍼를 생성합니다. 서버 측 버퍼는 발신자가 공유 변수에 처음 쓸 때 생성됩니다. 클라이언트 측 버퍼는 구독이 설정될 때 작성됩니다.  LabVIEW 8.6 이전에는 공유 변수 읽기 또는 쓰기 노드가 처음 실행될 때 발생했습니다.  LabVIEW 8.6 및 이후 버전에서는 공유 변수 노드를 포함하는 VI가 시작될 때 발생합니다.  지정된 수신자가 해당 변수를 구독하기 전에 발신자가 공유 변수에 데이터를 쓰는 경우 초기 데이터 값을 구독자가 사용할 수 없습니다.

그림 15. 버퍼 수명



버퍼 오버플로우/언더플로우

네트워크 공유 변수는 LabVIEW 8.20 및 이후 버전에서 네트워크 버퍼 오버플로우 및 언더플로우 조건을 보고합니다. 모든 버전의 리얼타임 FIFO는 에러를 반환하여 FIFO 오버플로우/언더플로우를 나타냅니다. LabVIEW 8.0 또는 8.0.1의 어플리케이션은 두 가지 방법으로 네트워크 버퍼 언더플로우를 확인할 수 있습니다. 공유 변수의 타임스탬프 해상도가 1ms이므로, 1kHz 미만으로 변수를 업데이트할 때 버퍼 언더플로우를 감지하기 위해 공유 변수의 타임스탬프를 후속 읽기 타임스탬프와 비교할 수 있습니다. 또는 수신자는 데이터와 함께 번들로 제공되는 시퀀스 번호를 사용하여 버퍼 오버플로우/언더플로우를 알 수 있습니다. 데이터 타입이 배열인 경우, 시간 결정적 루프 내에서 사용되는 공유 변수와 함께 두 번째 방법을 사용할 수 없습니다. 왜냐하면 클러스터의 원소 중 하나가 배열인 경우, 리얼타임 FIFO 지원 공유 변수가 사용자 컨트롤(클러스터) 데이터 타입을 지원하지 않기 때문입니다.

공유 변수 수명

앞에서 언급했듯이 모든 공유 변수는 프로젝트 라이브러리의 일부입니다. SVE는 LabVIEW가 이러한 변수 중 하나를 필요로 할 때마다 프로젝트 라이브러리 및 해당 라이브러리에 포함된 공유 변수를 등록합니다. 기본적으로 SVE는 포함된 변수를 참조하는 VI를 실행하자마자 공유 변수 라이브러리를 배포하고 게시합니다. SVE는 공유 변수를 소유한 전체 라이브러리를 배포하므로 SVE는 실행 중인 VI가 모든 변수를 참조하는지 여부에 관계없이 라이브러리에 모든 공유 변수를 게시합니다. 프로젝트 탐색기 윈도우에서 라이브러리를 마우스 오른쪽 버튼으로 클릭하여 언제든지 프로젝트 라이브러리를 수동으로 배포할 수 있습니다.

VI를 중지하거나 공유 변수를 호스팅하는 시스템을 재부팅해도 네트워크에서 변수를 사용할 수 없습니다. 네트워크에서 공유 변수를 제거해야 하는 경우 프로젝트 탐색기 윈도우에서 변수가 속한 라이브러리를 명시적으로 배포 취소해야 합니다. 도구≫공유 변수≫변수 관리자를 선택하여 공유 변수 또는 변수의 전체 프로젝트 라이브러리를 배포 해제할 수도 있습니다. Labview 8.6에서 변수 관리자는 분산 시스템 관리자로 대체되었으며, 도구≫분산 시스템 관리자를 선택하여 찾을 수 있습니다.

프런트패널 데이터 연결

네트워크 공유 변수에만 사용 가능한 추가 기능은 프런트패널 데이터 연결입니다. 공유 변수를 프로젝트 탐색기 윈도우에서 VI의 프런트패널로 드래그하여 공유 변수에 연결된 컨트롤을 생성합니다. 컨트롤에 데이터 연결을 활성화한 경우 컨트롤 값을 변경하면 컨트롤이 연결된 공유 변수의 값이 변경됩니다. VI가 실행되는 동안 SVE에 대한 연결이 성공적인 경우 그림 16과 같이 녹색 인디케이터가 VI의 프런트패널 객체 옆에 나타납니다.

그림 16. 프런트 패널 컨트롤을 공유 변수에 연결


프로퍼티 대화 상자의 데이터 연결 페이지에서 컨트롤 또는 인디케이터에 대한 연결에 액세스하고 변경할 수 있습니다. LabVIEW Real-Time Module 또는 LabVIEW DSC Module을 사용할 때 도구≫공유 변수≫프런트패널 연결 일괄 설정을 선택하여 프런트패널 연결 일괄 설정 대화 상자를 표시하고 많은 컨트롤과 인디케이터를 공유 변수에 연결하는 운영자 인터페이스를 생성할 수 있습니다.

프런트패널이 존재하지 않을 수 있으므로 LabVIEW Real-Time에서 실행되는 어플리케이션에 프런트패널 데이터 연결을 사용하지 않는 것이 좋습니다.

프로그램적 액세스

위에서 설명한 것처럼 LabVIEW 프로젝트를 사용하여 대화식으로 공유 변수를 생성, 설정 및 배포할 수 있으며, 블록 다이어그램의 공유 변수 노드를 사용하거나 프런트패널 데이터 연결을 통해 공유 변수를 읽고 쓸 수 있습니다. LabVIEW 2009 및 이후 버전에서도 이 모든 기능에 프로그램적 방식으로 액세스할 수 있습니다.

VI 서버를 사용하여 많은 수의 공유 변수를 생성해야 하는 어플리케이션에서 프로그램적 방식으로 프로젝트 라이브러리 및 공유 변수를 생성합니다. 또한 LabVIEW DSC Module은 프로그램적으로 공유 변수 및 프로젝트 라이브러리를 생성 및 편집하고 SVE를 관리할 수 있는 포괄적인 VI 세트를 제공합니다. 공유 변수 라이브러리는 프로그래밍 방식으로 Windows 시스템에서만 작성할 수 있습니다. 그러나 이 새로운 라이브러리를 프로그래밍 방식으로 Windows 또는 LabVIEW Real-Time 시스템에 배포할 수 있습니다.

VI가 읽고 쓰는 공유 변수를 동적으로 변경해야 하거나 많은 수의 변수를 읽고 쓸 필요가 있는 어플리케이션에서 프로그램적 방식 공유 변수 API를 사용하십시오. 프로그램적 방식으로 URL을 작성하여 공유 변수를 동적으로 변경할 수 있습니다. 

그림 17. 프로그램적 방식 공유 변수 API를 사용하여 공유 변수 읽기 및 쓰기



또한 NI LabWindows/CVI 8.1 및 NI Measurement Studio 8.1에 네트워크 변수 라이브러리가 도입되어 ANSI C, Visual Basic .NET 또는 Visual C #에서 공유 변수를 읽고 쓸 수 있습니다.

공유 변수 엔진


SVE는 네트워크 공유 변수가 네트워크를 통해 값을 보낼 수 있도록 하는 소프트웨어 프레임워크입니다. Windows에서 LabVIEW는 SVE를 서비스로 설정하고 시스템 시작시 SVE를 시작합니다. 리얼타임 타겟에서 SVE는 시스템 부팅시 로드되는 설치 가능한 시작 구성 요소입니다.

네트워크 공유 변수를 사용하려면 분산 시스템의 하나 이상의 노드에서 SVE가 실행 중이어야 합니다. 네트워크의 모든 노드는 SVE가 게시하는 공유 변수를 읽거나 쓸 수 있습니다. 표 1에 표시된 것처럼 노드는 SVE를 설치하지 않고도 변수를 참조할 수 있습니다. 어플리케이션 요구 사항에 따라 서로 다른 위치에 공유 변수를 배포해야 하는 경우, 여러 시스템에 여러 SVE를 동시에 설치할 수도 있습니다.

공유 변수 호스팅 위치에 대한 권장 사항

분산 시스템에서 사용하는 네트워크 공유 변수를 배포하고 호스팅할 계산 디바이스를 결정할 때, 여러 가지 인자를 고려해야 합니다.

계산 디바이스가 SVE와 호환됩니까?

다음 표는 SVE가 사용 가능한 플랫폼을 요약하고 참조 노드 또는 DataSocket API를 통해 네트워크 공유 변수를 사용할 수 있는 플랫폼을 식별합니다. 최소 32MB의 RAM이 필요하며 모든 해당 플랫폼에서 SVE에 64MB를 사용하는 것을 권장합니다.

Linux 또는 Macintosh에서는 공유 변수 호스팅이 지원되지 않습니다.

Windows PCs
Mac OS
Linux
PXI​
리얼타임
Compact FieldPoint
CompactRIO
Compact Vision System
LabVIEW Real-Time
ETS 설치 상업용 PC
SVE
X
X
참조 노드
X
X
DataSocket API(PSP 포함)
표 1. 네트워크 공유 변수 호환성 개요

어플리케이션에 데이터 로깅 및 감독 기능이 필요합니까?

LabVIEW DSC Module의 기능을 사용하려면 Windows에서 공유 변수를 호스팅해야 합니다. LabVIEW DSC Module은 네트워크 공유 변수에 다음 기능을 추가합니다.
· NI Citadel 데이터베이스에 대한 히스토리 로깅.
· 네트워크 알람 및 알람 로깅.
· 스케일링.
· 사용자 기반 보안.
· 초기값.
· 사용자 지정 I/O 서버를 만드는 기능.
· LabVIEW 이벤트 구조를 공유 변수와 통합.
· 공유 변수 및 공유 변수 엔진의 모든 측면을 프로그램적 방식으로 제어하는 LabVIEW VI. 이 VI는 많은 수의 공유 변수를 관리하는 데 특히 유용합니다.

계산 디바이스에 적절한 프로세서 및 메모리 리소스가 있습니까?

SVE는 처리 및 메모리 리소스가 모두 필요한 추가 프로세스입니다. 분산 시스템에서 최상의 성능을 얻으려면 메모리 및 처리 기능이 가장 많은 시스템에 SVE를 설치하십시오.

 

어떤 시스템이 항상 온라인 상태입니까?

일부 시스템이 주기적으로 오프라인 상태가 될 수 있는 분산 어플리케이션을 구축하는 경우, 항상 온라인 상태인 시스템에서 SVE를 호스팅하십시오.

공유 변수 엔진의 추가 기능

그림 18은 SVE의 많은 역할을 보여줍니다. SVE는 네트워크 공유 변수를 관리할 뿐만 아니라 다음을 담당합니다.
· I/O 서버에서 받은 데이터 수집.
· OPC 및 PSP 서버를 통해 구독자에게 데이터를 제공.
· 설정된 서비스에 공유 변수에 대한 스케일링, 알람 및 로깅 서비스 제공. 이러한 서비스는 LabVIEW DSC Module에서만 제공됩니다.
· 알람 조건 모니터링 및 그에 따른 대응.

I/O 서버

I/O 서버는 프로그램이 SVE를 사용하여 데이터를 게시할 수 있는 SVE의 플러그인입니다. NI FieldPoint에는 FieldPoint 뱅크에서 SVE로 직접 데이터를 게시하는 I/O 서버가 포함되어 있습니다. SVE는 OPC 서버이므로 SVE와 FieldPoint I/O 서버의 조합은 FP OPC 서버 역할을 합니다. FieldPoint 설치 프로그램에는 SVE가 포함되어 있지 않습니다. LabVIEW와 같은 다른 소프트웨어 구성 요소로 설치해야 합니다.

NI-DAQmx에는 NI-DAQmx 글로벌 버추얼 채널을 SVE에 자동으로 게시할 수 있는 I/O 서버도 포함되어 있습니다. 이 I/O 서버는 기존 DAQ OPC 서버와 RDA를 대체합니다. NI-DAQmx에는 SVE가 포함되어 있으며 LabVIEW가 설치되지 않은 경우 SVE를 설치할 수 있습니다.

LabVIEW DSC Module로 사용자는 새로운 I/O 서버를 생성할 수 있습니다.

그림 18. 공유 변수 엔진(SVE)



OPC

SVE는 3.0을 준수하며 Windows 시스템에서 OPC 서버로 작동할 수 있습니다. 모든 OPC 클라이언트는 Windows 시스템에서 호스팅되는 공유 변수에 쓰거나 읽을 수 있습니다. Windows 시스템에 LabVIEW DSC Module을 설치할 때 SVE도 OPC 클라이언트로 작동할 수 있습니다. DSC를 사용하고 변수를 OPC 데이터 항목에 쓰거나 읽음으로써 Windows 시스템이 호스트하는 공유 변수를 OPC 데이터 항목에 연결할 수 있습니다.

OPC는 Windows API인 COM을 기반으로 하는 기술이므로 리얼타임 타겟은 OPC와 직접 작동하지 않습니다. 그림 19에서 볼 수 있듯이 Windows 시스템에서 공유 변수를 호스팅하여 리얼타임 타겟에서 OPC 데이터 항목에 계속 액세스할 수 있습니다.

그림 19. OPC 데이터 항목에 연결

성능


이 섹션에서는 공유 변수를 사용하여 고성능 어플리케이션을 작성하기 위한 일반 지침을 제공합니다.

단일 프로세스 공유 변수는 LabVIEW 글로벌 변수 및 리얼타임 FIFO와 유사한 구현을 가지고 있기 때문에 NI는 단일 프로세스 공유 변수에 대한 우수한 성능을 달성하기 위한 특정한 권장 사항이 없습니다. 다음 섹션에서는 네트워크 공유 변수에 중점을 둡니다.

프로세서 공유

네트워크 공유 변수는 네트워크 프로그래밍의 많은 구현 세부 사항을 숨겨 LabVIEW 블록 다이어그램을 단순화합니다. 어플리케이션은 LabVIEW VI와 SVE 및 SVE 클라이언트 코드로 구성됩니다. 최상의 공유 변수 성능을 얻으려면 SVE 스레드가 실행될 프로세서를 정기적으로 포기하도록 어플리케이션을 개발하십시오. 이를 달성하는 한 가지 방법은 처리 루프에 대기를 배치하고 어플리케이션이 시간 제약 없는 루프를 사용하지 않도록 하는 것입니다. 기다려야 하는 정확한 시간은 어플리케이션, 프로세서 및 네트워크에 따라 다릅니다. 모든 어플리케이션은 최고의 성능을 달성하기 위해 일정 수준의 경험적 튜닝이 필요합니다.

SVE의 위치 고려

공유 변수 호스팅 위치에 대한 권장 사항 섹션에서는 SVE를 설치할 위치를 결정할 때 고려해야 할 여러 가지 인자에 대해 설명했습니다. 그림 20은 공유 변수의 성능에 큰 영향을 줄 수 있는 다른 요인을 보여줍니다. 이 예에는 리얼타임 타겟이 포함되지만 기본 원칙은 비리얼타임 시스템에도 적용됩니다. 그림 20은 네트워크 공유 변수의 비효율적인 사용을 보여줍니다. 리얼타임 타겟에서 데이터를 생성하고 로컬로 처리된 데이터를 로깅하고 원격 시스템에서 모니터링해야 합니다. 변수 구독자는 SVE로부터 데이터를 수신해야 하므로, 우선 순위가 높은 루프의 쓰기와 우선 순위가 보통인 루프 읽기 사이의 대기 시간이 크며, 네트워크에 걸쳐 두 번의 트립이 발생합니다.

그림 20. 네트워크 변수를 리얼타임으로 비효율적으로 사용


그림 21은 이 어플리케이션을 위한 더 나은 아키텍처를 보여줍니다. 어플리케이션은 단일 프로세스 공유 변수를 사용하여 우선 순위가 높은 루프와 우선 순위가 낮은 루프 간에 데이터를 전송하여 대기 시간을 크게 줄입니다. 우선 순위가 낮은 루프는 데이터를 기록하고 업데이트를 호스트의 가입자에 대한 네트워크 공유 변수에 씁니다.

그림 21. 네트워크 변수를 리얼타임으로 효율적으로 사용

벤치마크

이 섹션에서는 공유 변수의 성능을 LabVIEW 글로벌 변수, 리얼타임 FIFO 및 TCP/IP와 같은 LabVIEW의 다른 적용 가능한 데이터 공유 방법과 비교합니다. 다음 표는 다음 섹션에서 설명하는 테스트를 요약한 것입니다.

 

테스트
설명
SVE 위치
노트
T1
단일 프로세스 공유 변수 대 전역 변수
해당 없음
최대 읽기/쓰기 속도를 설정합니다.
T2
리얼타임 FIFO 대 리얼타임 FIFO VI를 사용한
 단일 프로세스 공유 변수
해당 없음

리얼타임 FIFO를 사용할 때 최대 읽기/쓰기 속도를 설정합니다.

Timed 루프에서 공유 변수 또는 리얼타임 FIFO에 쓸 수 있는 동시에 표준 우선 순위 루프에서 데이터를 다시 읽을 수 있는 지속 가능 최고 속도를 결정합니다.

T3
리얼타임 FIFO가 있는 네트워크 공유 변수 대 TCP가 있는 2루프 리얼타임 FIFO
LV RT를 실행하는 PXI

단일 지점 데이터가 네트워크를 통해 스트리밍될 수 있는 최대 속도를 설정합니다.

공유 변수: 수신자 VI는 항상 호스트에 있습니다. RT-FIFO + TCP: TCP 통신을 추가되고, T2와 유사합니다 ./IP 네트워킹.

T4
네트워크 공유 변수 배치 공간
RT 시리즈 타겟
배포 후 공유 변수의 메모리 사용을 설정합니다.

T5

8.2 네트워크 공유 변수와 8.5 변수 비교 - 스트리밍

RT 시리즈 타겟

NI-PSP의 새로운 8.5 구현을 8.20 및 이전 구현과 비교.

이 벤치마크는 cRIO 디바이스에서 데스크탑 호스트로 파형 데이터를 스트리밍하는 어플리케이션의 처리량을 측정합니다.

T6

8.2 네트워크 공유 변수와 8.5 변수 비교 - 높은 채널 수

RT 시리즈 타겟

NI-PSP의 새로운 8.5 구현을 8.20 및 이전 구현과 비교.

이 벤치마크는 cRIO 디바이스에서 많은 채널 수의 어플리케이션 처리량을 측정합니다.

표 2. 벤치마크 개요


다음 섹션은 각 벤치마크에 대해 생성된 NI 코드와 실제 벤치마크 결과에 대해 설명합니다. 방법 및 설정 섹션에서는 각 벤치마크에 대해 선택된 방법과 벤치마크가 실행된 하드웨어 및 소프트웨어에 사용된 세부 설정에 대해 자세히 설명합니다.

단일 프로세스 공유 변수 대 LabVIEW 글로벌 변수

단일 프로세스 공유 변수는 LabVIEW 글로벌 변수와 유사합니다. 실제로 단일 프로세스 공유 변수의 구현은 타임스탬프 기능이 추가된 LabVIEW 글로벌입니다.

단일 프로세스 공유 변수의 성능을 LabVIEW 글로벌 변수와 비교하기 위해 NI는 벤치마크 VI를 생성하여 VI가 매초마다 LabVIEW 글로벌 변수 또는 단일 프로세스 공유 변수를 읽고 쓸 수 있는 횟수를 측정했습니다. 그림 22는 단일 프로세스 공유 변수 읽기 벤치마크를 보여줍니다. 단일 프로세스 공유 변수 쓰기 벤치마크와 LabVIEW 글로벌 읽기/쓰기 벤치마크는 동일한 패턴을 따릅니다.

그림 22. 단일 프로세스 공유 변수 읽기 벤치마킹 VI


조합 읽기/쓰기 테스트에는 데이터 손상 없이 동일한 반복 루프에서 작성된 모든 포인트를 다시 읽을 수 있는지 검증하는 코드도 포함됩니다.

T1 테스트 결과

그림 23은 테스트 T1의 결과를 보여줍니다. 결과는 단일 프로세스 공유 변수의 읽기 성능이 LabVIEW 글로벌 변수의 읽기 성능보다 낮음을 보여줍니다. 단일 프로세스 공유 변수의 쓰기 성능 및 읽기/쓰기 성능은 LabVIEW 글로벌 변수의 쓰기 성능보다 약간 낮습니다. 단일 프로세스 공유 변수의 성능은 타임스탬프 기능을 활성화 및 비활성화하는 것에 영향을 받으므로, 타임스탬프가 유용하지 않은 경우 끄는 것이 좋습니다.


방법 및 설정 섹션에서는 이 테스트 세트의 특정 벤치마킹 방법 및 설정 세부 사항을 설명합니다.

 


그림 23. 단일 프로세스 공유 변수 대 글로벌 변수 성능



단일 프로세스 공유 변수 대 리얼타임 FIFO

NI는 지속 가능 처리량을 벤치마킹하여 FIFO 지원 단일 프로세스 공유 변수의 성능을 기존의 리얼타임 FIFO VI와 비교합니다. 벤치마크는 또한 두 개의 리얼타임 FIFO 구현 각각에 대해 전송된 데이터 크기 또는 페이로드의 영향을 조사합니다.

테스트는 데이터를 생성하는 TTC (Time-Critical Loop)와 데이터를 소비하는 NPL (Normal-Priority Loop)로 구성됩니다. NI는 다양한 배정밀도 스칼라 및 배열 데이터 타입을 스윕하여 페이로드 크기의 영향을 판별했습니다. 스칼라 타입은 페이로드가 2배일 때 처리량을 결정하고 배열 타입은 나머지 페이로드에 대한 처리량을 결정합니다. 테스트는 데이터 손실 없이 두 루프를 모두 실행할 수 있는 최대 지속 가능 속도를 결정하여 최대 지속 가능 처리량을 기록합니다.

그림 24는 FIFO를 생성하고 파괴하는 데 필요한 많은 코드를 생략하는 리얼타임 FIFO 벤치마크의 간소화된 다이어그램을 보여줍니다. LabVIEW 8.20부터는 여기에 표시된 FIFO SubVI를 대체하기 위해 새로운 FIFO 함수가 도입되었습니다. FIFO 기능은 이 백서에서 그래프로 표시된 데이터에 사용되었으며 8.0.x SubVI 이전 버전보다 성능이 우수합니다.

그림 24. 간소화된 리얼타임 FIFO 벤치마킹 VI


동등한 버전의 테스트는 단일 프로세스 공유 변수를 사용합니다. 그림 25는 해당 다이어그램을 간략하게 보여줍니다.

그림 25. 간소화된 FIFO 지원 단일 프로세스 공유 변수 벤치마킹 VI



T2 테스트 결과

그림 26과 27은 FIFO 지원 단일 프로세스 공유 변수의 성능과 리얼타임 FIFO 기능을 비교한 테스트 T2의 결과를 보여줍니다. 결과는 단일 프로세스 공유 변수를 사용하는 것이 리얼타임 FIFO를 사용하는 것보다 조금 느리다는 것을 나타냅니다.

그림 26. 단일 프로세스 공유 변수 대 리얼타임 FIFO VI 성능(PXI)

그림 27. 단일 프로세스 공유 변수 대 리얼타임 FIFO VI 성능(cRIO 9012)



네트워크 공유 변수 대 리얼타임 FIFO 및 TCP/IP

공유 변수의 유연성을 통해 몇 가지 설정 변경만으로 네트워크에서 단일 프로세스 공유 변수를 신속하게 게시할 수 있습니다. 특히 리얼타임 어플리케이션의 경우, 이전 버전의 LabVIEW에서 동일한 변환을 수행하려면 RT 시리즈 컨트롤러에서 리얼타임 FIFO를 읽고 사용 가능한 여러 네트워킹 프로토콜 중 하나를 선택하여 네트워크를 통해 데이터를 전송하기 위해 많은 양의 코드를 도입해야 합니다. 이 두 가지 다른 접근 방식의 성능을 비교하기 위해 NI는 벤치마크 VI를 다시 생성하여 다양한 페이로드에서 데이터 손실 없이 각각의 지속 가능 처리량을 측정했습니다.

사전 변수 접근 방식의 경우 벤치마크 VI는 리얼타임 FIFO와 TCP/IP를 사용합니다. TCL은 데이터를 생성하여 리얼타임 FIFO에 배치합니다. NPL은 FIFO에서 데이터를 읽고 TCP/IP를 사용하여 네트워크를 통해 전송합니다. 호스트 PC는 데이터를 수신하고 데이터 손실이 없는지 확인합니다.

그림 28은 리얼타임 FIFO 및 TCP/IP 벤치마크의 간소화된 다이어그램을 보여줍니다. 이 다이어그램은 실제 벤치마크 VI를 크게 단순화합니다.

그림 28. 간소화된 리얼타임 FIFO 및 TCP/IP 벤치마킹 VI


NI는 네트워크 공유 변수를 사용하여 동등한 테스트 버전을 생성했습니다. 그림 29는 단순화된 다이어그램을 보여줍니다.

그림 29. 리얼타임 FIFO 지원 네트워크 공유 변수 벤치마킹 VI



T3 테스트 결과

이 섹션에는 테스트 T3의 결과가 포함되어 있으며, 리얼타임 FIFO 지원 네트워크 퍼블리싱 공유 변수의 성능과 리얼타임 FIFO VI 및 LabVIEW TCP/IP 프리미티브에 의존하는 동등한 코드의 성능을 비교합니다. 그림 30은 LabVIEW 리얼타임 타겟이 임베디드 RT 시리즈 PXI 컨트롤러일 때의 결과를 보여줍니다.

그림 30. 네트워크 공유 변수 대 리얼타임 FIFO 및 TCP VI 성능(PXI)


 T3 결과는 네트워크 공유 변수의 처리량이 TCP의 처리량에 근접하고, 둘 다 중간 페이로드 크기에서 큰 페이로드 크기에 걸쳐 일관됨을 나타냅니다.  공유 변수를 사용하면 프로그래밍 작업이 쉬워지지만 비용이 들지 않습니다.  그러나 TCP 구현을 사용하는 경우 특히 NI-PSP의 새로운 8.5 구현에서 공유 변수를 쉽게 수행할 수 없다는 점에 유의해야 합니다.

 
T4 테스트 결과

네트워크 공유 변수의 메모리 배치 공간

LabVIEW 8.5에서는 가변 배치 공간에 중요한 변경이 이루어지지 않았다는 점에 유의하십시오.  따라서 이 벤치마크는 재실행되지 않았습니다.

공유 변수의 메모리는 배치 공간에 따라 달라지기 때문에 공유 변수의 메모리 배치 공간을 결정하는 것은 어렵습니다. 예를 들어 버퍼링이 있는 네트워크 공유 변수는 프로그램에서 필요에 따라 메모리를 동적으로 할당합니다. 리얼타임 FIFO를 사용하도록 공유 변수를 설정하면 네트워크 버퍼 외에도 LabVIEW가 FIFO에 대한 버퍼를 생성하므로 메모리 사용량이 증가합니다. 따라서 이 백서의 벤치마크 결과는 메모리의 기본 측정만 제공합니다.

그림 31은 LabVIEW가 지정된 유형의 500 및 1000개 공유 변수를 LabVIEW에 배포한 후 SVE가 사용하는 메모리를 보여줍니다. 그래프는 변수 유형이 배포된 공유 변수의 메모리 사용량에 큰 영향을 미치지 않음을 보여줍니다. 이러한 변수는 버퍼링되지 않은 변수입니다.

그림 31. 데이터 유형이 다른 네트워크 공유 변수의 메모리 사용량

그림 32는 메모리 사용량을 배포된 공유 변수 수의 함수로 보여줍니다. 이 테스트는 빈 불리언 배열이라는 한 가지 유형의 변수만 사용합니다. 메모리 사용량은 변수 수에 따라 선형적으로 증가합니다.

그림 32. 크기가 다른 공유 변수의 메모리 사용량

 

T5 테스트 결과

8.2 네트워크 공유 변수와 8.5 변수 비교 - 스트리밍
 
LabVIEW 8.5에서는 공유 변수 데이터 전송에 사용되는 네트워크 프로토콜의 하단 레이어를 다시 구현했습니다.  이는 훨씬 더 나은 성능을 제공합니다.
 
이 경우, cRIO 9012에서 Waveform of Doubles 유형의 단일 변수를 호스팅했습니다.  우리는 모든 데이터를 생성한 다음, 긴밀한 루프를 통해 다른 웨이브폼 공유 변수 노드에서 데이터를 읽어내는 호스트로 데이터를 최대한 빨리 전송했습니다.
 
그림 30에서 볼 수 있듯이 LabVIEW 8.5에서 이 사용 사례의 성능이 600% 이상 향상되었습니다.
 

그림 33. LabVIEW 8.5와 LabVIEW 8.20 (혹은 더 이전 버전) 사이의 웨이브폼 처리량 비교

T6 테스트 결과

8.2 네트워크 공유 변수와 8.5 변수 비교 - 스트리밍

이 테스트에서는 T5와 동일한 두 개의 타겟을 사용했지만, 단일 변수를 전송하는 대신 데이터 타입을 더블로 변경하고 공유 변수 수를 1 - 1,000개로 변경하여 처리량을 측정했습니다.  다시, 모든 변수는 cRIO 9012에서 호스팅되었고, 증분 데이터도 그곳에서 생성되어 해당 변수를 읽은 호스트로 전송되었습니다.

그림 34는 다시 LabVIEW 8.20에서 LabVIEW 8.5까지 상당한 성능 증가를 보여줍니다.  그러나 T5와 같이 하나의 큰 변수가 있는 것보다 작은 변수가 많은 경우 처리량이 크게 줄어듭니다.  이는 각 변수가 고정된 오버헤드 양과 연관되어 있기 때문입니다.  많은 변수를 사용하면 이러한 오버헤드에 변수의 수를 곱하여 바람직하지 않은 결과가 나타납니다.

그림 34. LabVIEW 8.5와 LabVIEW 8.20(혹은 더 이전 버전) 간의 높은 채널 수 처리량 비교


방법 및 설정

이 섹션에서는 앞에서 언급한 모든 테스트 세트에 대한 벤치마크 프로세스에 대한 자세한 정보를 제공합니다.

T1 방법 및 고려 사항

테스트 T1은 간단한 벤치마킹 템플릿을 사용하여 많은 반복에 대한 간단한 평균을 통해 읽기 및 쓰기 속도를 결정합니다. 각 테스트는 총 실행 시간에 대해 밀리초 분해능으로 시간을 맞춘 1분 순서에 따라 총 5억 번의 반복을 실행했습니다.

T1 하드웨어/소프트웨어 설정

 

호스트 하드웨어
  • Dell Precision 450
  • Dual Intel Xeon 2.4 GHz 펜티엄급 프로세서
  • 1GB DRAM

호스트 소프트웨어
  • Windows XP SP2
  • LabVIEW 8.20

T2 방법 및 고려 사항

테스트 T2는 서로 다른 우선 순위로 실행되는 태스크 간의 최대 지속 가능 통신 속도를 파악하여 처리량을 측정합니다. 마이크로초 분해능으로 실행되는 Timed 루프에는 데이터 생성기가 포함되어 있습니다. 데이터의 소비자는 리얼타임FIFO 또는 단일 프로세스 공유 변수를 비어 있을 때까지 읽는 자유 실행 중간 우선 순위 루프로서, 이 과정을 에러 없이 일정 시간이 경과할 때까지 반복합니다. 테스트 결과는 다음 문장이 모두 참일 경우에만 유효합니다.

  • 버퍼 오버플로우가 발생하지 않음
  • 데이터 무결성 보존: 데이터 손실은 발생하지 않으며 소비자는 전송된 순서대로 데이터를 수신함
  • 1초의 지정된 워밍업 시간 후에도 Timed 루프가 유지됨


단일 프로세스 공유 변수 수신기 루프는 예상 데이터 포인트 수가 수신되었는지, 수신된 메시지 패턴에서 중간 값이 부족하지 않았는지 확인하는 등 간단한 데이터 무결성 검사를 수행합니다.

NI는 리얼타임 FIFO 및 공유 변수 FIFO 버퍼의 버퍼 크기를 모든 테스트 변형 및 관련 데이터 타입에 대해 100 원소 깊이로 설정했습니다.

T2 하드웨어/소프트웨어 설정

 

PXI 하드웨어
  • NI PXI-8196 RT 시리즈 컨트롤러
  • 2.0GHz 펜티엄급 프로세서
  • 256MB DRAM
  • Broadcom 57xx(1 Gb/s 내장 이더넷 어댑터)

PXI 소프트웨어
  • LabVIEW 2020 Real-Time Module
  • 네트워크 변수 엔진 1.2.0
  • 변수 클라이언트 지원 1.2.0
  • 폴링 모드로 설정된 Broadcom 57xx 기가비트 이더넷 드라이버 2.1

CompactRIO 하드웨어

  • NI cRIO 9012 컨트롤러
  • 400MHz 프로세서
  • 64MB DRAM

CompactRIO 소프트웨어

  • LabVIEW 2020 Real-Time Module
  • 네트워크 변수 엔진 1.2.0
  • 변수 클라이언트 지원 1.2.0  

 

T3 방법 및 고려 사항

테스트 T3은 네트워크를 통해 전송되는 데이터의 양과 테스트의 전체 기간을 기록함으로써 처리량을 직접 측정합니다. 마이크로초 분해능으로 실행되는 Timed 루프에는 데이터 생산자가 포함되어 있으며, 이는 네트워크에서 발행한 공유 변수나 리얼타임 FIFO VI에 특정 데이터 패턴을 작성하는 역할을 담당합니다.

네트워크 공유 변수 사례의 경우, NPL은 호스트 시스템에서 실행되며 루프 중 자유 실행으로 변수에서 읽습니다. 리얼타임 FIFO VI 테스트의 경우, NPL은 리얼타임 시스템에서 실행되어, 지정된 속도로 FIFO의 상태를 확인하고, 이용 가능한 모든 데이터를 읽고, TCP를 이용하여 네트워크를 통해 전송합니다. 벤치마크 결과는 이 폴링 기간이 1ms 또는 10ms로 설정된 효과를 보여줍니다.

테스트 결과는 다음 문장이 모두 참일 경우에만 유효합니다.

  • 버퍼 오버플로우가 발생하지 않음(FIFO 또는 네트워크 없음)
  • 데이터 무결성 보존: 데이터 손실은 발생하지 않으며 소비자는 전송된 순서대로 데이터를 수신함
  • TCL VI의 Timed 루프는 1초의 지정된 워밍업 시간 후에 따라갈 수 있다.


각 데이터 포인트를 읽은 후, 네트워크 변수 테스트를 위한 NPL은 데이터 패턴의 정확성을 점검합니다. 리얼타임 FIFO 테스트의 경우 TCL은 리얼타임 FIFO 오버플로우가 발생했는지 여부에 기반한 검증을 담당합니다.

NI는 데이터 손실을 방지하기 위해 버퍼 크기를 NPL 루프 주기 및 TCL 루프 주기 사이의 비율보다 작지 않도록 설정했으며, 리얼타임 FIFO 버퍼의 최소 크기는 100 원소 미만으로 설정했습니다.

T3 하드웨어/소프트웨어 설정

 

호스트 하드웨어
  • Intel Core 2 Duo 1.8GHz
  • 2GB DRAM
  • Intel PRO/1000(1Gb/s 이더넷 어댑터)

호스트 소프트웨어
  • Windows Vista 64 
  • LabVIEW 8

네트워크 설정
  • 1Gb/s 스위치형 네트워크

PXI 하드웨어
  • NI PXI-8196 RT 컨트롤러
  • 2.0GHz 펜티엄급 프로세서
  • 256MB DRAM
  • Broadcom 57xx(1 Gb/s 내장 이더넷 어댑터)

PXI 소프트웨어
  • LabVIEW 8.5 Real-Time Module
  • 네트워크 변수 엔진 1.2.0
  • 변수 클라이언트 지원 1.2.0
  • Broadcom 57xx 기가비트 이더넷 드라이버 2.1

 

 


T4 방법 및 고려 사항

테스트 T4에서 NI는 이중, 단일, 불리언, 이중 배열, 단일 배열 및 불리언 배열과 같은 데이터 타입을 가진 버퍼링되지 않은 네트워크 공유 변수를 사용했습니다.

T3 하드웨어/소프트웨어 설정



PXI 하드웨어
  • NI PXI-8196 RT 컨트롤러
  • 2.0GHz 펜티엄급 프로세서
  • 256MB DRAM
  • Broadcom 57xx(1 Gb/s 내장 이더넷 어댑터)

PXI 소프트웨어
  • LabVIEW Real-Time Module 8.0
  • 네트워크 변수 엔진 1.0.0
  • 변수 클라이언트 지원 1.0.0
  • Broadcom 57xx 기가비트 이더넷 드라이버 1.0.1.3.0

T5 및 T6 방법 및 고려 사항

테스트 T5와 T6에서 NI는 이중 데이터 유형의 파형의 버퍼링되지 않은 네트워크 공유 변수를 사용했습니다.는 이중 데이터 유형의 파형의 버퍼링되지 않은 네트워크 공유 변수를 사용했습니다.

T5 및 T6 하드웨어/소프트웨어 설정

호스트 하드웨어

  • 64비트 Intel Core 2 Duo 1.8GHz
  • 2GB RAM
  • 기가비트 이더넷

호스트 소프트웨어

  • Windows Vista 64
  • LabVIEW 8.20 및 LabVIEW 8.5

CompactRIO 하드웨어

  • cRIO 9012
  • 64MB RAM

CompactRIO 소프트웨어

  • LabVIEW RT 8.20 및 LabVIEW RT 8.5
  • 네트워크 변수 엔진 1.2(LabVIEW 8.20 포함) 및 1.4(LabVIEW 8.5 포함)
  • 변수 클라이언트 지원 1.0(LabVIEW 8.20 포함) 및 1.4(LabVIEW 8.5 포함)