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

При получении областей значений для модели, которая использует системный объект, аналитические сбои, если модель содержит переменные, которые могут относиться к нескольким объектам указателя. Следующий пример показывает, как реконфигурировать код так, чтобы 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® Analysis выберите Data Type Design> Fixed-Point Tool.

  3. В Fixed-Point Tool, в разделе Prepare System панели инструментов, под System under design, выбирают ex_HandleVariableRefersToMultipleObjects как систему, которую вы хотите преобразовать.

  4. В разделе Collect Ranges панели инструментов выберите Derived Ranges.

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

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

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

    ex_HandleVariableRefersToSingleObject

  8. Из меню Simulink Analysis выберите Data Type Design> Fixed-Point Tool.

  9. В разделе Collect Ranges панели инструментов выберите Derived Ranges.

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

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