이 페이지는 기계 번역을 사용하여 번역되었습니다. 영어 원문을 보려면 여기를 클릭하십시오.
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);