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

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

    Анализ терпит неудачу, потому что в коде есть переменная handle, которая может ссылаться на различные системные объекты в зависимости от значения 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. На вкладке Apps Simulink выберите Fixed-Point Tool.

  10. В Fixed-Point Tool, под New потока операций, выберите Iterative Fixed-Point Conversion.

  11. В разделе Range Collection Mode выберите Derived ranges.

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

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