ドキュメンテーション

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

スクリプトを使用した Simulink プロジェクト タスクの自動化

この例では、Simulink プロジェクト API を使用して、変更済みファイル、依存関係、ショートカットおよびラベルの操作も含めて、ファイルを操作するプロジェクト タスクを自動化する方法を示します。

コマンド ラインでの Simulink プロジェクトの取得

機体のプロジェクトを開き、simulinkproject を使用してコマンド ラインでプロジェクトを操作するためのプロジェクト オブジェクトを取得します。プロジェクトの操作をコマンド ラインで実行するには、Simulink プロジェクトでプロジェクトを開かなければなりません。

sldemo_slproject_airframe
proj = simulinkproject
Creating sandbox for project.
Created example files in "C:\slexamples\airframe21"
Initializing: Project Path
Identifying shadowed project files
Running: C:\slexamples\airframe21\utilities\set_up_project.m
Building with 'MinGW64 Compiler  C '.
MEX completed successfully.

proj = 

  ProjectManager with properties:

                 Name: 'Simulink Project Airframe Example'
          Information: [1×1 slproject.Information]
         Dependencies: [1×1 slproject.Dependencies]
            Shortcuts: [1×9 slproject.Shortcut]
          ProjectPath: [1×7 slproject.PathFolder]
    ProjectReferences: [1×0 slproject.ProjectReference]
           Categories: [1×1 slproject.Category]
                Files: [1×33 slproject.ProjectFile]
           RootFolder: 'C:\slexamples\airframe21'

プロジェクトのコマンドの検索

プロジェクトで何ができるか調べます。

methods(proj)
Methods for class slproject.ProjectManager:

addFile                       isLoaded                      
addFolderIncludingChildFiles  listModifiedFiles             
close                         refreshSourceControl          
createCategory                reload                        
export                        removeCategory                
findCategory                  removeFile                    
findFile                      
getFilesRequiredBy            

プロジェクト ファイルの確認

プロジェクト オブジェクトを取得後、ファイルなどのプロジェクト プロパティを確認できます。

files = proj.Files
files = 

  1×33 ProjectFile array with properties:

    Path
    Labels
    Revision
    SourceControlStatus

このリストにあるファイルにアクセスするためのインデックスを作成します。次のコマンドでは、ファイル番号 14 のファイルが取得されます。各ファイルには、ファイルのパスおよびファイルに付けられたラベルを示すプロパティがあります。

proj.Files(14)
ans = 

  ProjectFile with properties:

                   Path: 'C:\slexamples\airframe21\models\AnalogControl.mdl'
                 Labels: [1×1 slproject.Label]
               Revision: '2'
    SourceControlStatus: Unmodified

14 番目のファイルのラベルを調べます。

proj.Files(14).Labels
ans = 

  Label with properties:

            File: 'C:\slexamples\airframe21\models\AnalogControl.mdl'
        DataType: 'none'
            Data: []
            Name: 'Design'
    CategoryName: 'Classification'

名前を指定して、特定のファイルを取得します。

myfile = findFile(proj, 'models/AnalogControl.mdl')
myfile = 

  ProjectFile with properties:

                   Path: 'C:\slexamples\airframe21\models\AnalogControl.mdl'
                 Labels: [1×1 slproject.Label]
               Revision: '2'
    SourceControlStatus: Unmodified

ファイルで何ができるか調べます。

methods(myfile)
Methods for class slproject.ProjectFile:

addLabel     findLabel    removeLabel  

変更済みファイルの取得

任意のブロックを追加してプロジェクト モデル ファイルを変更します。

open_system('AnalogControl')
add_block('built-in/SubSystem', 'AnalogControl/test')
save_system('AnalogControl')

プロジェクトの変更済みファイルをすべて取得します。2 つの変更済みファイルを確認します。変更済みモデル ファイルが表示される Simulink プロジェクトの [変更済みファイル] ビューを対応する .SimulinkProject 定義ファイルと比較します。

modifiedfiles = listModifiedFiles(proj)
modifiedfiles = 

  1×2 ProjectFile array with properties:

    Path
    Labels
    Revision
    SourceControlStatus

2 番目の変更済みファイルを取得します。ファイルの SourceControlStatus プロパティが [変更済み] であることを確認します。同様に、listModifiedFiles は、Simulink プロジェクトの [変更済みファイル] ビューに表示される、追加、競合、削除されたファイルなどをすべて返します。

modifiedfiles(2)
ans = 

  ProjectFile with properties:

                   Path: 'C:\slexamples\airframe21\models\AnalogControl.mdl'
                 Labels: [1×1 slproject.Label]
               Revision: '2'
    SourceControlStatus: Modified

個々のファイルでクエリを実行する前にソース管理ステータスを更新します。listModifiedFiles を使用する前に行う必要はありません。

refreshSourceControl(proj)

特定のソース管理ステータスをもつすべてのプロジェクト ファイルを取得します。たとえば、Unmodified のファイルを取得します。

proj.Files(ismember([proj.Files.SourceControlStatus], matlab.sourcecontrol.Status.Unmodified))
ans = 

  1×32 ProjectFile array with properties:

    Path
    Labels
    Revision
    SourceControlStatus

ファイルの依存関係の取得

ファイルの依存関係を更新します。プロジェクトは依存関係の解析を実行し、プロジェクト ファイル間の既知の依存関係を更新します。

update(proj.Dependencies)

プロジェクト オブジェクト内で依存関係を調べます。プロジェクト オブジェクトの依存関係プロパティには MATLAB ダイグラフ オブジェクト内のプロジェクト ファイル間の依存関係のグラフが含まれます。同じ依存関係解析グラフを Simulink プロジェクトの [影響ビュー] で確認できます。ダイグラフ オブジェクトを操作する代わりにグラフをプロットする場合は、影響ビューをイメージ ファイルに保存します。

proj.Dependencies
ans = 

  Dependencies with properties:

    Graph: [1×1 digraph]

グラフの依存関係を取得します。ダイグラフ メソッドを使用してグラフから情報を取得できます。

g = proj.Dependencies.Graph
g = 

  digraph with properties:

    Edges: [24×1 table]
    Nodes: [25×1 table]

モデルで必要なファイルを取得します。

requiredFiles = bfsearch(g, which('AnalogControl'))
requiredFiles =

  3×1 cell array

    'C:\slexamples\airframe21\models\AnalogControl.mdl'
    'C:\slexamples\airframe21\data\controller.sldd'
    'C:\slexamples\airframe21\data\buses.sldd'

グラフ内のすべてのタイプの最上位ファイルを取得します。

top = g.Nodes.Name(indegree(g)==0);

依存関係のある最上位ファイルを取得します。

top = g.Nodes.Name(indegree(g)==0 & outdegree(g)>0)
top =

  7×1 cell array

    'C:\slexamples\airframe21\models\DigitalControl.slx'
    'C:\slexamples\airframe21\models\LinearActuator.slx'
    'C:\slexamples\airframe21\models\slproject_f14.slx'
    'C:\slexamples\airframe21\tests\f14_airframe_test.m'
    'C:\slexamples\airframe21\utilities\rebuild_s_functions.m'
    'C:\slexamples\airframe21\utilities\set_up_project.m'
    'C:\slexamples\airframe21\utilities\upgrade_project.m'

転置されたグラフを作成し、影響を受けた (または "上流の") ファイルを見つけます。

transposed   = flipedge(g)
impacted = bfsearch(transposed, which('vertical_channel'))
transposed = 

  digraph with properties:

    Edges: [24×1 table]
    Nodes: [25×1 table]


impacted =

  4×1 cell array

    'C:\slexamples\airframe21\models\vertical_channel.slx'
    'C:\slexamples\airframe21\models\f14_airframe.slx'
    'C:\slexamples\airframe21\models\slproject_f14.slx'
    'C:\slexamples\airframe21\tests\f14_airframe_test.m'

データ ディクショナリの影響を受けたファイルを見つけます。

impacted2 = bfsearch(transposed, which('buses.sldd'))
impacted2 =

  11×1 cell array

    'C:\slexamples\airframe21\data\buses.sldd'
    'C:\slexamples\airframe21\data\controller.sldd'
    'C:\slexamples\airframe21\data\system_model.sldd'
    'C:\slexamples\airframe21\tests\f14_airframe_test.m'
    'C:\slexamples\airframe21\models\AnalogControl.mdl'
    'C:\slexamples\airframe21\models\DigitalControl.slx'
    'C:\slexamples\airframe21\models\f14_airframe.slx'
    'C:\slexamples\airframe21\models\LinearActuator.slx'
    'C:\slexamples\airframe21\models\NonLinearActuator.mdl'
    'C:\slexamples\airframe21\models\slproject_f14.slx'
    'C:\slexamples\airframe21\models\vertical_channel.slx'

依存関係や孤立したファイルの数など、ファイルの情報を取得します。

averageNumDependencies = mean(outdegree(g));
numberOfOrphans = sum(indegree(g)+outdegree(g)==0);

モデルの階層構造に変更を加える場合は、ボトムアップ方式で開始し、トポロジカル順序で検索します。

ordered = g.Nodes.Name(flip(toposort(g)));

ショートカットのクエリ

プロジェクトの [ショートカット] プロパティを調べます。ショートカットを使用して、起動タスクと終了タスクを自動化したり、頻繁に使用するタスクや頻繁にアクセスするファイルを保存したりできます。

shortcuts = proj.Shortcuts
shortcuts = 

  1×9 Shortcut array with properties:

    File
    RunAtStartup
    RunAtShutdown

配列内のショートカットを調べます。

shortcuts(9)
ans = 

  Shortcut with properties:

             File: 'C:\slexamples\airframe21\utilities\set_up_project.m'
     RunAtStartup: 1
    RunAtShutdown: 0

RunAtStartup プロパティは 1 に設定されているので、このショートカット ファイルはプロジェクトの起動時に実行するよう設定されています。コマンド ラインでは、RunAtStartup プロパティおよび RunAtShutdown プロパティを表示することはできますが、変更することはできません。これらのプロパティを設定するには、[Simulink プロジェクト] ショートカット ツールを使用します。ショートカットのファイル パスを取得します。

shortcuts(6).File
ans =

  1×50 char array

C:\slexamples\airframe21\reports\slproject_f14.pdf

ショートカット cell 配列内のすべてのファイルを調べます。

{shortcuts.File}'
ans =

  9×1 cell array

    'C:\slexamples\airframe21\batch_jobs\billOfMaterials.m'
    'C:\slexamples\airframe21\batch_jobs\checkCodeProblems.m'
    'C:\slexamples\airframe21\batch_jobs\runUnitTest.m'
    'C:\slexamples\airframe21\batch_jobs\saveModelFiles.m'
    'C:\slexamples\airframe21\models\slproject_f14.slx'
    'C:\slexamples\airframe21\reports\slproject_f14.pdf'
    'C:\slexamples\airframe21\utilities\clean_up_project.m'
    'C:\slexamples\airframe21\utilities\rebuild_s_functions.m'
    'C:\slexamples\airframe21\utilities\set_up_project.m'

起動時に実行するよう設定されたショートカットを示す論理配列を作成します。

idx = [shortcuts.RunAtStartup]
idx =

  1×9 logical array

   0   0   0   0   0   0   0   0   1

論理配列を使用して、起動ショートカットだけを取得します。

startupshortcuts = shortcuts(idx)
startupshortcuts = 

  Shortcut with properties:

             File: 'C:\slexamples\airframe21\utilities\set_up_project.m'
     RunAtStartup: 1
    RunAtShutdown: 0

File プロパティにアクセスすることで、起動ショートカットのパスを取得します。

startupshortcuts.File
ans =

  1×51 char array

C:\slexamples\airframe21\utilities\set_up_project.m

ファイルのラベル

char 型の、ラベルの新しいカテゴリを作成します。Simulink プロジェクトで、新しい Engineers カテゴリが [ラベル] ペインに表示されます。

createCategory(proj, 'Engineers', 'char')
ans = 

  Category with properties:

                Name: 'Engineers'
        SingleValued: 0
            DataType: 'char'
    LabelDefinitions: [1×0 slproject.LabelDefinition]

新規カテゴリで何ができるか調べます。

category = findCategory(proj, 'Engineers');
methods(category)
Methods for class slproject.Category:

createLabel  findLabel    removeLabel  

新しいカテゴリに新しいラベルを定義します。

createLabel(category, 'Bob');

ラベル定義を取得します。

ld = findLabel(category, 'Bob')
ld = 

  LabelDefinition with properties:

            Name: 'Bob'
    CategoryName: 'Engineers'

取得したファイルにラベル myfile を付けます。ファイルを Simulink プロジェクトで選択すると、ラベル エディター ペインでこのラベルを確認できます。

addLabel(myfile, 'Engineers', 'Bob');

特定のラベルを取得して、テキストなどのデータをそのラベルに付加します。

label = findLabel(myfile, 'Engineers', 'Bob');
label.Data = 'Please assess'
label = 

  Label with properties:

            File: 'C:\slexamples\airframe21\models\AnalogControl.mdl'
        DataType: 'char'
            Data: 'Please assess'
            Name: 'Bob'
    CategoryName: 'Engineers'

次のように、ラベル データの変数を指定できます。

mydata = label.Data
mydata =

  1×13 char array

Please assess

数値データ型の新しいラベル カテゴリを作成します。

createCategory(proj, 'Assessors', 'double');
category = findCategory(proj, 'Assessors');
createLabel(category, 'Sam');

指定したファイルに新しいラベルを付加し、データ値 2 をそのラベルに割り当てます。

myfile = proj.Files(14);
addLabel(myfile, 'Assessors', 'Sam', 2)
ans = 

  Label with properties:

            File: 'C:\slexamples\airframe21\models\AnalogControl.mdl'
        DataType: 'double'
            Data: 2
            Name: 'Sam'
    CategoryName: 'Assessors'

プロジェクトを閉じる

コマンド ラインでプロジェクトを閉じる処理は、Simulink プロジェクト ツールを使用してプロジェクトを閉じる場合と同じです。たとえば、プロジェクトはシャットダウン スクリプトを実行し、未保存のモデルを確認します。

close(proj)
Running: C:\slexamples\airframe21\utilities\clean_up_project.m
Closing Project Models
Clearing: Project Path

詳細

API の使用方法の詳細については、doc simulinkproject と入力してください。

起動タスクと終了タスクの自動化の詳細については、起動タスクの自動化を参照してください。

参考

| | | | |

関連するトピック