주요 콘텐츠

이 페이지는 기계 번역을 사용하여 번역되었습니다. 영어 원문을 보려면 여기를 클릭하십시오.

Stateflow 차트를 활용한 공기-연료 비율 제어 시스템

Simulink® 및 Stateflow®를 사용하여 설계된 공기-연료 비율 제어 시스템에 대한 코드를 생성합니다.

그림 1, 2, 3은 플랜트와 제어기를 포함하는 폐루프 시스템인 sldemo_fuelsys 모델의 관련 부분을 보여준다. 이 플랜트는 설계 주기의 초기 단계에서 시뮬레이션을 통해 제어기를 검증합니다. 이 예제에서는 관련 컨트롤러 서브시스템인 "fuel_rate_control"에 대한 코드를 생성합니다. 그림 1은 최상위 시뮬레이션 모델을 보여준다.

sldemo_fuelsys 모델을 열고 구성하십시오. 그런 다음 모델을 컴파일하여 신호 데이터형을 확인합니다.

model = 'sldemo_fuelsys';
open_system(model)
coder.example.configure(model,'ERT','float');
set_param(model,'ShowPortDataTypes','on');
set_param(model,'SampleTimeColors','on');
sldemo_fuelsys([],[],[],'compile');
sldemo_fuelsys([],[],[],'term');

그림 1: 플랜트 및 제어기의 최상위 모델

공기-연료 비율 제어 시스템은 Simulink와 Stateflow로 구성되어 있습니다. 제어 시스템은 코드 생성을 담당하는 모델의 일부입니다.

open_system('sldemo_fuelsys/fuel_rate_control');

그림 2: 공기-연료 비율 제어기 서브시스템

제어 로직은 다양한 작동 모드를 지정하는 Stateflow 차트입니다.

open_system('sldemo_fuelsys/fuel_rate_control/control_logic');

그림 3: 공기-연료 비율 제어기 로직

이 창들을 닫습니다.

close_system('sldemo_fuelsys/fuel_rate_control/airflow_calc');
close_system('sldemo_fuelsys/fuel_rate_control/fuel_calc');
close_system('sldemo_fuelsys/fuel_rate_control/control_logic');
hDemo.rt=sfroot;hDemo.m=hDemo.rt.find('-isa','Simulink.BlockDiagram');
hDemo.c=hDemo.m.find('-isa','Stateflow.Chart','-and','Name','control_logic');
hDemo.c.visible=false;
close_system('sldemo_fuelsys/fuel_rate_control');

Embedded Coder를 사용하여 모델 구성 및 빌드하기

모델에 대한 프로덕션용 ANSI® C/C++ 코드를 구성하고 빌드하려면, 모델 파라미터 시스템 타깃 파일ert.tlc (임베디드 실시간(ERT))로 설정하십시오. 시스템 타깃 파일 파라미터는 프로그래밍 방식으로 설정할 수 있습니다.

coder.example.configure('sldemo_fuelsys','ERT');

코드를 생성하고 검사하십시오. 이전다음 버튼을 사용하여 관련 코드 부분을 대화형으로 이동할 수 있습니다. 차트 컨텍스트 메뉴(Stateflow 블록을 마우스 오른쪽 버튼으로 클릭)에서 C/C++ 코드 > C/C++ 코드로 이동을 선택합니다. 프로그래밍적으로는 rtwtrace 유틸리티를 사용하십시오.

slbuild('sldemo_fuelsys/fuel_rate_control');
rtwtrace('sldemo_fuelsys/fuel_rate_control/control_logic')
### Searching for referenced models in model 'fuel_rate_control'.
### Total of 1 models to build.
### Starting build procedure for: fuel_rate_control
### Successful completion of build procedure for: fuel_rate_control

Build Summary

Top model targets:

Model              Build Reason                                         Status                        Build Duration
====================================================================================================================
fuel_rate_control  Information cache folder or artifacts were missing.  Code generated and compiled.  0h 0m 19.39s

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 20.153s

생성된 코드에서 공기-연료 비율 제어 로직을 확인하십시오.

coder.example.extractLines('fuel_rate_control_ert_rtw/fuel_rate_control.c',...
    '/* Function for Chart:','case IN_Warmup:',1,0);
/* Function for Chart: '<S1>/control_logic' */
static void Fueling_Mode(const int32_T *sfEvent)
{
  switch (rtDWork.bitsForTID0.is_Fueling_Mode) {
   case IN_Fuel_Disabled:
    rtDWork.fuel_mode = DISABLED;
    switch (rtDWork.bitsForTID0.is_Fuel_Disabled) {
     case IN_Overspeed:
      /* Inport: '<Root>/sensors' */
      if ((rtDWork.bitsForTID0.is_Speed == IN_normal) && (rtU.sensors.speed <
           603.0F)) {
        if (rtDWork.bitsForTID0.is_Fail != IN_Multi) {
          rtDWork.bitsForTID0.is_Fuel_Disabled = IN_NO_ACTIVE_CHILD;
          rtDWork.bitsForTID0.is_Fueling_Mode = IN_Running;

          /* The fuel is actively controlled while in this state. */
          switch (rtDWork.bitsForTID0.was_Running) {
           case IN_Low_Emissions:
            rtDWork.bitsForTID0.is_Running = IN_Low_Emissions;
            rtDWork.bitsForTID0.was_Running = IN_Low_Emissions;
            rtDWork.fuel_mode = LOW;
            switch (rtDWork.bitsForTID0.was_Low_Emissions) {
             case IN_Normal:
              rtDWork.bitsForTID0.is_Low_Emissions = IN_Normal;
              rtDWork.bitsForTID0.was_Low_Emissions = IN_Normal;

              /* All sensors are in correct operating modes, so effective closed-loop mixture control can be used. */
              break;

모델 및 코드 생성 리포트를 닫으십시오.

clear hDemo;
close_system('sldemo_fuelsys',0);