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

Передача Таблицы позволяет вам проверять, что изменения в блоках в библиотеке не повреждают модель, если вы имеете сохраненный модель с более старой версией библиотечного блока. Передача таблиц помогает вам обеспечить совместимость библиотечных блоков, когда вы изменяете путь или имя библиотеки, или добавляете, удаляете или переименовываете параметры в библиотечном блоке. Для получения дополнительной информации смотрите, Создайте Пользовательскую Библиотеку.

Создайте передающую запись таблицы для отображения старых библиотечных блоков к новым библиотечным блокам. Когда вы открываете модель, ссылки на старый библиотечный блок обновляются автоматически, не теряя данные или функциональность. Передающие таблицы выполняются, когда вы открываете модель, закрываете модель, или когда вы выполняете add_block или replace_block команда.

Создайте передающую запись таблицы когда вы:

  • Переименуйте блок.

  • Переместите блок от одной библиотеки до другой библиотеки.

  • Добавьте или удалите параметры из блока.

  • Разделите функциональность блока.

Передача записи таблицы для переименованного блока

Рассмотрите пример где имя блока в библиотеке testlib переименован от ss1 к ss2.

  1. Откройте заблокированную библиотеку Lib1.

  2. В окне Library, на вкладке Library, нажимают Locked Library. Библиотека теперь разблокирована для редактирования.

  3. На вкладке Modeling нажмите Library Properties. Диалоговое окно Library Properties открывается.

  4. Кликните по вкладке Forwarding Table.

  5. Нажмите запись Add New. Новая строка добавляется в передающей таблице.

  6. Задайте имя старого блока в Старом Блоке Path и соответствующем новом блоке path в Новом Блоке Path. Если вы не знаете путь, выберите блок в модели и нажмите Get gcb кнопка. Путь блока автоматически заполняется в соответствующих столбцах.

Отображение старого пути к новому пути создается в передающей таблице. Теперь откройте модель, которая содержит ссылки на библиотеку. Ссылки на старые библиотечные блоки в модели обновляются автоматически. Можно использовать панель поиска выше таблицы, чтобы отфильтровать табличное содержимое. Можно отсортировать столбцы в порядке возрастания или убывания. Можно также сгруппировать столбцы их значениями.

Присвойте номера версий библиотечным блокам

В столбце Версии можно задать номер версии для библиотечного блока.

Если старое имя блока совпадает с новым именем блока, передающая таблица заполняет номер версии автоматически. Начальное значение версии библиотеки LibraryVersion выведен из ModelVersion свойство библиотеки в то время ссылка библиотеки создается. Любые последующие обновления библиотечного блока обновят версию библиотеки, чтобы совпадать с версией модели библиотеки.

Номер версии:

  • Должно быть числовое значение.

  • Должен иметь формат <major_version>. <minor_version> когда старым и новыми путями к блоку является то же самое.

  • Не должен иметь больше чем одной записи через точку. Например, номер версии 1,3 приемлем. Номер версии 1.3.1 не приемлем.

  • Формат не очень важен, когда вы используете передающую таблицу, чтобы переместить библиотечный блок от одной библиотеки до другого.

Блок Move от одной библиотеки до другого

Рассмотрите пример где блок ss1 перемещен от testlib1 к testlib2'. Передающую запись таблицы в этом случае показывают здесь:

moving block from one library to another

Добавьте или удалите параметры из блока

Рассмотрите пример где параметр Усиления ss1 в библиотеке testlibудален, и два других параметра Initial condition и Delay length добавляются к нему.

add or remove parameter

Чтобы обработать это изменение, мы используем функцию преобразования. Функция преобразования корректирует несоответствие параметров между новыми и старыми ссылками библиотеки, которое гарантирует, что ссылки библиотеки продолжают работать. Можно задать функцию преобразования использование .m файл функции на пути MATLAB, затем вызовите функцию в столбце Функции Преобразования Передающей Таблицы.

Соединенный блок содержит экземпляр параметров блоков в форме аргументов name-value, чтобы инстанцировать блока. Эти данные об экземпляре передаются функции преобразования как InstanceData наряду с передачей записи. Эти данные хранятся как struct поля .

Когда вы создаете версии библиотечного блока, параметры добавлены или удалены из InstanceData. В этом примере, InstanceData перед удалением параметра Усиления и после того, как выглядит так сложение начального условия и длины задержки

Прежде:

'RTWMemSecFuncInitTerm' 'Inherit from model'
'RTWMemSecFuncExecute' 'Inherit from model'
'RTWMemSecDataConstants' 'Inherit from model'
'RTWMemSecDataInternal' 'Inherit from model'
'RTWMemSecDataParameters' 'Inherit from model'
'ContentPreviewEnabled' 'on'
'Gain' '0'

После:

'RTWMemSecFuncInitTerm'    'Inherit from model'
'RTWMemSecFuncExecute'    'Inherit from model'
'RTWMemSecDataConstants'    'Inherit from model'
'RTWMemSecDataInternal'    'Inherit from model'
'RTWMemSecDataParameters'    'Inherit from model'
'ContentPreviewEnabled'    'on'
'DelayLength'    '1'
'InitialCondition'    '0' 

Это - синтаксис для функции преобразования.

function outData = TransformationFcn(inData)

В этом синтаксисе функций:

  • inData структура с полями ForwardingTableEntry и InstanceData. ForwardingTableEntry также структура.

    • ForwardingTableEntry имеет старое название, новое имя, старый путь и новый путь блока. Обратитесь к коду, чтобы получить доступ к членам ForwardingTableEntry.

  • outData структура с полями NewInstanceData и NewBlockPath.

Добавление или удаляет параметры из блока:

  1. Получите данные об экземпляре и передающую запись таблицы.

  2. Извлеките список пары "имя-значение" и имен блока.

  3. Получите старые и новые имена блока.

  4. Проверяйте, являются ли старые и новые имена блока тем же самым. Если так, затем извлеките версии блока.

  5. Проверяйте, ли старая версия 1.1, и новая версия 1.2. Затем удалите Gain параметр и добавляет параметры Delay length и Initial condition.

Примечание

У вас может быть только одна функция преобразования для одной библиотеки или блока. Однако у вас может быть несколько функций.

Чтобы добавить или удалить параметры, используйте эту функцию преобразования.

function [outData] = txFcnTestlib(inData)
    outData.NewBlockPath = '';
    outData.NewInstanceData = [];
    
    % Get linked block instance data and forwarding entry for which
    % function is called
    instanceData = inData.InstanceData;
    forwardingTableEntry = inData.ForwardingTableEntry;
    
    % Get list of name value pair and block names
    [ParamNames{1:length(instanceData)}] = instanceData.Name;
    
    % Get old and new block paths or simply names
    oldName = forwardingTableEntry.('__slOldName__');
    newName = forwardingTableEntry.('__slNewName__');
    
    % If block names are same and its subsys block in the lib
    if strcmp(oldName, newName)
        % Get old and new block versions from forwarding table
        oldVer = forwardingTableEntry.('__slOldVersion__');
        newVer = forwardingTableEntry.('__slNewVersion__');

        % Each forwarding entry with different version can have separate
        % entry. Here, for one single entry in forwarding table i.e.
        % 1.2->1.3 or 1.3->2.0, we have separate transformation making one
        % TX Fcn for one library or block.
        if strcmp(oldName, 'testlib/ss1')
            % Forwarding with same block name ss1
            if oldVer == '1.1' && newVer == '1.2'
                % Remove gain param
                if (ismember('Gain',ParamNames))
                    for (i = 1:length(instanceData))
                        if (strcmp(instanceData(i).Name,'Gain') == true)
                            instanceData(i) = [];
                            break;
                        end
                    end
                end
                
                % Add delay length param
                if (ismember('DelayLength',ParamNames))
                    for (i = 1:length(instanceData))
                        if (strcmp(instanceData(i).Name,'Value') == true)
                            instanceData(i).Value = '5';
                            break;
                        end
                    end
                else
                    instanceData(end+1).Name = 'DelayLength';
                    instanceData(end).Value = '1';
                end
                
                % Add initial condition param
                if (ismember('InitialCondition',ParamNames))
                    for (i = 1:length(instanceData))
                        if (strcmp(instanceData(i).Name,'InitialCondition') == true)
                            instanceData(i).Value = '0';
                            break;
                        end
                    end
                else
                    instanceData(end+1).Name = 'InitialCondition';
                    instanceData(end).Value = '0';
                end
            elseif (oldVer == '1.2' && newVer == '1.3')
                % Do version 1.2 to 1.3 specific changes
            elseif (oldVer == '1.3' && newVer == '2.0')
                % Do version 1.3 to 2.0 specific changes
            else
                % Do default changes not applicable to any version if
                % required
            end
        elseif strcmp(oldName, 'testlib/ss2')
            % Forwarding for block ss2  with version upgrade
        end
    elseif strcmp(oldName, 'testlib/oldblk') && strcmp(newName, 'testlib2/newblk')
        % Block moved to new library or just block is renamed within same
        % library, no version is checked here. Do transformation is
        % required i.e. is block has been modified while renaming or moving
        % to new lib.
    elseif strcmp(oldName, 'testlib/blkX') && isempty(newName)
        % We are splitting the block into 2 different blocks. Hence, kept
        % newName empty in fwd table. Using one of the block param from its
        % instance data (which is name-value pair of all block params) to
        % decide how and what to divide.
        
        % Get the index of param we are interested in i.e. param X
        i = find(contains({instanceData.Name},'X'), true);
        
        % Based on its value, do block splitting
        switch (instanceData(i).Value)
            case 'op1'
                newName = 'newlibX/blkX';
                % Remove existing param or add new param or modify existing
                % params etc.
            case 'op2'
                newName = 'newlibY/blkX';
            otherwise
                newName = oldName;
        end
    end
    
    % Return new instance data and new block path
    outData.NewInstanceData = instanceData;
    outData.NewBlockPath = newName;
end

Разделите функциональность блока

Разделение функциональности блока включает добавление, удаление или изменение существующего параметра блока и добавления его с новым блоком. Разделять функциональность блока:

  1. Оставьте newName пустой аргумент.

  2. Получите индекс и значение параметра.

  3. Разделите блок на основе его значения.

  4. Возвратите NewBlockPath с обновленным InstanceData при необходимости.

Создайте псевдонимы параметра маски

Если вы переименовываете параметр маски, необходимо гарантировать что существующий MATLAB® скрипты, которые используют старые названия параметра, продолжают работать. Чтобы проверять совместимость, можно создать псевдоним для названия параметра маски. Псевдоним позволяет вам менять имя параметра маски в библиотечном блоке, не имея необходимость воссоздавать ссылки на блок в существующих моделях.

Рассмотрите маскированный блок, который содержит параметр Edit. Названием параметра маски для этого параметра Edit является p1.

MaskObj = Simulink.Mask.get(gcb)); 
hEdit = MaskObj.getParameter('p1');

hEdit= 
% MaskParameter with properties:

           Type: 'edit'
    TypeOptions: {0×1 cell}
           Name: 'p1'
         Prompt: 'p1'
          Value: '0'
       Evaluate: 'on'
        Tunable: 'on'
      NeverSave: 'off'
         Hidden: 'off'
        Enabled: 'on'
        Visible: 'on'
        ToolTip: 'on'
       Callback: ''
          Alias: ''

Заметьте, что параметр маски Edit не имеет псевдонима. Чтобы добавить псевдоним для параметра маски, установите значение для Alias свойство параметра маски.

MaskObj.Alias = 'pa'

Можно или использовать название параметра маски или псевдоним, чтобы сделать вызов функции на параметре маски. Например, можно или использовать set_param(gcb, 'p1, '10) (название параметра маски) или set_param(gcb, 'pa, '10) (псевдоним параметра маски), чтобы установить значение для параметра маски Edit.

Похожие темы

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