При получении областей значений для модели, которая использует системный объект, аналитические сбои, если модель содержит переменные, которые могут относиться к нескольким объектам указателя. Следующий пример показывает, как реконфигурировать код так, чтобы Fixed-Point Tool мог вывести области значений для модели.
В этом примере анализ области значений первой модели ex_HandleVariableRefersToMultipleObjects
производит ошибку, потому что существует переменная в коде, который может относиться к различным системным объектам в зависимости от других условий. Модель, ex_HandleVariableRefersToSingleObject
является перезаписью первой модели с той же функциональностью, но Fixed-Point Tool может вывести области значений для модели.
Откройте первую модель. В командной строке 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);
Из меню Simulink® Analysis выберите Data Type Design> Fixed-Point Tool.
В Fixed-Point Tool, в разделе Prepare System панели инструментов, под System under design, выбирают ex_HandleVariableRefersToMultipleObjects
как систему, которую вы хотите преобразовать.
В разделе Collect Ranges панели инструментов выберите Derived Ranges.
Нажмите кнопку Collect Ranges.
Анализ перестал работать, потому что существует переменная указателя в коде, который может относиться к различным системным объектам в зависимости от значения 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
Закройте Fixed-Point Tool и модель ex_HandleVariableRefersToMultipleObjects
. Откройте модель ex_HandleVariableRefersToSingleObject
, которая содержит переписанный код. В командной строке MATLAB, введите:
ex_HandleVariableRefersToSingleObject
Из меню Simulink Analysis выберите Data Type Design> Fixed-Point Tool.
В разделе Collect Ranges панели инструментов выберите Derived Ranges.
Нажмите кнопку Collect Ranges.
На этот раз Fixed-Point Tool успешно выводит области значений для переменных, используемых в модели.