このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
カスタム データ リーダーを使用したワークスペース変数のインポート
ワークスペース データが組み込みのリーダーでサポートされない形式の場合、カスタム データ リーダーを記述してデータをシミュレーション データ インスペクターにインポートすることができます。この例では、カスタム ワークスペース リーダーのクラス定義の一部について説明し、シミュレーション データ インスペクターにリーダーを登録する方法を示します。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
すべてのカスタム リーダーは getName
、getTimeValues
、および getDataValues
メソッドを定義しなければなりません。カスタム リーダーを記述してワークスペースからデータをインポートする場合は、supportsVariable
メソッドも定義しなければなりません。この例のリーダーは、構造体の配列のインポートをサポートするために getChildren
メソッドも定義しています。
supportsVariable
メソッドは、リーダーでサポートされるワークスペース内の変数をチェックします。この例では、supportsVariable
は、以下の場合に true
を返します。
構造体に適切なフィールドが含まれている。
構造体の
n
フィールドに、信号名を表す string または文字配列が含まれている。構造体の
t
フィールドが、double データの列ベクトルになっている。d
フィールドに数値データが含まれている。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 コマンド ウィンドウからシミュレーション データ インスペクターを開くことができます。次に、[インポート] を選択します。
[インポート] ダイアログ ボックスには、シミュレーション データ インスペクターで組み込みのリーダーと登録済みのカスタム リーダーを使用してインポートできるベース ワークスペース内のデータが表示されます。カスタム リーダーは登録済みであるため、Line
、Sine Wave
、および Square Wave
信号はインポートできますが、変数 lineData
、sineWave
、および squareWave
はインポートできません。インポートするデータを選択し、[インポート] を選択します。すべてのデータのインポートを選択または選択解除するには、[名前] の横にあるチェック ボックスをオンまたはオフにします。データは Imported_Data
という名前の実行にインポートされます。
ワークスペースからプログラムによりデータをインポートするには、関数 Simulink.sdi.createRun
を使用します。
Simulink.sdi.createRun('Custom Workspace Data Run','vars',myLineVar,mySineVar,mySquareVar);
この例のカスタム リーダーでは、構造体の配列もインポートできます。ワークスペース変数を個別にインポートするのではなく、ワークスペース変数の配列をインポートすると、データを既存の実行にインポートするときにそれらの変数がまとめてグループ化されます。myLineVar
、mySineVar
、および mySquareVar
構造体を含む配列を作成し、関数 Simulink.sdi.createRun
を使用して配列をインポートします。
myVarArray = [myLineVar; mySineVar; mySquareVar]; Simulink.sdi.createRun('Workspace Array Run','vars',myVarArray);
インポートしたデータの検査と解析
データをインポートした後に、シミュレーション データ インスペクターを使用して、インポートしたデータを単独でまたは関連のシミュレーション データと一緒に検査および解析できます。