Main Content

메시지로 통신하는 온도 제어 시스템

이 예제에서는 제어기가 여러 전송자로부터 오는 여러 수신 메시지를 반복적으로 관리하고 메시지를 보내 다른 수신자에게 명령을 전달하는 분산 시스템 내에서 메시지 통신을 사용하는 방법을 보여줍니다. 이 예제에서는 개별 온도 조절 장치가 있는 두 개의 다른 방에서 온도를 관리하는 제어 시스템 모델을 사용합니다. 컴포넌트의 알고리즘 모델링은 기본적으로 Stateflow Model Bang-Bang Temperature Control System (Stateflow) 예제를 따르며 컴포넌트 간의 통신은 Simulink® 메시지와 SimEvents® 블록을 사용하여 모델링됩니다. 참조된 모델인 Controller와 Thermometer는 독립 실행형 코드를 생성할 것으로 예상되는 소프트웨어 컴포넌트로서 파란색으로 표시되며, 다른 컴포넌트는 환경을 모델링합니다.

모델 개요

모델에는 온도 조절 장치가 있는 N개의 똑같은 방이 포함되어 있습니다(다중 인스턴스 Model 블록으로 모델링됨). 여기서 N = 2는 최상위 모델 및 참조된 모델에 링크된 Simulink 데이터 사전 파일 slddMsg.sldd에 정의되어 있는 Simulink 파라미터입니다. 각 방은 개별적으로 설정점 온도를 설정할 수 있습니다. 방의 온도 조절 장치는 모든 온도 조절 장치에 대해 동일한 제어 알고리즘을 사용하는 제어기에 의해 원격으로 제어됩니다.

온도 조절 장치는 0.2초마다 온도 메시지를 제어기로 보내고 제어기는 1초마다 온도 조절 장치로 난방을 켜거나 끄는 명령 메시지를 보냅니다. Entity Output Switch (SimEvents) 블록은 메시지 버스 데이터 필드 deviceID에 따라 제어기의 메시지를 온도 조절 장치 중 하나로 라우팅합니다. (버스는 데이터 사전에 정의되어 있으며 모든 모델에서 공유됩니다.) Message Merge 블록은 다른 온도 조절 장치의 메시지를 제어기로 라우팅합니다.

모델은 처음에 데이터 사전 파일 slddMsg.sldd에 정의된 부동소수점 유형 필드가 있는 버스 유형을 사용하여 구성됩니다. 부동소수점에서 고정소수점으로 전환하려면 모델의 데이터 사전을 slddMsg.sldd에서 slddMsgFixpt.sldd로 변경하십시오. 모델링 탭에서 모델 설정 > 모델 속성 > 외부 데이터로 이동합니다.

모델은 N의 값을 변경하고, 해당 모델 블록의 더 많은 인스턴스를 추가하고, Entity Output Switch 및 Message Merge 블록의 포트 번호를 늘림으로써 쉽게 확장할 수 있습니다. Room 모델 내부의 각 Thermometer 모델에는 ID 인수가 있으며, 이는 Entity Output Switch의 출력 포트 인덱스와 일치하는 값으로 설정되어야 합니다.

제어기 모델 앞에 있는 Queue 블록(FIFO, 덮어쓰기 유형의 대기열)은 메시지를 버퍼링하며, 이를 통해 제어기의 메시지 미들웨어 내부의 대기열을 모델링합니다. 여기서, N의 용량은 전송 중에 메시지 손실이 없다고 가정할 때 대기열에서 가장 오래된 메시지를 각 전송자의 새 메시지로 덮어쓸 수 있을 만큼 충분합니다. 메시지 손실이 있는 최악의 시나리오에는 5*N의 용량이 필요합니다. 여기서 5는 제어기의 샘플 시간을 온도 조절 장치의 샘플 시간으로 나눈 값입니다. 또한 용량이 1인 각 온도 조절 장치 앞의 대기열이 자동으로 삽입되고 "1"이라는 배지 아이콘이 표시됩니다. 이는 의도적으로 Queue 블록을 배치하지 않으면 용량 1 대기열이 자동으로 삽입되기 때문입니다. Use a Queue Block to Manage Messages 항목을 참조하십시오.

메시지 및 이벤트의 시퀀스를 보려면 Simulink 툴스트립의 시뮬레이션 탭에 있는 결과 검토 섹션에서 시퀀스 뷰어를 클릭하십시오. Sequence Viewer 항목을 참조하십시오.

Controller 모델

Controller 모델에서 Inport 블록과 연결된 Update Temperature 서브시스템은 먼저 방에서 온도 정보가 포함된 모든 메시지를 수신합니다. 이 서브시스템은 이 정보를 온도 설정점과 현재 온도를 나타내는 두 개의 벡터에 저장합니다. 그런 다음, For Each Subsystem은 벡터를 읽고 신호를 처리하며 Simulink 함수 sendCtrlMsg를 통해 제어 메시지를 전송합니다.

Update Temperature 서브시스템은 종료 조건 포트가 Receive 블록의 상태 포트로부터 신호를 전달받는 do-while 서브시스템으로, (최상위 모델에 있는) 외부 대기열로부터 메시지를 더 이상 수신할 수 없을 때까지 실행됩니다. 메시지 데이터는 데이터 사전 파일에 정의된 DeviceMsg 버스 유형이며 temperaturedeviceID의 두 필드가 있습니다. 따라서, Receive 블록의 상태 포트에 인에이블 포트가 연결된 Enabled Subsystem으로 Receive 블록의 출력 신호가 전파되면 Bus Selector 블록은 신호를 deviceID, temperaturesetpoint 신호로 분해합니다. 그런 다음 setpointtemperature 신호는 deviceID와 관련된 각 벡터 요소에 할당됩니다. 마지막으로, Unit Delay 블록에 의해 유지되는 벡터는 Enabled Subsystem 및 Update Temperature 서브시스템에 의해 For Each Subsystem에 신호로 출력됩니다.

For Each Subsystem은 위에 표시된 것과 같은 블록 설정으로 N번 반복하도록 설정되며, 두 입력 포트가 모두 분할됩니다. Stateflow 차트는 Model Bang-Bang Temperature Control System (Stateflow)에서 설명한 것과 유사한 Bang-Bang Controller를 모델링합니다. 이 제어기의 출력 포트는 난방을 켤지 여부를 나타내는 부울 신호를 출력합니다. 이 신호는 반복 횟수(0부터 시작)로부터 얻는 deviceID(1부터 시작)와 함께 Bus Creator 블록에서 비가상 신호로 압축됩니다. 압축된 신호는 모델에서 바깥으로 메시지를 보내기 위해 Simulink 함수 SendCtrlMsg(For Each Subsystem 외부에 배치)를 호출하는 Function Caller 블록에 제공됩니다.

Room 모델

Room 모델에서 Thermostat 서브시스템은 환경과 상호 작용합니다. Thermostat에는 제어 메시지와 설정점 온도 신호라는 두 개의 입력과, 제어기에 대한 난방 속도 메시지 및 온도 메시지라는 두 개의 출력이 있습니다. Gain 블록 및 Integrator 블록은 난방 속도 및 방 크기와 관련된 실내 난방 또는 냉방의 물리학을 시뮬레이션합니다.

Thermostat 서브시스템은 Thermometer Sensor 서브시스템, Thermometer Software 모델 블록 및 Temperature Actuator 서브시스템으로 구성됩니다. Thermometer Software 모델 블록은 제어기에서 오는 제어 메시지를 주기적으로 수신해 압축을 푼 다음, 난방 속도를 결정하는 Temperature Actuator 서브시스템에 대한 부울 명령(on/off)으로 바꿉니다. Thermometer Software는 또한 아날로그 온도를 감지하여 디지털 신호로 변환한 다음 메시지를 제어기로 다시 보내는 Thermometer Sensor 서브시스템으로부터 온도 신호를 입력받습니다.

Thermometer 모델

Thermometer 모델에서 Receive 블록은 각 시간 스텝에서 외부 대기열로부터 제어 메시지를 수신하기 위해 Inport 블록과 연결됩니다. 메시지 데이터는 출력인 명령 신호와 모델의 ID 인수와 일치해야 하는 deviceID 신호로 분해됩니다. ID 인수는 최상위 모델의 Model 블록에서 설정해야 합니다. Receive 블록의 초기값은 deviceID 필드가 모델 인수 ID와 같고 command 필드가 false 값을 갖는 MATLAB® 구조체로 설정됩니다. 한편, 디지털 온도, 설정점 및 deviceID의 신호는 비가상 버스 신호로 압축되어 Outport 블록에 메시지로 전송됩니다.

코드 생성

코드 생성 및 배포를 위해 참조된 모델 Controller 및 Thermometer(파란색으로 표시됨)는 독립 실행형 임베디드 타깃 C++ 코드를 생성할 수 있으며 메시지 미들웨어가 있는 임베디드 장치에 별도로 배포할 수 있습니다. 자세한 내용은 Generate C++ Messages to Communicate Data Between Simulink and an Operating System or Middleware (Embedded Coder)Model Message-Based Communication Integrated with POSIX Message Queues (Embedded Coder) 항목을 참조하십시오.

메시지 루트 수준 Inport/Outport는 C 코드 생성 및 코드 사용자 지정을 지원하지 않습니다. C 코드를 생성하고 메시지를 보내기 위해 메시지 미들웨어 API를 호출해야 하는 경우 Simulink 함수 sendCtrlMsg를 최상위 모델로 이동하고 참조된 모델이 외부 함수의 사용자 지정 가능한 호출 사이트를 생성하도록 이름을 올바르게 사용자 지정하는 것을 고려하십시오. 마찬가지로, 수신 측의 경우 최상위 모델에서 Receive 블록을 포함하는 Simulink 함수를 사용하고 참조된 모델에서 Function Caller 블록을 사용하여 Receive 블록을 대체하는 것을 고려하십시오.

참고 항목

| | | | |