Если данные рабочей области имеют формат, который не поддерживается встроенными считывателями, можно записать пользовательский считыватель данных для импорта данных в инспектор данных моделирования. В этом примере поясняются части определения класса для пользовательского устройства чтения в рабочей области и показано, как зарегистрировать устройство чтения в инспекторе данных моделирования. Откройте окно 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 поле структуры содержит строку или символьный массив, представляющий имя сигнала.
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. Затем выберите Импорт.

В диалоговом окне «Импорт» отображаются данные в базовом рабочем пространстве, которые инспектор данных моделирования может импортировать с помощью встроенных и зарегистрированных пользовательских средств чтения. Поскольку пользовательское устройство чтения зарегистрировано, 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);
После импорта данных можно использовать инспектор данных моделирования для проверки и анализа импортированных данных самостоятельно или вместе со связанными данными моделирования.
