cgsl_0410: コンポーネント展開用のタイマー サービス
ID: タイトル | cgsl_0410: コンポーネント展開用のタイマー サービス | ||
---|---|---|---|
説明 | タイマー サービス コード インターフェイスをモデル化するには、コンポーネントのルート レベルで次のようにします。 | ||
A | 次のモデル コンフィギュレーション パラメーターを設定します。
| ||
B | データに同時アクセス用のセーフガードを適用するには、[During Execution] または [Outside Execution] のデータ通信方法を使用するように構成されたサービス インターフェイスにマッピングします。
| ||
メモ | クロック分解能が指定されていない場合、コード ジェネレーターはクロック分解能について次の既定値を使用します。
S-Function を使用してタイマーを設定する場合、 | ||
根拠 | 関数の同時実行によるデータ アクセスのロバストな処理。 | ||
モデル アドバイザー チェック | このガイドラインについてのモデル アドバイザー チェックは提供されていません。 | ||
例 | 次の例では、ヘッダー ファイルの生成コードを示します。 #Header File ComponentDeploymentFcn.h #include "services.h" . . . typedef struct { real_T DataTransfer_WriteBuf[10]; real_T DiscreteTimeIntegrator_PREV_U[10]; uint32_T Interator_PREV_T; uint8_T DiscreteTimeIntegrator_SYSTEM_E; boolean_T Integrator_RESET_ELAPS_T; } D_Work; typedef struct { real_T delay[10]; real_T dti[10]; } CD_measured_T; . . . extern void CD_integrator(void); 次のソース コード例では、データ通信方法を [Outside Execution] に設定します。 CD_measured_T CD_measured; . . . void CD_integrator(void) { real_T tmp; real_T *tmp_0; int32_T i; uint32_T Integrator_ELAPS_T; tmp_0 = set_CD_integrator_DataTransfer(); if (rtDwork.Integrator_RESET_ELAPS_T) { Integrator_ELAPS_T = 0U; } else { Integrator_ELAPS_T = (uint32_T)(get_tick_outside_CD_integrator() - rtDWork.Integrator_PREV_T); } rtDWork.Integrator_PREV_T = get_tick_outside_CD_integrator(); rtDwork.Integrator_RESET_ELAPS_T = false; tmp = 1.25 * (real_T)Integrator_ELAPS_T; for (i = 0; i < 10; i++) { if ((int32_T)rtDWork.DiscreteTimeIntegrator_SYSTEM_E == 0) { CD_measured.dti[i] += tmp * rtDWork.DiscreteTimeIntegrator_PREV_U[i]; } rtDWork.DiscreteTimeIntegrator_PREV_U[i] = (get_CD_ integrator_InBus_u())[i]; } rtDWork.DiscreteTimeIntegrator_SYSTEM_E = 0U; memcpy(&tmp_0[0], &CD_measured.dti[0], (uint32_T)(10U * sizeof(real_T))); } 次のソース コード例では、データ通信方法を [During Execution] に設定します。 void CD_integrator(void) { real_T tmp[10]; real_T tmp_0; int32_T i; uint32_T Integrator_ELAPS_T; rtM->Timing.clockTick2 = get_tick_during_CD_integrator(); if (rtDWork.Interator_RESET_ELAPS_T) { Integrator_ELAPS_T = 0U; } else { Integrator_ELAPS_T = (uint32_T)(rtM->Timing.clockTick2 - rtDWork.Integrator_PREV_T); } get_CD_integrator_input_(&tmp[0]); rtDWork.Integrator_PREV_T = rtM->Timing.clockTick2; rtDWork.Integrator_RESET_ELAPS_T = false; tmp_0 = 1.25 * (real_T)Integrator_ELAPS_T; for (i = 0; i < 10; i++) { if ((int32_T)rtDWork.DiscreteTimeIntegrator_SYSTEM_E == 0) { CD_measured.dti[i] += tmp_0 * rtDWork.DiscreteTimeIntegrator_PREV_U[i]; } rtDWork.discreteTimeIntegrator_PREV_U[i] = tmp[i]; } rtDWork.DiscreteTimeIntegrator_SYSTEM_E = 0U; set_CD_integrator_DataTransfer(CD_measured.dti); } |
参考
Code Interfaces and Code Interface Specification (Embedded Coder)
Create a Service Interface Configuration (Embedded Coder)
Data Communication Methods (Embedded Coder)
Embedded Coder ディクショナリ (Embedded Coder)
Generate C Timer Service Interface Code for Component Deployment (Embedded Coder)