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