Диагностируйте анализ области значений системных объектов

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

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

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

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

    Код в блоке MATLAB function отсылает к пользовательскому Системному объекту 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® Apps выберите Fixed-Point Tool.

  3. В Fixed-Point Tool, под рабочим процессом New, выбирают Iterative Fixed-Point Conversion.

  4. В Fixed-Point Tool, под System Under Design (SUD), выбирают ex_HandleVariableRefersToMultipleObjects как система вы хотите преобразовать.

  5. Под Range Collection Mode выберите Derived ranges.

  6. Нажмите кнопку Collect Ranges.

    Анализ перестал работать, потому что существует переменная указателя в коде, который может относиться к различным системным объектам в зависимости от значения 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. Закройте Fixed-Point Tool и ex_HandleVariableRefersToMultipleObjects модель. Откройте ex_HandleVariableRefersToSingleObject модель, которая содержит переписанный код. В командной строке MATLAB, введите:

    ex_HandleVariableRefersToSingleObject

  9. От вкладки Simulink Apps выберите Fixed-Point Tool.

  10. В Fixed-Point Tool, под рабочим процессом New, выбирают Iterative Fixed-Point Conversion.

  11. Под Range Collection Mode выберите Derived ranges.

  12. Нажмите кнопку Collect Ranges.

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