LabVIEW/LabVIEW Real-Time에서 MATRIXx SystemBuild 실행하기
개요
MATRIXx SystemBuild로 복합적인 다이나믹 시스템을 모델링할 수 있습니다. MATRIXx는 또한 모델을 검증하고 조사할 수 있도록 오프라인 시뮬레이션을 실행하는 데에 사용됩니다. 그러나, 설계 프로세스의 일부분으로써, 모델을 물리적인 시스템과 통합하는 것 또한 필수적입니다. 예를 들어, 컨트롤 디자인은 프로토타입 단계에서 실제 시스템과의 확인 절차가 필요합니다. 그 후 설계 프로세스에서 컨트롤러는 hardware-in-the-loop (HIL) 테스트를 위해 시스템의 모델에 대해 테스트됩니다. 이러한 모든 테스트는 리얼타임에서 모델을 실행할 수 있는 시스템 및 하드웨어 입/출력을 필요로 합니다. LabVIEW Real-Time은 이 두 가지 기능을 모두 제공합니다.
개요
MATRIXx SystemBuild 모델은 MATRIXx AutoCode 및 LabWindows/CVI를 사용하여 DLL로 컴파일됩니다. 그 후 DLL은 LabVIEW Real-Time에서 실행됩니다. 아래에서는 SystemBuild 모델, 맞춤 템플릿 사용, AutoCode를 사용하여 C 코드 생성하는 일련의 과정을 설명합니다. 생성된 코드는 그 후 LabWindows/CVI를 사용하여 DLL로 컴파일됩니다. DLL은 그 후 라이브러리 함수 호출 노드를 통해 LabVIEW 또는 LabVIEW Real-Time으로부터 호출됩니다. 모델이 일단 LabVIEW에 통합되면 데이터 수집 또는 인스트루먼트 I/O 및 강력한 사용자 인터페이스가 추가됩니다.
- MATRIXx SystemBuild는 선형 및 비선형 시스템을 모델링할 수 있는 강력한 시뮬레이션 환경입니다. 대규모의 모델은 SuperBlocks의 여러 층을 형성함으로써 간편하게 관리됩니다. 모델은 또한 연속 및 이산 컴포넌트를 포함합니다.
- MATRIXx AutoCode는 SystemBuild 모델을 위한 리얼타임 C 또는 Ada 소스 코드를 생성합니다. 생성된 코드는 템플릿을 통해 여러 다른 타겟 및 어플리케이션 요구에 맞게 맞춤화될 수 있습니다.
- LabWindows/CVI는 신속한 C 코드 개발을 위한 코드 생성 툴 및 프로토타입 유틸리티가 있는 ANSI C 컴파일러입니다. LabWindows/CVI는 또한 LabVIEW Real-Time에서 사용하기 위한 컴팩트한 DLL을 생성합니다.
LabVIEW는 편리한 I/O 운영, 분석 및 프리젠테이션을 구현하는 그래픽 기반의 프로그래밍 환경입니다. LabVIEW Real-Time 모듈을 사용하면 LabVIEW 코드는 내쇼날인스트루먼트의 Real-Time 타겟에서 결정성있게 실행됩니다. LabVIEW는 FieldPoint 및 CompactFieldPoint 모듈 뿐 아니라 PXI 보드를 통해 광범위한 I/O와 긴밀한 통합을 제공합니다.
다음을 참조하십시오.
MATRIXx 제품 정보
LabWindows/CVI 제품 정보
LabVIEW 제품 정보
LabVIEW Real-Time 제품 정보
AutoCode에서 C 코드 생성
AutoCode는 모델을 위한 C 코드 생성에 사용됩니다. 맞춤 템플릿은 코드를 생성하는 데에 사용됩니다. MATRIXx는 DLL에 의해 반출되는 함수를 정의하는 헤더 파일, 모델 실행을 보유하는 c 파일, DLL을 구축하기 위한 CVI용 세팅을 포함하는 CVI 프로젝트 파일 (.prj)을 생성합니다.
첨부된 템플릿을 MATRIXx에 제공된 템플릿과 동일한 폴더에 다운로드하고 복사하십시오. (기본 위치는 C:\Program Files\National Instruments\MATRIXx\mx_63.2\case\ACC\templates) 템플릿은 MATRIXx에 포함된 템플릿에 따라 그 종류가 달라집니다. 템플릿이 다른 폴더에 위치해 있더라도 제공되는 템플릿은 동일 폴더에 복사되어야 합니다. 본 템플릿은 MATRIXx 6.3에서 사용되도록 제작되었습니다.
- 모델을 포함하고 있는 파일을 엽니다.
- Catalog Browser에서 최상위 SuperBlock을 선택합니다.
- Tools>AutoCode를 선택합니다.
- 대상 폴더와 파일명을 선택합니다.
- CodeStyle을 Subsystem으로, Language는 C를 유지합니다. (템플릿이 Procedure only 코드 또한 지원한다 하더라도, 본 튜토리얼에서는 Subsystems 스타일 코드에 초점을 맞추어 설명하겠습니다.)
- Advanced 버튼을 클릭하고 Templates 탭을 선택합니다.
- Browse 버튼을 클릭하고 c_cvidll.tpl 파일을 선택합니다.
- OK를 두 번 클릭합니다.
- Xmath 창에서 코드 생성이 성공적으로 이루어졌는지 확인하십시오.
MATRIXx는 이제 DLL 구축을 위해 필요한 소스 파일을 생성하였습니다.
CVI에서 코드 컴파일
DLL을 구축하기 위한 CVI에 필요한 모든 셋팅은 CVI 프로젝트 파일에 포함되어 있습니다.
- AutoCode에 의해 생성된 파일을 검색하십시오.
- CVI 프로젝트 파일 (.prj)을 더블 클릭합니다. 이 때 CVI 프로젝트 파일이 이미 CVI와 연결되어 있음을 확인하십시오. 만약 연결되어 있지 않다면, CVI를 시작하여 File>Open>Project을 선택한 후 프로젝트 파일을 선택하십시오.
- Build>Create Dynamic Link Library를 선택하여 DLL을 구축합니다.
참고: AutoCode 소스 파일에 대한 경로는 하드 코딩되어 있으며 사용자의 설치에 올바르지 않을 수 있습니다. 경로가 올바르지 않을 경우 다음의 요청을 받습니다.

Yes를 선택하고, AutoCode 소스 디렉토리 (기본 위치 C:\Program Files\National Instruments\MATRIXx\
mx_63.2\case\ACC\src)에 있는 파일을 검색합니다. 요청을 받으면, 선택한 디렉토리를 프로젝트에 추가합니다.
소스 파일로의 정확한 경로를 갖도록 템플릿을 변경할 수 있습니다. 텍스트 편집기에서 c_cvidll.tpl를 열어 gen_project 세그먼트 (@SEGMENT gen_project()@@)를 검색합니다. Include Path 1을 올바른 경로가 되도록 수정합니다.
[Include Paths]
Include Path 1 Is Rel = False
Include Path 1 = "/C/Program Files/National Instruments/matrixx/mx_63.2/case/ACC/src"
LabVIEW에서 DLL 호출하기
DLL이 생성되었으면 그 다음 단계는 LabVIEW에서 DLL을 호출하는 것입니다. 본 작업은 라이브러리 함수 호출 노드를 사용하여 진행 가능합니다. DLL에는 모델과 인터랙션하는 데 사용되는 두 가지 함수가 있습니다. 첫 번째 함수는 InitModel로 스케쥴러 및 서브 시스템을 초기화합니다. InitModel는 또한 스케쥴러 빈도 뿐 아니라 입력 및 출력의 갯수를 반환합니다. 일단 모델이 초기화되면 두 번째 함수(TakeTimeStep)가 While Loop에서 호출되어 모델은 스케쥴러의 한번의 스텝을 연산하게 됩니다. InitModel 및 TakeTimeStep은 모델에 의존하지 않는 고정된 함수 프로토타입을 사용합니다. Data_In 및 Data_Out 배열에 있는 요소의 숫자만이 모델의 입출력 숫자에 따라 변경됩니다.
우선, 모델을 실행하기 위해 첨부된 VI 템플릿을 사용하십시오.
블록 다이어그램은 아래와 같습니다.
다음의 변경은 모델이 실행되기 이전에 이루어져야 합니다.
- 라이브러리 호출 함수 노드를 마우스 오른쪽 클릭하여 설정을 선택합니다. 대화 상자에서 탐색을 클릭하여 DLL을 검색합니다.
- 두 번째 라이브러리 호출 함수 노드를 반복합니다.
LabVIEW는 프로그램 확장에 필요한 충분한 유연성을 제공합니다. 사용자 인터페이스에서 데이터를 가져오는 대신, 파일, 데이터 수집 카드, CAN 보드, 또는 다양한 다른 소스로부터 입력을 가져올 수 있습니다.
다음을 참조하십시오.
LabVIEW Real-Time에서 작동하는 MATRIXx 모델에 하드웨어 추가
실행에 관한 설명
DLL을 생성하는 데에 사용되는 템플릿은 MATRIXx에 포함된 기본 템플릿을 기반으로 합니다. 본 템플릿은 동일한 스케쥴러를 사용하며, 상태 전이 다이어그램을 갖고 있는 모델 뿐 아니라 멀티레이트 및 하이브리드 모델도 다룰 수 있습니다. 본 섹션에서는 소스파일을 DLL에 컴파일하기 위해 변경해야 할 사항을 설명합니다.
- 소스 코드를 헤더 파일 및 c 소스 파일로 분리합니다. LabWindows/CVI가 DLL을 구축하면, 헤더 파일에 프로토타입을 갖고 있는 함수를 반출합니다.
- 컴파일러 지시문 #pragma pack(1) 및 #define MSWIN32 1이 헤더 파일에 추가됩니다. #pragma pack(1)은 LabVIEW와 호환을 위해 필요한 1 바이트 세그먼트로 컴파일러의 구조를 정렬할 것을 요청합니다. #define MSWIN32는 OS를 Windows로 지정합니다.
- SCHEDULER_STATUS = External_Input(); 및 SCHEDULER_STATUS = External_Output (); 함수는 스케쥴러 함수에서 제거됩니다. DLL은 외부 I/O를 직접 수행하지 않으며, LabVIEW로부터 입력을 수신하고 출력을 반환합니다.
- main 함수는 제거되었으며 세 가지 새로운 함수가 추가되었습니다.
- void InitModel(RT_INTEGER *NI, RT_INTEGER *NO, RT_FLOAT *SCHED_FREQ)
InitModel은 main에 위치해 있었던 초기화를 실행합니다. 스케쥴러 및 어플리케이션 데이터를 초기화합니다. 또한 입력 개수 (NI) 및 출력 개수 (NO) 및 스케쥴러 빈도 (SCHED_FREQ)를 반환합니다.
- RT_INTEGER TakeTimeStep(RT_FLOAT *Data_IN, RT_FLOAT *Data_OUT, RT_FLOAT *Time)
TakeTimeStep은 한 스텝을 진행하기 위해 스케쥴러 함수를 호출합니다. 변형 전의 원래 실행에서 스케쥴러 함수는 sa_utils 파일에 있는 함수에 의해 호출되었습니다. 외부 입력은 TakeTimeStep에 Data_IN 입력으로 전달됩니다. 현재 시간을 계산하는 외부 출력은 Data_OUT 배열로 반환됩니다. 현재 시뮬레이션 시간은 Time으로 반환됩니다. 오류가 발생하면 TakeTimeStep은 0이 아닌 결과를 반환합니다. 오류 코드는 sa_defn.h에 정의됩니다.
- void Error()
오류는 Signal_An_Error 매크로에 의해 호출됩니다. 본 함수는 TakeTimeStep에 의해 반환되는 글로벌 변수 오류를 설정합니다.
- void InitModel(RT_INTEGER *NI, RT_INTEGER *NO, RT_FLOAT *SCHED_FREQ)
기본 AutoCode 스케쥴러에 대한 설명은 AutoCode 사용자 가이드를 참조하십시오.
또한 다음을 보십시오:
매뉴얼: MATRIXx AutoCode 사용자 가이드
유의점 및 제한 사항
본 과정에 대해 익히 알려져 있는 두 가지의 한계가 있습니다. TakeTimeStep에 대한 실행 시간은 해당 minor cycle 동안 실행 예정된 서브시스템에 따라 달라집니다. 외부 출력은 TakeTimeStep이 완료될 때까지 사용가능하지 않습니다.
- TakeTimeStep에는 멀티레이트 모델에서 변수 실행 시간이 있습니다.
스케쥴러는 타이밍 정보에 기반하여 서브시스템을 스케쥴합니다. 두 개의 이산 서브 시스템인 A와 B로 구성된 간단한 모델을 살펴보겠습니다. A는 매 0.25초마다 실행하고 B는 매 0.5초마다 실행합니다. 본 경우의 minor cycle은 0.25초입니다. 0초, 0.5초, 1초에서 양 시스템 A와 B는 스케쥴됩니다. 0.25초, 0.75초, 1.25초에서는 A 시스템만이 스케쥴되어 있습니다. 본 설명은 아래의 그림에 잘 나타나 있습니다.

그림 2: 두 개의 서브시스템 스케쥴링
- 0, 0.5, 1초에서 TakeTimeStep의 실행 시간은 서브 시스템 A와 B의 실행 시간의 합입니다. 매 0.25, 0.75, 1.25초에서 TakeTimeStep의 실행 시간은 서브시스템 A의 실행 시간입니다. 최대한의 리얼 타임 루프 속도는 가장 긴 실행 속도에 의해 제한됩니다. 즉, 0, 0.5, 및 1초입니다.
- 외부 출력은 한번의 minor cycle만큼 지연됩니다.
TakeTimeStep이 호출되면 현 시간 (ti)에 대한 외부 입력은 함수로 전달됩니다. TakeTimeStep은 그 후 현재 시간 (ti)에 대한 외부 출력을 결정한 후 모델을 연산합니다. 외부 출력은 TakeTimeStep이 완료되기 전에는 LabVIEW에서 사용할 수 없으며 따라서 출력에 지연이 발생하게 됩니다. 최대한의 결정성을 위해 출력 및 입력은 동일한 스캔/업데이트 클럭을 사용하여 하드웨어 타임됩니다. 이 같은 경우에 출력은 로드되지만 업데이트되지는 않습니다. 업데이트는 업데이트 클럭의 다음 상승 엣지에서 발생합니다. 다음 반복에서는 시작시에 발생하게 됩니다. 본 기술을 사용하면 한 주기 이후 (ti+1)에 출력이 업데이트됩니다. 한 번의 minor cycle의 지연이 발생하는 이유입니다.
기본 스케쥴러 및 minor cycles에 대한 설명은 MATRIXx 매뉴얼을 참조하십시오.
또한 다음을 보십시오:
매뉴얼: MATRIXx AutoCode 사용자 가이드
결론
상기 설명된 프로세스를 통해 SystemBuild 모델은 AutoCode 및 LabWindows/CVI를 사용하여 DLL로 구축됩니다. 그 후 DLL은 LabVIEW 또는 다른 프로그래밍 언어로부터 호출될 수 있습니다. LabVIEW는 다양한 I/O 옵션으로 편리한 액세스를 제공합니다. LabVIEW Real-Time을 사용하면 PXI 또는 FieldPoint Real-Time 타겟에서 프로그램을 임베드하면 결정성있는 리얼타임 실행을 구현할 수 있습니다.
법적 정보
"이 튜토리얼 (이 ""튜토리얼"")은 내쇼날인스트루먼트 (""NI"")가 개발한 것 입니다. 이 튜토리얼에 대한 내쇼날인스트루먼트의 기술 지원이 가능하더라도, 이 튜토리얼의 내용은 완전하게 테스트 및 검증되지 않을 수 있으며, NI는 어떠한 방식으로도 품질 또는 관련 제품 및 드라이버의 새로운 버전에 따른 컨텐츠의 지속적인 지원을 보장하지 않습니다. 이 튜토리얼은 어떠한 종류의 보증 및 NI.COM의 이용 약관에 명시된 특정한 제약 규정에 대한 전제 없이 있는 그대로 제공됩니다. (http://ni.com/legal/termsofuse/unitedstates/us/)

