Импортируйте переменные рабочей области Используя пользовательское средство чтения данных

Когда ваши данные о рабочей области находятся в формате, который не поддерживают встроенные читатели, можно записать пользовательское средство чтения данных, чтобы импортировать данные в Инспектора Данных моделирования. Этот пример объясняет части определения класса для пользовательского читателя рабочей области и показывает, как указать читателя с Инспектором Данных моделирования. Откройте 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 когда:

  1. Структура содержит соответствующие поля.

  2. То поле структуры содержит строку или символьный массив, который представляет имя сигнала.

  3. t поле структуры является вектор-столбцом двойных данных.

  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 свойство, добавленное к классу для пользовательского читателя. 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);

Смотрите и анализируйте импортированные данные

После импортирования данных можно использовать Инспектора Данных моделирования, чтобы смотреть и анализировать импортированные данные самостоятельно или вместе со связанными данными моделирования.

Смотрите также

Классы

Функции

Похожие темы