メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

カスタム データ リーダーを使用したワークスペース変数のインポート

ワークスペース データが組み込みのリーダーでサポートされない形式の場合、カスタム データ リーダーを記述してデータをシミュレーション データ インスペクターにインポートすることができます。この例では、カスタム ワークスペース リーダーのクラス定義の一部について説明し、シミュレーション データ インスペクターにリーダーを登録する方法を示します。SimpleStructReader.m ファイルを開いて、完全なクラス定義を表示します。

ワークスペース データの作成

最初に、カスタム リーダーを使用してシミュレーション データ インスペクターにインポートするワークスペース データを作成します。各信号を、データのフィールド (d)、時間値 (t)、および信号名 (n) を持つ構造体として格納していると仮定します。

time = 0:0.1:100;
time = time';
lineData = 1/4*time;
sineWave = sin((2*pi)/50*time);
squareWave = square((2*pi)/30*time);

mySineVar.d = sineWave;
mySineVar.t = time;
mySineVar.n = "Sine Wave";

myLineVar.d = lineData;
myLineVar.t = time;
myLineVar.n = "Line";

mySquareVar.d = squareWave;
mySquareVar.t = time;
mySquareVar.n = "Square Wave";

カスタム リーダーのクラス定義の記述

カスタム リーダーで関連データとメタデータをワークスペース変数から抽出する方法を指定するクラス定義を記述します。MATLAB® パス上の場所にクラス定義ファイルを保存します。

クラス定義は最初に io.reader クラスから継承し、その後にプロパティとメソッド定義が続きます。この例のカスタム リーダーはプロパティ ChannelIndex を定義します。リーダーを使用して、ワークスペースから個々の構造体または構造体の配列をインポートできます。構造体の配列をインポートするときに、ChannelIndex プロパティが使用されます。

classdef SimpleStructReader < io.reader

    properties
        ChannelIndex
    end

すべてのカスタム リーダーは getNamegetTimeValues、および getDataValues メソッドを定義しなければなりません。カスタム リーダーを記述してワークスペースからデータをインポートする場合は、supportsVariable メソッドも定義しなければなりません。この例のリーダーは、構造体の配列のインポートをサポートするために getChildren メソッドも定義しています。

supportsVariable メソッドは、リーダーでサポートされるワークスペース内の変数をチェックします。この例では、supportsVariable は、以下の場合に true を返します。

  1. 構造体に適切なフィールドが含まれている。

  2. 構造体の n フィールドに、信号名を表す string または文字配列が含まれている。

  3. 構造体の t フィールドが、double データの列ベクトルになっている。

  4. d フィールドに数値データが含まれている。

  5. d フィールドが t フィールドと同じサイズで、各タイム ステップにサンプル値があることを意味する。

function supported = supportsVariable(~, val)
    % Support structure with fields t (time), d (data), and n (name)
    supported = ...
        isstruct(val) && ...
        isfield(val,'t') && ...
        isfield(val,'d') && ...
        isfield(val,'n');
    if supported
        for idx = 1:numel(val)
            varName = val(idx).n;
            time = val(idx).t;
            varData = val(idx).d;
                    
            % Name must be string or character array
            if ~ischar(varName) && ~isstring(varName)
                supported = false;

            % Time must be double column vector
            elseif ~isa(time,'double') || ~iscolumn(time)
                supported = false;

            % Data size must match time size
            else
                timeSz = size(time);
                dataSz = size(varData);
                        
                if ~isnumeric(varData) || ~isequal(dataSz, timeSz)
                    supported = false;
                end
            end
        end
    end
end

getChildren メソッドは、構造体の配列内の各構造体に対して SimpleStructReader オブジェクトを作成します。インポートする変数がスカラーでない場合、getChildren メソッドは、カスタム リーダーに追加された ChannelIndex プロパティに値を割り当てます。getChildren メソッドで返される各 SimpleStructReader オブジェクトの VariableValue プロパティは構造体の配列です。その他のメソッドは ChannelIndex プロパティを使用して、各オブジェクトから適切な信号名、信号データおよび時間の値を抽出します。

function childObj = getChildren(obj)
    childObj = {};
    if ~isscalar(obj.VariableValue) && isempty(obj.ChannelIndex)
        numChannels = numel(obj.VariableValue);
        childObj = cell(numChannels,1);
        for idx = 1:numChannels
            childObj{idx} = SimpleStructReader;
            childObj{idx}.VariableName = sprintf('%s(%d)',obj.VariableName,idx);
            childObj{idx}.VariableValue = obj.VariableValue;
            childObj{idx}.ChannelIndex = idx;
        end
    end
end

getName メソッドは、インポートされた各信号に、構造体の n フィールドに格納されている名前を割り当てます。インポートされた変数がスカラーである場合、メソッドは SimpleStructReader オブジェクトの VariableValue プロパティから名前を取得します。インポートされたデータが構造体の配列である場合、ChannelIndex プロパティを使用して適切な構造体が VariableValue プロパティから抽出されます。配列の最上位ノードの名前は Signal Array です。

function retName = getName(obj)
    if isscalar(obj.VariableValue)
        retName = char(obj.VariableValue.n);
    elseif ~isempty(obj.ChannelIndex)
        varVal = obj.VariableValue(obj.ChannelIndex);
        retName = char(varVal.n);
    else
        retName = 'Signal Array';
    end
end

getTimeVals メソッドと getDataVals メソッドは、getName メソッドと同様の方法でスカラー構造体と非スカラー構造体を処理します。スカラー構造体の場合、どちらのメソッドも SimpleStructReader オブジェクトの VariableValue プロパティから適切なフィールドを抽出します。非スカラー構造体の場合、どちらのメソッドも、ChannelIndex プロパティを使用して VariableValue プロパティ内の適切な構造体にアクセスします。最後に、配列の最上位ノードでは、時間とデータはどちらも空として返されます。

function timeVals = getTimeValues(obj)
    if isscalar(obj.VariableValue)
        timeVals = obj.VariableValue.t;
    elseif ~isempty(obj.ChannelIndex)
        varVal = obj.VariableValue(obj.ChannelIndex);
        timeVals = varVal.t;
    else
        timeVals = [];
    end
end
        
function dataVals = getDataValues(obj)
    if isscalar(obj.VariableValue)
        dataVals = obj.VariableValue.d;
    elseif ~isempty(obj.ChannelIndex)
        varVal = obj.VariableValue(obj.ChannelIndex);
        dataVals = varVal.d;
    else
        dataVals = [];
    end
end

カスタム リーダーの登録

カスタム リーダーのクラス定義を記述した後、そのリーダーを使用してデータをシミュレーション データ インスペクターにインポートする前に、リーダーを登録しなければなりません。シミュレーション データ インスペクターでは、MATLAB セッションの間に登録されたリーダーは保存されないため、新しい各 MATLAB セッションの開始時にカスタム リーダーを登録する必要があります。この例のワークスペース データ リーダーを登録するには、registerWorkspaceReader メソッドを使用します。

registerWorkspaceReader(SimpleStructReader);

リーダーが登録されていることを確認するには、io.reader.getRegisteredWorkspaceReaders メソッドを使用します。

io.reader.getRegisteredWorkspaceReaders
ans = 
"SimpleStructReader"

カスタム形式のワークスペース データのインポート

カスタム ワークスペース データ リーダーを登録したら、カスタム形式を使用して保存されたワークスペース変数を、UI または関数 Simulink.sdi.createRun を使用してシミュレーション データ インスペクターにインポートできます。

UI を使用してデータをインポートするには、シミュレーション データ インスペクターを開きます。関数 Simulink.sdi.view を使用して、MATLAB コマンド ウィンドウからシミュレーション データ インスペクターを開くことができます。次に、[インポート] を選択します。

[インポート] ダイアログ ボックスには、シミュレーション データ インスペクターで組み込みのリーダーと登録済みのカスタム リーダーを使用してインポートできるベース ワークスペース内のデータが表示されます。カスタム リーダーは登録済みであるため、LineSine Wave、および Square Wave 信号はインポートできますが、変数 lineDatasineWave、および squareWave はインポートできません。インポートするデータを選択し、[インポート] を選択します。すべてのデータのインポートを選択または選択解除するには、[名前] の横にあるチェック ボックスをオンまたはオフにします。データは Imported_Data という名前の実行にインポートされます。

The Import dialog box

ワークスペースからプログラムによりデータをインポートするには、関数 Simulink.sdi.createRun を使用します。

Simulink.sdi.createRun('Custom Workspace Data Run','vars',myLineVar,mySineVar,mySquareVar);

この例のカスタム リーダーでは、構造体の配列もインポートできます。ワークスペース変数を個別にインポートするのではなく、ワークスペース変数の配列をインポートすると、データを既存の実行にインポートするときにそれらの変数がまとめてグループ化されます。myLineVarmySineVar、および mySquareVar 構造体を含む配列を作成し、関数 Simulink.sdi.createRun を使用して配列をインポートします。

myVarArray = [myLineVar; mySineVar; mySquareVar];
Simulink.sdi.createRun('Workspace Array Run','vars',myVarArray);

インポートしたデータの検査と解析

データをインポートした後に、シミュレーション データ インスペクターを使用して、インポートしたデータを単独でまたは関連のシミュレーション データと一緒に検査および解析できます。

The Line, Sine Wave, and Square Wave signals from the Workspace Array run plotted in three time plots in the Simulation Data Inspector

参考

クラス

関数

トピック