最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

Simscape 永久磁石同期電動機の HDL 互換 Simulink モデルへの変換のトラブルシューティング

この例では、連続時間であり非線形要素が含まれる Simscape™ プラント モデルを変更して HDL 互換の Simulink® モデルを生成する方法を示します。その後、この Simulink モデルの HDL コードを生成できます。

はじめに

Simscape HDL ワークフロー アドバイザーは HDL コードを生成する HDL 互換の実装モデルに Simscape プラント モデルを変換します。Simscape プラント モデルは、実装モデルの生成と互換性がない場合があります。そのような場合は、最初に Simscape プラント モデルを変更してからアドバイザーを実行します。

この例は、Simscape HDL ワークフロー アドバイザーとの互換性のために永久磁石同期電動機モデルを変更する方法を説明しています。モデルは連続時間であり、多くの非線形コンポーネントが含まれます。このモデルを離散時間の切り替えられた線形モデルに変更してから、Simscape HDL ワークフロー アドバイザーを実行します。

永久磁石同期電動機モデル

永久磁石同期電動機モデルは Simscape で物理システムです。モデルを開くには、次のコマンドを実行します。

open_system('ee_pmsm_drive')

モデルを ee_pmsm_drive_original.slx という名前で保存します。

open_system('ee_pmsm_drive_original')
set_param('ee_pmsm_drive_original','SimulationCommand','Update')

モデルには、一般的なハイブリッド車両で使用できるサイズに設定された永久磁石同期機 (PMSM) とインバーターが含まれます。インバーターは車両バッテリーに接続されます。モデルの動作を確認するには、モデルをシミュレーションします。

sim('ee_pmsm_drive_original')
open_system('ee_pmsm_drive_original/Scope')

このモデルは連続時間システムです。このモデルを Simscape HDL ワークフロー アドバイザーで使用するには、モデルを離散システムに変換します。次に、Simscape から HDL へのワークフローで互換性のあるブロックを使用するようにモデルを変更します。

連続時間モデルの固定ステップ離散モデルへの変換

1. Solver Configuration (Simscape)ブロックを使用して HDL コード生成用にソルバー オプションを設定します。ブロック パラメーターで以下を行います。

  • [ローカル ソルバーを使用] を選択します。

  • Backward Euler[ソルバー タイプ] として使用します。

  • 離散サンプル時間 Ts を指定します。

2.モデルのソルバー設定を変更します。[モデル化] タブで、[モデル設定] をクリックします。[ソルバー] ペインで以下を行います。

  • [ソルバーの選択]、[タイプ]Fixed-Step に設定します。

  • [ソルバー]discrete (no continuous states) に設定します。

  • [固定ステップ サイズ (基本サンプル時間)]Ts に設定します。

  • [タスクとサンプル時間オプション] セクションで [各離散レートを個別のタスクとして扱う] をオフにします。

3.モデルの表示設定を変更します。[デバッグ] タブで、[情報のオーバーレイ]、[サンプル時間]、[色] を選択します。サンプル時間が Ts 以外のブロックのサンプル時間の凡例を確認するか、連続時間スケールで実行します。Step ブロックをダブルクリックして、[サンプル時間]Ts に設定します。

4.シミュレーションを高速で行うため、PMSM のゼロシーケンス パラメーターを無視します。Permanent Magnet Synchronous Motor ブロックをダブルクリックし、[ゼロ シーケンス] to Exclude に設定します。

これで、モデルは固定ステップ離散システムになりました。モデルをシミュレートし、シミュレーション データ インスペクターで [Torque Demand] 信号と [Motor Torque] 信号を比較します。信号の差は、シミュレーションの終了に向かって許容誤差レベルを超えますが、許容制限内です。

2 ステップのプロセスを使用して Simscape プラント モデルを HDL 互換の実装モデルに変換します。

  1. 同等の Simulink ブロックを使用して Simscape アルゴリズムの非線形部分を置き換える Simulink モデルを実装します。

  2. HDL ワークフローへの Simscape と互換性のあるブロックを使用するように、このモデルを変更します。

同等の Simulink 実装への Nonlinear Simscape ブロックの置き換え

1. Simscape プラント モデルを HDL 互換にするためには、モデルの非線形コンポーネントまたはブロックの有無を特定します。

simscape.findNonlinearBlocks('ee_pmsm_drive_original')
Found network that contains nonlinear equations in the following blocks:
    {'ee_pmsm_drive_original/Permanent Magnet Synchronous Motor'}

The number of linear or switched linear networks in the model is 0.
The number of nonlinear networks in the model is 1.

ans =

  1x1 cell array

    {'ee_pmsm_drive_original/Permanent Magnet Synchronous Motor'}

Simscape プラント モデルには、非線形ブロックである PMSM ブロックがあります。

2.PMSM ブロック、Encoder ブロック、Gmin 抵抗器、Motor & Load Inertia ブロックが、同等のアルゴリズムを実行する Simulink ブロックと置き換えられます。

Electrical Interface ブロックを実装するには、制御電流源を使用します。

PMSM に対するインターフェイスは実装と分離されます。Simulink ブロックを使用して PMSM を実装するには、Electrical Equations と Mechanical Equations を使用します。Park Transform ブロックと Inverse Park Transform ブロック内で、Sine ブロックと Cosine ブロックを削除します。

FPGA で実行される Simscape ブロックの特定と Simscape モデルの再構築

ee_pmsm_drive_singleSL モデルは、元のモデル ee_pmsm_drive_original を変更し、そのモデルを Simscape HDL ワークフロー アドバイザーに対応するように準備する方法を示しています。

1. Simscape モデルを HDL 実装モデルの生成と互換するように変更するには、Simscape アルゴリズムの中で FPGA 上で実行する部分を特定します。この例では、三相インバーター、電気インターフェイス、PWM、および永久磁石同期電動機 (Simulink) を FPGA で実行できます。

2.FPGA で動作するブロックが特定されると、ブロックは最上位のサブシステム内に配置されます。このサブシステムは DUT (Design Under Test) で、HDL 実装モデルを生成した後に、FPGA 上で実行するブロックを含みます。Simscape HDL ワークフロー アドバイザーを実行した後、このサブシステムは HDL アルゴリズムに置き換えられます。Simscape モデルのこの部分は、最速のサンプルレートで実行されなければなりません。Rate Transition ブロックが追加され、設計がアップサンプリングされます。

3.ターゲット ハードウェアにリソースの使用率を保存するために、Data Type Conversion ブロックが追加されて、single データ型を使用するようにモデルが変換されます。

ee_pmsm_drive_singleSL モデルは、これらのブロックを最上位サブシステムである Subsystem1 (DUT) 内に配置する方法を示しています。サブシステム内のブロックは高速のレートで動作しています。

load_system('ee_pmsm_drive_singleSL')
set_param('ee_pmsm_drive_singleSL','SimulationCommand','update')
open_system('ee_pmsm_drive_singleSL/Subsystem1')

ee_pmsm_drive_singleSL モデルでは、三相インバーターと電気インターフェイスが Simscape Inverter and Interface サブシステム内に配置されます。

open_system('ee_pmsm_drive_singleSL/Subsystem1/Simscape Inverter and Interface')

HDL 互換性のための Permanent Magnet Synchronous Motor サブシステムの変更

前述の節では、マスク サブシステムの Permanent Magnet Synchronous Motor (Simulink) に適用された変更について説明しています。

1. Integrator with Wrapped State (Discrete or Continuous) ブロックは HDL コード生成との互換性がありません。このブロックは、Wrapped State DTI サブシステムに置き換えられています。

PMSMSubsystem = 'ee_pmsm_drive_singleSL/Subsystem1/Permanent Magnet Synchronous Motor (Simulink)';
open_system(PMSMSubsystem, 'force')

open_system([PMSMSubsystem, '/Wrapped State DTI'])

2.以下について、FPGA 面積フットプリントを削減します。

  • Park Transform ブロック、Clarke Transform ブロック、Clarke to Park Angle Transform ブロックが追加されます。

  • Inverse Park Transform ブロック、Inverse Park to Clarke Angle Transform ブロック、Inverse Clarke Transform ブロックが追加されます。

open_system([PMSMSubsystem, '/Park Transform'])

open_system([PMSMSubsystem, '/Inverse Park Transform'])

3.このサブシステム内の Discrete-Time Integrator ブロックでは、[サンプル時間]-1[ゲイン値]Ts、および [積分手法]Accumulation:Forward Euler に設定されます。次のコマンドを実行して、これらのブロック パラメーターをプログラムにより表示できます。

blockDTI = find_system(PMSMSubsystem, 'LookUnderMasks', 'on', ...
                                'blocktype', 'DiscreteIntegrator');
 for  n  =  1:numel(blockDTI)
    Integpath = blockDTI(n);
    Integname = get_param(Integpath, 'Name');
    stime = num2str(get_param(blockDTI{n}, 'SampleTime'));
    gval = num2str(get_param(blockDTI{n}, 'gainval'));
    integmethod = num2str(get_param(blockDTI{n}, 'IntegratorMethod'));
    disp('----------------------------------------------------')
    disp(Integpath)
    disp(['Sample time: ', stime, '    Gain: ', gval, ...
                    '    Integration method: ', integmethod])
 end
disp('----------------------------------------------------')
----------------------------------------------------
    {'ee_pmsm_drive_singleSL/Subsystem1/Permanent Magnet...'}

Sample time: -1    Gain: Ts    Integration method: Accumulation: Forward Euler
----------------------------------------------------
    {'ee_pmsm_drive_singleSL/Subsystem1/Permanent Magnet...'}

Sample time: -1    Gain: Ts    Integration method: Accumulation: Forward Euler
----------------------------------------------------

Simscape HDL ワークフロー アドバイザーに対応するためのモデルの準備

さらなる変更がモデルの最上位に適用されます。

  1. サンプル時間 Ts が追加されて、Display ブロックに接続されている Digital Clock。

  2. PMSM モデルから取得した三相電流でコントローラーをフィードして、Three-Phase Current Sensor Simscape ブロックが置き換えられます。

次の図は、上記の変更によるモデルの最上位レベルを示しています。

open_system('ee_pmsm_drive_singleSL')

Simscape HDL ワークフロー アドバイザーの実行

Simscape HDL ワークフロー アドバイザーを開くには、モデルで関数 sschdladvisor を実行します。

sschdladvisor('ee_pmsm_drive_singleSL')

実装モデルを生成するには、Simscape HDL ワークフロー アドバイザーで、既定の設定をそのままにして、タスクを実行します。実装モデルを開くには、[実装モデルを生成] タスクでリンクをクリックします。

HDL コード生成用の実装モデルの再構成

この例では、実装モデルが、Speedgoat FPGA I/O プラットフォームへの配布用に変更されています。モデルが gmStateSpaceHDL_ee_pmsm_drive_GenerateHDL という名前で再度保存されます。

HDL コード生成用に単精度実装モデルを再構成するには、以下を行います。

1. モデルに対して関数hdlsetupを実行します。

hdlsetup('gmStateSpaceHDL_ee_pmsm_drive_GenerateHDL')

2.モデル ソルバー設定の [固定ステップ サイズ]Ts/5 に変更されます。これは既定の [ソルバーの反復回数]5 になっているためです。

3.Subsystem1 ブロックには、FPGA 上で実行するブロックが含まれます。Simscape Inverter and Interface サブシステムは HDL Subsystem ブロックに置き換えられます。HDL Subsystem ブロックには、Simscape アルゴリズムの HDL 実装を含む HDL アルゴリズムが含まれます。HDL アルゴリズムの実装を確認するには、次のブロックを開きます。

model_name = 'gmStateSpaceHDL_ee_pmsm_drive_GenerateHDL';
dut_name = 'gmStateSpaceHDL_ee_pmsm_drive_GenerateHDL/Subsystem1';
load_system(model_name)
set_param(model_name,'SimulationCommand','Update')
open_system([dut_name, '/HDL Subsystem'])

open_system([dut_name, '/HDL Subsystem/HDL Algorithm'])

4.HDL Algorithm Subsystem に Valid Out 信号があります。Permanent Magnet Synchronous Motor (Simulink) サブシステムが Enabled Subsystem 内に配置され、vs_LL 入力端子が Valid Out 信号に接続されます。

open_system(dut_name)

5.最初に Simscape アルゴリズムが含まれていたサブシステム内のブロックをモデルの最上位に移動します。

次の図は、上記の変更によるモデルの最上位レベルを示しています。

open_system(model_name)

HDL コードの生成

HDL コードを生成する前に、コード生成後の生成モデルの出力を変更された Simscape プラント モデルと比較し、検証モデルの生成を指定します。

hdlset_param(model_name, 'GenerateValidationModel', 'on');

詳細については、生成されたモデルと検証モデルを参照してください。

HDL コードを生成するには、次のコマンドを実行します。

makehdl('gmStateSpaceHDL_ee_pmsm_drive_GenerateHDL/HDL Subsystem')

既定では、HDL Coder で VHDL コードが生成されます。Verilog コードを生成するには、次のコマンドを実行します。

makehdl('gmStateSpaceHDL_ee_pmsm_drive_GenerateHDL/HDL Subsystem', 'TargetLanguage', 'Verilog')

コード ジェネレーターは生成された HDL コードと検証モデルを hdlsrc フォルダーに保存します。生成されたコードは、HDL_Subsystem_tc.vhd として保存されます。リソースの使用率情報を確認するには、コード生成レポートを表示します。

検証モデルを開くには、HDL コードを生成した後に gm_gmStateSpaceHDL_ee_pmsm_drive_GenerateHDL_vnl.slx モデルを開きます。

Speedgoat FPGA I/O モジュールへの永久磁石同期電動機の配布

HDL 実装モデルでは、Subsystem1 に FPGA 上で実行するブロックが含まれます。この Subsystem で HDL ワークフロー アドバイザーを実行して、HDL アルゴリズムを Speedgoat ターゲット プラットフォームの FPGA ボードに配布できます。例については、 Hardware-in-the-Loop Implementation of Simscape Model on Speedgoat FPGA I/O Modulesを参照してください。

参考

関数

関連するトピック