C プログラマーのための Simulink 活用講座 ~Simulink を使った開発に迷うエンジニアへ ~ MathWorks Japan アプリケーションエンジニアリング部アプリケーションエンジニア渡辺修治 2012 The MathWorks, Inc. 1
ショータくんは 何に悩んでいるの? 制御ロジックを理解したいけど データーフローが見にくい コードの全体像が把握できない ショータくん 制御ロジックを検証したいけど バグの発見に時間がかかる テストデータ漏れが見つかり うんざり 他にも悩みはあると思いますが 時々 2
と Simulink の書きっぷりを比較 /* Calc PID Controller */ FilterCoefficient = (DerivativeGain_Gain * Inport - Filter_DSTATE) * FilterCoefficient_Gain; PidOut = (ProportionalGain_Gain * Inport + Integrator_DSTATE) + FilterCoefficient; Simulink Simulink ではこれだけ /* Saturate */ if (PidOut >= Saturation_UpperSat) { Outport = Saturation_UpperSat; } else if (PidOut <= Saturation_LowerSat) { Outport = Saturation_LowerSat; } else { Outport = PidOut; } /*Update for DiscreteIntegrator */ Integrator_DSTATE += IntegralGain_Gain * Inport * Integrator_gainval; Filter_DSTATE += Filter_gainval * FilterCoefficient; 3
オーバーフローの検証方法を比較 /* Calc PID Controller */ FilterCoefficient = (DerivativeGain_Gain * Inport - Filter_DSTATE) * FilterCoefficient_Gain; ブレイクポイント PidOut = (ProportionalGain_Gain * Inport + Integrator_DSTATE) + FilterCoefficient; ステップ実行 Simulink Simulink ではクリックするだけ 名前 値 Filter_DSTATE 2.3571113171923290 Inport 1.2500000000000000 DerivativeGain_Gain 9.0000000000000000 FilterCoefficient_Gain 1.0000000000000000 FilterCoefficient 8.8928886828076710 全ての信号範囲からオーバーフローを検出 デバッグモニタ 検証製品 :Simulink Design Verifier を使用 4
ご提案として 手軽にお試しできる方法を提案 制御ロジックの理解 誰でも書きやすく 読みやすい Simulink による設計手法 制御ロジックの検証 Simulink モデルの検証 ムズカシイことぬき! Simulink による開発手法を提案 5
初めての挑戦として モデルベースデザイン 入力デバイス 入力ドライバ OS/ スケジューラ 出力ドライバ 出力デバイス モデリング 検証 生成 プロセッサ / 周辺ハード 生成 6
モデルベースデザインのねらいとは? 工数 モデルベースデザインでやるべきこと 実機検証 工数 制御器の設計制御器の検証制御対象の設計仮想と実機の橋渡し 設計 設計 + 検証 実機検証 従来開発 ( 実機試験中心 ) 不具合修正コストが高い 設計抜け漏れが起こり易い 工程 モデルベースデザイン 工程 不具合修正コストが低い 設計抜け漏れを早期に発見 修正 8
モデルベースデザインでやるべきこと 制御器の設計 ロジック設計 古典現代制御設計 ロバスト制御設計 信号解析 パラメータチューニング 制御器の検証 シミュレーションチェック 形式検証 設計エラー検出 テストデータ生成 トレーサビリティ カバレッジ測定 開発基盤となる Simulink モデルが必要 制御対象の設計 物理モデル システム同定 統計モデリング パラメータ推定 ( 物理法則 / データドリブン ) 仮想と実機の橋渡し 自動 生成 固定小数点設計 9
このプレゼンテーションの最後には Simulink を使った開発に挑戦してみるか! と思っていただければ幸いです 10
プレゼンテーションの流れ 1 Cコードから関数を取り出す 2 関数をベースにSimulinkモデリング 3 Simulinkモデルの検証 4 SimulinkモデルからCコード生成 5 生成 Cコードの利用方法 11
1 から関数を取り出す 入力デバイス 入力ドライバ 出力ドライバ 出力デバイス OS/ スケジューラ プロセッサ / 周辺ハード 12
抜き出しやすい関数を見つけよう /****************************************************************************/ /* Function Name : task_4msec.c */ /* Summary : This task executes features at 4 msec rate */ /* Author : Name */ /****************************************************************************/ void Task_4ms( void ) { /*-------- 処理記述 ---------*/ diagnostics_main() /* Diagnostics Main */ accel_pedal_position_main(); /* Accelerator Main */ accel_brake_management(); /* Accelerator And Brake Management */ driver_input_mode(); /* Driver Input Mode */ driver_demand_main(); /* Driver Demand Main */ cruise_control_main(); /* Cruise Control Main */ driver_vs_cruise_demand(); /* Arbitration Of Driver & Cruise */ : : 4ms タスク関数にある 1 つの関数 ( クルーズコントロール ) を Simulink 化していきたいと思います! 13
2 関数をベースに Simulink モデリング 入力デバイス 入力ドライバ 出力ドライバ 出力デバイス モデリング 検証 生成 OS/ スケジューラ プロセッサ / 周辺ハード 14
の関数を Simulink モデルへ >> をモデルに自動変換するツールはありますか? ans = 残念ながら自動変換ツールはございません ロジックをリファクタリングするきっかけになるかも SL:Simulink 15
vs. Simulink モデル 制御文のモデル化 if (num >= 1 && num < 2) { out = 10; } else 比較ブロック { out = 20; } 論理ブロック Simulink スイッチブロック switch(num) { case 1 : out = 10; break; case 2 : out = 20; break; default : out = 0; break; } マルチポートスイッチブロック SL:Simulink 16
vs. Simulink モデルと Stateflow 制御文のモデル化 for (num = 0; num < 10; num++) { Process; } Simulink/Stateflow フローチャート パターンを追加判定 (if-else if-else-if など ) ループ (for while dowhitle) switch(2 ケース 3 ケースなど ) カスタム ( ユーザー任意 ) SL:Simulink SF:Stateflow 17
vs. Simulink モデル 演算子のモデル化 四則演算子 Simulink 比較演算子 論理演算子 キャスト その他 積分ブロック 信号範囲制限 前回値参照 SL:Simulink 19
vs. Simulink モデル 関数のモデル化関数 :Subsystemブロック引数 :Inport Outportブロック Subsystem ブロック Inport ブロック SL:Simulink Outport ブロック 20
Simulink モデルの書き方 モデリングガイドラインの活用 http://www.mathworks.co.jp/jp/help/simulink/index.html Web:Documentation Center 23
Simulink モデリングのまとめ 壁を感じることなく Simulink のモデリングが可能 Simulink モデルのアドバンテージ データフローの可視化で 設計の効率化 高なブロックで アルゴリズムをスマートに表現 すぐにシミュレーション 作って & 試す をシームレス化 キーメッセージ Simulink は 書きやすく 読みやすいパワフルなグラフィカル開発ツール SL:Simulink 24
3 Simulink モデルの検証 入力デバイス 入力ドライバ 出力ドライバ 出力デバイス モデリング 検証 生成 OS/ スケジューラ プロセッサ / 周辺ハード 25
手戻りが少ないバグの発見とは? 本公演では B について紹介します A B バグを発見する行為 期待動作と異なる動きをしたときに バグの存在を疑う いくつもの原因調査を行い バグの存在が明らかになる バグを未然防止する行為 動作を行う前に 設計の誤りを見つけバグの存在が明らかになる ところで でも未然防止をやってみませんか? 26
3 Simulink モデルの検証番外編としてCコード検証 入力デバイス 入力ドライバ 出力ドライバ 出力デバイス モデリング 検証 生成 OS/ スケジューラ プロセッサ / 周辺ハード 既存の を検証しよう! 27
Polyspace による静的コード検証 C/C++ コードの実行時 ( ランタイム ) エラーを未然に防ぐ ゼロ割 オーバーフロー アンダーフロー デッドコード 不正なポインタ参照 配列の範囲外アクセス 不正な型変換に起因するエラー 未初期化変数の参照 無限ループ キーメッセージ Polyspace は エラー検出と共に 実行時エラーは起こらない も証明します 実行時エラーは起こらない 実行時エラー発生 デッドコード 実行時エラーの可能性あり PS:Polyspace 28
3 Simulink モデルの検証 入力デバイス 入力ドライバ 済 済 済 出力ドライバ 出力デバイス モデリング 検証 生成 OS/ スケジューラ プロセッサ / 周辺ハード モデルを検証しよう! 29
Simulink モデルの検証 モデルにあるバグを未然に防ぐ テストデータの抜け漏れを未然に防ぐ テストデータ コントローラ モニタモデル 環境 ドライバモデル 制御対象モデル ( モデル ) 30
モデルにあるバグを未然に防ぐ 目的 内容 ツール 設計に抜け漏れがあるか検証する 設計 ( モデル ) と要求 ( ドキュメント ) の関係を確認する トレーサビリティ :Simulink Verification & Validation 目的 内容 ツール 安全規格に準拠した設計か検証する モデルが ISO26262 に準拠しているか確認する モデルアドバイザー :Simulink Verification & Validation 目的 内容 ツール 実行したとき エラーが発生しないか検証する ランタイムエラー ( オーバーフロー ) を確認する 設計エラー検出 :Simulink Design Verifier デモ内容は ダウンロード資料のスライドで確認することができます 31
モデルとドキュメントのトレーサビリティ モデルからドキュメントへ 該当箇所が選択される クリック ドキュメントからモデルへ (Word/Excel/DOORS/Integrity ) ActiveX ボタン クリック 該当のモデル箇所がハイライト SLVV : Simulink Verification and Validation 32
モデルアドバイザー モデルのスタイルチェック 主なチェック内容 J-MAAB スタイルガイドライン適合チェック 安全認証 (IEC61508 / ISO26262 / DO-178B 関連チェック ) 要求リンクの整合性チェック SLVV : Simulink Verification and Validation 33
設計エラー検出 ランタイムエラー ( オーバーフロー 0 割 デッドロジック ) の検出 オーバーフロー 0 割 デッドロジックの検出 モデルの欠陥を検出 シミュレーションやテスト生成時の障害を回避することが可能 例 ) オーバーフロー 1 In1 2 In2 uint8 uint8 + + uint8 1 Out1 SLDV : Simulink Design Verifier 34
モデルにあるバグを未然に防ぐのまとめ トレーサビリティ 設計 ( モデル ) と要求 ( ドキュメント ) のあいだの抜け漏れを防ぐ モデルアドバイザー ISO26262 以外にも IEC61508 DO-178B モデリングルールのチェックで設計ミスを防ぐ 設計エラー検出 実行前に設計の誤り ( ランタイムエラー ) を防ぐ キーメッセージ モデリング後すぐに検証を行い バグの原因を見つけよう! SLDV : Simulink Design Verifier SLVV : Simulink Verification and Validation 36
テストデータの抜け漏れを未然に防ぐ 目的 内容 ツール テストデータに抜け漏れがないか検証する 既存のテストデータを取り込み テストデータがモデルのパスをすべて通ったか確認する カバレッジ測定 :Simulink Verification & Validation 目的 内容 ツール テスト漏れを補充するテストデータを作成する 補充テストデータを生成し 既存のテストデータにマージして カバレッジ 100% のテストデータを作成する テストデータ生成 :Simulink Design Verifier デモ内容は ダウンロード資料のスライドで確認することができます 37
外部から Simulink 環境への取り込み テストベクタを Simulink 上で表現する Excel の各シートに記載の信号から SignalBuilder ブロックを自動作成 Excel SignalBuilder SL:Simulink の標準 38
モデルカバレッジ測定 シミュレーション時に達成したモデルカバレッジを測定 SLVV : Simulink Verification and Validation 39
テストデータ生成 カバレッジ 100% のテストデータ生成 モデルの入出力関係を解析し 設定された カバレッジ を満たすテスト信号を自動生成する テスト信号の自動生成 Signal Builder によりテスト信号を作成 1 Simulink Design Verifier 1 0 1 1 Simulink モデル 0 SLDV : Simulink Design Verifier 40
カバレッジ 未達カバレッジ補充テストデータ生成 既存テストデータが満たさないカバレッジを補充するテストデータを生成 既存テストデータファイル またはカバレッジファイルを指定 ユーザー定義シナリオ + 自動生成データの組み合わせによるテストが可能 テストデータ作成 既存テストを含む MAT ファイルを指定 自動テストで補完 工数 カバレッジファイルを指定 SLDV : Simulink Design Verifier 41
sldvmisscovtool の紹介 sldvmisscovtool とは Simulink Design Verifier のテスト生成を簡単に利用するためのツール ユーザーテストを取り込み未達成カバレッジに到達するテストベクタを自動生成する GUI MATLAB Central からダウンロード可能 で検索! 42
テストデータの抜け漏れを未然に防ぐのまとめ カバレッジ測定 テストデータの落とし穴をモデル上で防ぐ テストデータ生成 テストデータの抜け漏れを見つけ出し キーメッセージ 補充テストデータを自動で生成 テストデータの抜け漏れもチェックしようレアなテストパターンでバグが見つかるかも SLDV : Simulink Design Verifier SLVV : Simulink Verification and Validation 43
4 Simulink モデルから 生成 入力デバイス 入力ドライバ 出力ドライバ 出力デバイス モデリング 検証 生成 OS/ スケジューラ プロセッサ / 周辺ハード 生成 44
Embedded Coder による組込み用 生成の概要 Simulink データオブジェクト (ROM RAM 管理 ) Simulink モデル ( 制御ロジック ) コンフィグレーション パラメータ ( コード生成設定 ) Embedded Coder EC:Embedded Coder 45
生成の FAQ どのような が生成されるか? モデルと の比較方法 Simulink のコメントを へ追加する方法 値やポインタを用いて引数を生成する方法 オリジナル型 (typedef) の作り方 モデルと は一致しているか? モデルと の一致性検証の方法 マークはデモでご紹介します! EC:Embedded Coder 46
モデルと の比較 EC:Embedded Coder DEMO 47
Simulink ブロック説明の挿入 EC:Embedded Coder 48
引数の生成 EC:Embedded Coder 52
既存の型に ユーザー任意の型を命名 (typedef) MATLAB ワークスペースに F64 を定義 例 ) F64=Simulink.AliasType; F64.BaseType = double ; EC:Embedded Coder 57
モデルとコードの一致性検証 モデル カバレッジ 100% のテストベクタ 出力の比較 不一致が生じた場合 アサーション発生! ( シミュレーション停止 ) (S-Function) EC:Embedded Coder SLDV : Simulink Design Verifier DEMO 58
生成のまとめ コンフィグレーション操作で ユーザー任意のコード生成が可能 Simulink 環境による の検証が可能 キーメッセージ 生成以外にも ハンドコードを Simulink に取り込み 実行することも可能! Simulink は を完全サポート! EC:Embedded Coder 59
5 生成 の利用方法 入力デバイス 入力ドライバ OS/ スケジューラ 出力ドライバ 出力デバイス 生成 プロセッサ / 周辺ハード 60
生成 の利用方法 Main file を参考に C 言語環境へ結合 #include cruise_alg_cg.h void main(void) { } Cruise_alg_initialize(); while (1) { : ヘッダファイルの設定 初期化処理 サンプル main 関数 通常は使用しない void rt_onestep(void) { : /* Step the model */ Cruise_alg_step(); : 割込み処理関数 ステップ実行関数 ( モデルに相当 ) EC:Embedded Coder 61
完成 入力デバイス 入力ドライバ コード生成 出力ドライバ 出力デバイス OS/ スケジューラ プロセッサ / 周辺ハード 62
63
最後に みなさまの開発現場に貢献したく Simulinkモデルによる開発についてご相談ください モデルベースデザインに必要なオプション製品やアドバイザリーサービス トレーニングなどご紹介します お近くのソフト開発者へ この資料をお渡しください チームメンバーと共に検討いただければと思います MathWorks Japan アプリケーションエンジニア渡辺修治 shuji.watanabe@mathworks.co.jp 67
ご清聴ありがとうございました MathWorks Japan アプリケーションエンジニア渡辺修治 shuji.watanabe@mathworks.co.jp 2012 The MathWorks, Inc. MATLAB and Simulink are registered trademarks of The MathWorks, Inc. See www.mathworks.com/trademarks for a list of additional trademarks. Other product or brand names may be trademarks or registered trademarks of their respective holders. 68