Устранение неполадок при анализе диапазона системных объектов

При выводе диапазонов для модели, использующей системный объект, анализ не выполняется, если модель содержит переменные, которые могут ссылаться на несколько объектов-дескрипторов. В следующем примере показано, как изменить конфигурацию кода так, чтобы инструмент Fixed-Point Tool мог получать диапазоны для модели.

В этом примере анализ диапазона первой модели ex_HandleVariableRefersToMultipleObjects приводит к ошибке, поскольку в коде имеется переменная, которая может ссылаться на различные системные объекты в зависимости от других условий. Модель, ex_HandleVariableRefersToSingleObject является перезаписью первой модели с той же функциональностью, но инструмент Fixed-Point Tool способен выводить диапазоны для модели.

  1. Откройте первую модель. В командной строке MATLAB ® введите:

    addpath(fullfile(docroot,'toolbox','fixpoint','examples'))
    ex_HandleVariableRefersToMultipleObjects
    

    Код в функциональном блоке MATLAB относится к пользовательскому системному объекту. fAddConstant.

    function y  = fcn(u, c)
    %#codegen
    
    persistent hSysObjAddTen
    persistent hSysObjAddNegTen
    persistent hSysObjForStep
    
    if isempty(hSysObjAddTen)
        hSysObjAddTen = fAddConstant(10);
    end
    
    if isempty(hSysObjAddNegTen)
        hSysObjAddNegTen = fAddConstant(-10);
    end
    
    if c > 0
        hSysObjForStep = hSysObjAddTen;
    else
        hSysObjForStep = hSysObjAddNegTen;
    end
    
    y = step(hSysObjForStep, u);

  2. На вкладке Приложения Simulink ® выберите Инструмент фиксированных точек.

  3. В инструменте «Фиксированная точка» в разделе «Новый рабочий процесс» выберите Iterative Fixed-Point Conversion.

  4. В инструменте «Фиксированная точка» в разделе «Система под проектированием» (SUD) выберите ex_HandleVariableRefersToMultipleObjects как система, которую требуется преобразовать.

  5. В разделе Режим сбора диапазонов выберите Производные диапазоны.

  6. Нажмите кнопку Собрать диапазоны.

    Не удалось выполнить анализ, поскольку в коде имеется переменная дескриптора, которая может ссылаться на различные системные объекты в зависимости от значения c.

  7. Код можно переписать в блоке MATLAB Function, чтобы инструмент Fixed-Point Tool мог выполнять деривацию диапазонов для системного объекта:

    function y  = fcn(u, c)
    %#codegen
    
    persistent hSysObjAddTen
    persistent hSysObjAddNegTen
    
    if isempty(hSysObjAddTen)
        hSysObjAddTen = fAddConstant(10);
    end
    if isempty(hSysObjAddNegTen)
        hSysObjAddNegTen = fAddConstant(-10);
    end
    
    if c > 0
        y = step(hSysObjAddTen, u);    
    else
        y = step(hSysObjAddNegTen, u);    
    end
    
  8. Закройте инструмент «Фиксированная точка» и ex_HandleVariableRefersToMultipleObjects модель. Откройте окно ex_HandleVariableRefersToSingleObject модель, которая содержит переписанный код. В командной строке MATLAB введите:

    ex_HandleVariableRefersToSingleObject

  9. На вкладке «Приложения Simulink» выберите инструмент «Фиксированная точка».

  10. В инструменте «Фиксированная точка» в разделе «Новый рабочий процесс» выберите Iterative Fixed-Point Conversion.

  11. В разделе Режим сбора диапазонов выберите Производные диапазоны.

  12. Нажмите кнопку Собрать диапазоны.

    На этот раз инструмент Fixed-Point Tool успешно выводит диапазоны для переменных, используемых в модели.