このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
アルゴリズム コードとデータからの Rate Transition ブロック コードとデータの分離
コード ジェネレーターが Rate Transition ブロック用に生成するコードとデータをモデル コードでインライン化するか、コードとデータをモデル コードが呼び出す個別の関数に配置するかを指定できます。これは、[Rate Transition ブロック コード] パラメーターを選択して制御します。Rate Transition ブロック コードとデータをアルゴリズム コードとデータに分離すると、Rate Transition ブロックおよびアルゴリズム コードをそれぞれ個別に解析、最適化、テストできます。既定では、Rate Transition ブロック コードがアルゴリズム コードおよびデータとともにインラインで設定されます。コードとデータを分離して、関数 model
_step
が呼び出す個別の関数 get
と関数 set
、および状態データ専用の構造体を生成コードに含めることができます。生成コードには、関数 model
_initialize
が呼び出す個別の関数 start
と関数 initialize
も含まれます。
モデル例
モデル例 MultirateMultitaskingRateTransitions
を開きます。このマルチレートでマルチタスクのモデルには、異なるモードで動作する複数の Rate Transition ブロックが含まれます。
model = 'MultirateMultitaskingRateTransitions'; open_system(model); set_param(model,'SystemTargetFile','ert.tlc'); set_param(model,'GenerateComments', 'Off');
Rate Transition ブロックの個別コード
[コンフィギュレーション パラメーター] ダイアログ ボックスで、[Rate Transition ブロック コード] パラメーターを Function
に設定します。モデルのコードを生成します。コードはファイル MultirateMultitaskingRateTransitions.c
とファイル MultirateMultitaskingRateTransitions.h
にあります。
slbuild(model);
### Starting build procedure for: MultirateMultitaskingRateTransitions ### Successful completion of build procedure for: MultirateMultitaskingRateTransitions Build Summary Top model targets: Model Build Reason Status Build Duration ======================================================================================================================================= MultirateMultitaskingRateTransitions Information cache folder or artifacts were missing. Code generated and compiled. 0h 0m 13.636s 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 14.567s
currentDir = pwd; hfile=fullfile(currentDir, 'MultirateMultitaskingRateTransitions_ert_rtw','MultirateMultitaskingRateTransitions.h'); coder.example.extractLines(hfile,'typedef struct {','} DW;', 1, 1);
typedef struct { real_T OutportBufferForOut3[20]; real_T Integrator1_DSTATE[20]; real_T Integrator2_DSTATE[20]; real_T Integrator3_DSTATE[20]; real_T Integrator1_PREV_U[20]; real_T Integrator2_PREV_U[20]; real_T Integrator3_PREV_U[20]; uint32_T Algorithm_PREV_T; struct { uint_T Algorithm_RESET_ELAPS_T:1; } bitsForTID1; uint8_T Integrator1_SYSTEM_ENABLE; uint8_T Integrator2_SYSTEM_ENABLE; uint8_T Integrator3_SYSTEM_ENABLE; } DW;
Rate Transition ブロックの場合、状態データはグローバル状態構造体 DW_MultirateMultitaskingRateTransitions_T.
にはありません。このデータはファイル MultirateMultitaskingRateTransitions_rtb.h
内の独自の構造体にあります。
このコードはファイル MultirateMultitaskingRateTransitions.c
にあります。
cfile=fullfile(currentDir, 'MultirateMultitaskingRateTransitions_ert_rtw','MultirateMultitaskingRateTransitions.c'); coder.example.extractLines(cfile,'void MultirateMultitaskingRateTransitions_step0',...) 'void MultirateMultitaskingRateTransitions_terminate(void)',1,0);
void MultirateMultitaskingRateTransitions_step0(void) { (rtM->Timing.RateInteraction.TID0_1)++; if ((rtM->Timing.RateInteraction.TID0_1) > 1) { rtM->Timing.RateInteraction.TID0_1 = 0; } MultirateMul_DetAndIntegS2F_get(rtY.Out1); MultirateMulti_IntegOnlyS2F_get(rtY.Out2); memcpy(&rtY.Out3[0], &rtDW.OutportBufferForOut3[0], 20U * sizeof(real_T)); MultirateMul_DetAndIntegF2S_set(rtU.In1); MultirateMulti_IntegOnlyF2S_set(rtU.In2); } void MultirateMultitaskingRateTransitions_step1(void) { real_T rtb_DetAndIntegF2S[20]; real_T rtb_IntegOnlyF2S[20]; real_T Integrator3_DSTATE; real_T tmp; int32_T i; uint32_T Algorithm_ELAPS_T; MultirateMul_DetAndIntegF2S_get(rtb_DetAndIntegF2S); MultirateMulti_IntegOnlyF2S_get(rtb_IntegOnlyF2S); if (rtDW.bitsForTID1.Algorithm_RESET_ELAPS_T) { Algorithm_ELAPS_T = 0U; } else { Algorithm_ELAPS_T = rtM->Timing.clockTick1 - rtDW.Algorithm_PREV_T; } rtDW.Algorithm_PREV_T = rtM->Timing.clockTick1; rtDW.bitsForTID1.Algorithm_RESET_ELAPS_T = false; tmp = 0.001 * (real_T)Algorithm_ELAPS_T; for (i = 0; i < 20; i++) { if (rtDW.Integrator1_SYSTEM_ENABLE == 0) { rtDW.Integrator1_DSTATE[i] += tmp * rtDW.Integrator1_PREV_U[i]; } if (rtDW.Integrator2_SYSTEM_ENABLE == 0) { rtDW.Integrator2_DSTATE[i] += tmp * rtDW.Integrator2_PREV_U[i]; } Integrator3_DSTATE = rtDW.Integrator3_DSTATE[i]; if (rtDW.Integrator3_SYSTEM_ENABLE == 0) { Integrator3_DSTATE += tmp * rtDW.Integrator3_PREV_U[i]; } rtDW.Integrator3_DSTATE[i] = Integrator3_DSTATE; rtDW.OutportBufferForOut3[i] = Integrator3_DSTATE; rtDW.Integrator1_PREV_U[i] = rtb_DetAndIntegF2S[i]; rtDW.Integrator2_PREV_U[i] = rtb_IntegOnlyF2S[i]; rtDW.Integrator3_PREV_U[i] = rtU.In3[i]; } rtDW.Integrator1_SYSTEM_ENABLE = 0U; rtDW.Integrator2_SYSTEM_ENABLE = 0U; rtDW.Integrator3_SYSTEM_ENABLE = 0U; MultirateMul_DetAndIntegS2F_set(rtDW.Integrator1_DSTATE); MultirateMulti_IntegOnlyS2F_set(rtDW.Integrator2_DSTATE); rtM->Timing.clockTick1++; } void MultirateMultitaskingRateTransitions_initialize(void) { rtDW.bitsForTID1.Algorithm_RESET_ELAPS_T = true; rtDW.Integrator1_SYSTEM_ENABLE = 1U; rtDW.Integrator2_SYSTEM_ENABLE = 1U; rtDW.Integrator3_SYSTEM_ENABLE = 1U; }
関数 MultirateMultitaskingRateTransitions_step0
と関数 MultirateMultitaskingRateTransitions_step1
には関数 get
と関数 set
への呼び出しが含まれます。これらの関数には Rate Transition ブロック コードが含まれます。これらの関数定義はファイル MultirateMultitaskingRateTransitions_rtb.c
にあります。
Rate Transition ブロックのインライン化コードの生成
[コンフィギュレーション パラメーター] ダイアログ ボックスで、[Rate Transition ブロック コード] パラメーターを Inline
に設定します。モデルのコードを生成します。コードはファイル MultirateMultitaskingRateTransitions.c
とファイル MultirateMultitaskingRateTransitions.h
にあります。
set_param(model,'RateTransitionBlockCode','Inline'); slbuild(model)
### Starting build procedure for: MultirateMultitaskingRateTransitions ### Successful completion of build procedure for: MultirateMultitaskingRateTransitions Build Summary Top model targets: Model Build Reason Status Build Duration =================================================================================================================== MultirateMultitaskingRateTransitions Generated code was out of date. Code generated and compiled. 0h 0m 11.116s 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 11.927s
このコードは現在、ファイル MultirateMultitaskingRateTransitions.h
にあります。
hfile=fullfile(currentDir, 'MultirateMultitaskingRateTransitions_ert_rtw','MultirateMultitaskingRateTransitions.h'); coder.example.extractLines(hfile, 'typedef struct {', '} DW;', 1, 1);
typedef struct { real_T Integrator1_DSTATE[20]; real_T Integrator2_DSTATE[20]; real_T Integrator3_DSTATE[20]; real_T DetAndIntegS2F_Buffer0[20]; volatile real_T IntegOnlyS2F_Buffer[40]; real_T DetAndIntegF2S_Buffer[20]; volatile real_T IntegOnlyF2S_Buffer0[20]; real_T Integrator1_PREV_U[20]; real_T Integrator2_PREV_U[20]; real_T Integrator3_PREV_U[20]; uint32_T Algorithm_PREV_T; struct { uint_T Algorithm_RESET_ELAPS_T:1; } bitsForTID1; volatile int8_T IntegOnlyS2F_ActiveBufIdx; volatile int8_T IntegOnlyF2S_semaphoreTaken; uint8_T Integrator1_SYSTEM_ENABLE; uint8_T Integrator2_SYSTEM_ENABLE; uint8_T Integrator3_SYSTEM_ENABLE; } DW;
Rate Transition ブロックの場合、状態データはグローバル状態構造体 DW_MultirateMultitaskingRateTransitions_T
にはありません。このデータはファイル MultirateMultitaskingRateTransitions_rtb.h
内の独自の構造体にあります。
このコードは現在、ファイル MultirateMultitaskingRateTransitions.c
にあります。
cfile=fullfile(currentDir, 'MultirateMultitaskingRateTransitions_ert_rtw','MultirateMultitaskingRateTransitions.c'); coder.example.extractLines(cfile,'void MultirateMultitaskingRateTransitions_step0','void MultirateMultitaskingRateTransitions_terminate(void)', 1, 0);
void MultirateMultitaskingRateTransitions_step0(void) { int32_T i; int32_T i_0; boolean_T tmp; (rtM->Timing.RateInteraction.TID0_1)++; if ((rtM->Timing.RateInteraction.TID0_1) > 1) { rtM->Timing.RateInteraction.TID0_1 = 0; } tmp = (rtM->Timing.RateInteraction.TID0_1 == 1); if (tmp) { memcpy(&rtY.Out1[0], &rtDW.DetAndIntegS2F_Buffer0[0], 20U * sizeof(real_T)); } i = rtDW.IntegOnlyS2F_ActiveBufIdx * 20; for (i_0 = 0; i_0 < 20; i_0++) { rtY.Out2[i_0] = rtDW.IntegOnlyS2F_Buffer[i_0 + i]; } if (tmp) { memcpy(&rtDW.DetAndIntegF2S_Buffer[0], &rtU.In1[0], 20U * sizeof(real_T)); } if (rtDW.IntegOnlyF2S_semaphoreTaken == 0) { for (i = 0; i < 20; i++) { rtDW.IntegOnlyF2S_Buffer0[i] = rtU.In2[i]; } } } void MultirateMultitaskingRateTransitions_step1(void) { real_T rtb_IntegOnlyF2S[20]; real_T Integrator1_DSTATE; real_T Out3; real_T tmp; int32_T i; uint32_T Algorithm_ELAPS_T; rtDW.IntegOnlyF2S_semaphoreTaken = 1; for (i = 0; i < 20; i++) { rtb_IntegOnlyF2S[i] = rtDW.IntegOnlyF2S_Buffer0[i]; } rtDW.IntegOnlyF2S_semaphoreTaken = 0; if (rtDW.bitsForTID1.Algorithm_RESET_ELAPS_T) { Algorithm_ELAPS_T = 0U; } else { Algorithm_ELAPS_T = rtM->Timing.clockTick1 - rtDW.Algorithm_PREV_T; } rtDW.Algorithm_PREV_T = rtM->Timing.clockTick1; rtDW.bitsForTID1.Algorithm_RESET_ELAPS_T = false; tmp = 0.001 * (real_T)Algorithm_ELAPS_T; for (i = 0; i < 20; i++) { Integrator1_DSTATE = rtDW.Integrator1_DSTATE[i]; if (rtDW.Integrator1_SYSTEM_ENABLE == 0) { Integrator1_DSTATE += tmp * rtDW.Integrator1_PREV_U[i]; } rtDW.Integrator1_DSTATE[i] = Integrator1_DSTATE; if (rtDW.Integrator2_SYSTEM_ENABLE == 0) { rtDW.Integrator2_DSTATE[i] += tmp * rtDW.Integrator2_PREV_U[i]; } if (rtDW.Integrator3_SYSTEM_ENABLE != 0) { Out3 = rtDW.Integrator3_DSTATE[i]; } else { Out3 = tmp * rtDW.Integrator3_PREV_U[i] + rtDW.Integrator3_DSTATE[i]; } rtY.Out3[i] = Out3; rtDW.Integrator1_PREV_U[i] = rtDW.DetAndIntegF2S_Buffer[i]; rtDW.Integrator2_PREV_U[i] = rtb_IntegOnlyF2S[i]; rtDW.Integrator3_DSTATE[i] = Out3; rtDW.Integrator3_PREV_U[i] = rtU.In3[i]; rtDW.DetAndIntegS2F_Buffer0[i] = Integrator1_DSTATE; } rtDW.Integrator1_SYSTEM_ENABLE = 0U; rtDW.Integrator2_SYSTEM_ENABLE = 0U; rtDW.Integrator3_SYSTEM_ENABLE = 0U; for (i = 0; i < 20; i++) { rtDW.IntegOnlyS2F_Buffer[i + (rtDW.IntegOnlyS2F_ActiveBufIdx == 0) * 20] = rtDW.Integrator2_DSTATE[i]; } rtDW.IntegOnlyS2F_ActiveBufIdx = (int8_T)(rtDW.IntegOnlyS2F_ActiveBufIdx == 0); rtM->Timing.clockTick1++; } void MultirateMultitaskingRateTransitions_initialize(void) { rtDW.bitsForTID1.Algorithm_RESET_ELAPS_T = true; rtDW.Integrator1_SYSTEM_ENABLE = 1U; rtDW.Integrator2_SYSTEM_ENABLE = 1U; rtDW.Integrator3_SYSTEM_ENABLE = 1U; }
コードは関数 MultirateMultitaskingRateTransitions_step0
と関数 MultirateMultitaskingRateTransitions_step1
にインライン化されます。
モデルを閉じる
bdclose(model);
制限
コード ジェネレーターは、可変サイズの信号をもつか、For Each Subsystem ブロック内にある Rate Transition ブロックのコードとデータを分離しません。