При выводе диапазонов для модели, использующей системный объект, анализ не выполняется, если модель содержит переменные, которые могут ссылаться на несколько объектов-дескрипторов. В следующем примере показано, как изменить конфигурацию кода так, чтобы инструмент Fixed-Point Tool мог получать диапазоны для модели.
В этом примере анализ диапазона первой модели ex_HandleVariableRefersToMultipleObjects приводит к ошибке, поскольку в коде имеется переменная, которая может ссылаться на различные системные объекты в зависимости от других условий. Модель, ex_HandleVariableRefersToSingleObject является перезаписью первой модели с той же функциональностью, но инструмент Fixed-Point Tool способен выводить диапазоны для модели.
Откройте первую модель. В командной строке 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);
На вкладке Приложения Simulink ® выберите Инструмент фиксированных точек.
В инструменте «Фиксированная точка» в разделе «Новый рабочий процесс» выберите Iterative Fixed-Point Conversion.
В инструменте «Фиксированная точка» в разделе «Система под проектированием» (SUD) выберите ex_HandleVariableRefersToMultipleObjects как система, которую требуется преобразовать.
В разделе Режим сбора диапазонов выберите Производные диапазоны.
Нажмите кнопку Собрать диапазоны.
Не удалось выполнить анализ, поскольку в коде имеется переменная дескриптора, которая может ссылаться на различные системные объекты в зависимости от значения c.
Код можно переписать в блоке 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
Закройте инструмент «Фиксированная точка» и ex_HandleVariableRefersToMultipleObjects модель. Откройте окно ex_HandleVariableRefersToSingleObject модель, которая содержит переписанный код. В командной строке MATLAB введите:
ex_HandleVariableRefersToSingleObject
На вкладке «Приложения Simulink» выберите инструмент «Фиксированная точка».
В инструменте «Фиксированная точка» в разделе «Новый рабочий процесс» выберите Iterative Fixed-Point Conversion.
В разделе Режим сбора диапазонов выберите Производные диапазоны.
Нажмите кнопку Собрать диапазоны.
На этот раз инструмент Fixed-Point Tool успешно выводит диапазоны для переменных, используемых в модели.
