При получении областей значений для модели, которая использует системный объект, аналитические сбои, если модель содержит переменные, которые могут относиться к нескольким объектам указателя. Следующий пример показывает, как реконфигурировать код так, чтобы 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® Apps выберите Fixed-Point Tool.
В Fixed-Point Tool, под рабочим процессом New, выбирают Iterative Fixed-Point Conversion
.
В Fixed-Point Tool, под System Under Design (SUD), выбирают ex_HandleVariableRefersToMultipleObjects
как система вы хотите преобразовать.
Под Range Collection Mode выберите 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 Apps выберите Fixed-Point Tool.
В Fixed-Point Tool, под рабочим процессом New, выбирают Iterative Fixed-Point Conversion
.
Под Range Collection Mode выберите Derived ranges.
Нажмите кнопку Collect Ranges.
На этот раз Fixed-Point Tool успешно выводит области значений для переменных, используемых в модели.