Main Content

cgsl_0410: コンポーネント展開用のタイマー サービス

ID: タイトルcgsl_0410: コンポーネント展開用のタイマー サービス
説明

タイマー サービス コード インターフェイスをモデル化するには、コンポーネントのルート レベルで次のようにします。

A

次のモデル コンフィギュレーション パラメーターを設定します。

  • [システム ターゲット ファイル][ert.tlc] に設定する

  • ソルバー パラメーター [タイプ] を [固定ステップ] に設定する

  • ソルバー パラメーター [クロック分解能]double 型のスカラー値に設定する

B

データに同時アクセス用のセーフガードを適用するには、[During Execution] または [Outside Execution] のデータ通信方法を使用するように構成されたサービス インターフェイスにマッピングします。

  • During Execution — アルゴリズムを実装する、生成される呼び出し可能な関数によって、データに同時アクセス用のセーフガードが適用されます。

  • Outside Execution — ターゲット プラットフォーム サービスによって、データに同時アクセス用のセーフガードが適用されます。

メモ

クロック分解能が指定されていない場合、コード ジェネレーターはクロック分解能について次の既定値を使用します。

  • 非周期関数の場合は、モデルの固定ステップ サイズ (基本サンプル時間)

  • 周期関数の場合は、関数のサンプル時間

S-Function を使用してタイマーを設定する場合、SS_OPTION_ASYNCHRONOUS オプションとクロック分解能を指定する S-Function によって駆動される非周期関数については、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);
}

バージョン履歴

すべて展開する

R2023a で導入