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)