Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

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

ワークスペース データが組み込みのリーダーでサポートされない形式の場合、カスタム データ リーダーを記述してデータをシミュレーション データ インスペクターにインポートすることができます。この例では、カスタム ワークスペース リーダーのクラス定義の一部について説明し、シミュレーション データ インスペクターにリーダーを登録する方法を示します。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 という名前の実行にインポートされます。

ワークスペースからプログラムによりデータをインポートするには、関数 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);

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

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

参考

クラス

関数

関連するトピック