Когда ваши данные о рабочей области находятся в формате, который не поддерживают встроенные читатели, можно записать пользовательское средство чтения данных, чтобы импортировать данные в Инспектора Данных моделирования. Этот пример объясняет части определения класса для пользовательского читателя рабочей области и показывает, как указать читателя с Инспектором Данных моделирования. Откройте 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
когда:
Структура содержит соответствующие поля.
То
поле структуры содержит строку или символьный массив, который представляет имя сигнала.
t
поле структуры является вектор-столбцом двойных данных.
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
свойство, добавленное к классу для пользовательского читателя. VariableValue
свойство для каждого SimpleStructReader
объект возвращен getChildren
метод является массивом структур. Другие методы используют 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
поле структуры к каждому импортированному сигналу. Когда импортированная переменная является скаляром, метод завоевывает репутацию от VariableValue
свойство SimpleStructReader
объект. Когда импортированные данные являются массивом структур, соответствующая структура извлечена из VariableValue
свойство с помощью ChannelIndex
свойство. Узел верхнего уровня массива называют 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
метод делает. Для скалярной структуры оба метода извлекают соответствующее поле из VariableValue
свойство SimpleStructReader
объект. Для нескалярной структуры оба метода получают доступ к соответствующей структуре в VariableValue
свойство с помощью ChannelIndex
свойство. Наконец, для узла верхнего уровня массива, время и данные оба возвращены как пустые.
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"
Если вы указываете пользовательское средство чтения данных рабочей области, можно импортировать сохраненное использование переменных рабочей области пользовательского формата в Инспектора Данных моделирования, использующего пользовательский интерфейс или Simulink.sdi.createRun
функция.
Чтобы импортировать данные с помощью пользовательского интерфейса, откройте Инспектора Данных моделирования. Можно использовать Simulink.sdi.view
функционируйте, чтобы открыть Инспектора Данных моделирования от командного окна MATLAB. Затем выберите Import.
Диалоговое окно Импорта показывает данные в базовом рабочем пространстве, что Инспектор Данных моделирования может импортировать использующий встроенный и указал пользовательских читателей. Поскольку пользовательский читатель указан, Line
, Sine Wave
, и Square Wave
сигналы доступны для импорта, в то время как lineData
, sineWave
, и squareWave
переменные не. Выберите данные, вы хотите импортировать и выбрать Import. Данные импортируют в запуск под названием 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);
После импортирования данных можно использовать Инспектора Данных моделирования, чтобы смотреть и анализировать импортированные данные самостоятельно или вместе со связанными данными моделирования.