В этом учебном пособии вы узнаете, как:
Функциональный блок MATLAB используется для добавления функций MATLAB ® в модели Simulink ® для моделирования, моделирования и развертывания на встраиваемых процессорах.
Эта возможность полезна для алгоритмов кодирования, которые лучше изложены в текстовом языке MATLAB, чем в графическом языке Simulink.
Использовать coder.extrinsic вызов кода MATLAB из функционального блока MATLAB.
Эта возможность позволяет выполнять быстрое создание прототипов. Можно вызвать существующий код MATLAB из Simulink без необходимости использования этого кода для создания кода.
Перед созданием кода убедитесь, что существующий код MATLAB подходит для создания кода.
Перед созданием кода необходимо подготовить код.
Укажите входные данные переменного размера при создании кода.
Для завершения этого учебного пособия необходимо ознакомиться с программным обеспечением MATLAB. Также следует понимать, как создавать и моделировать базовую модель Simulink.
Для завершения этого учебного пособия необходимо установить следующие продукты:
MATLAB
MATLAB Coder™
Simulink
Симулинк-кодер
Компилятор C
Список поддерживаемых компиляторов см. в разделе Поддерживаемые компиляторы.
Перед созданием кода C необходимо настроить компилятор C. См. раздел Настройка компилятора C.
Инструкции по установке продуктов MathWorks ® см. в документации по установке MATLAB для вашей платформы. Если вы установили MATLAB и хотите проверить, какие другие продукты MathWorks установлены, введитеver в окне команд MATLAB.
В этом разделе описывается пример, используемый в учебном пособии. Для завершения учебного пособия не обязательно знакомиться с алгоритмом.
В данном учебном пособии используется фильтр Калмана для оценки положения объекта, перемещающегося в двумерном пространстве, по ряду шумных входных данных на основе прошлых положений. Вектор положения имеет две составляющие, x и y, указывая его горизонтальные и вертикальные координаты.
Фильтры Калмана имеют широкий спектр применений, включая управление, обработку сигналов и изображений; РЛС и гидролокатор; и финансовое моделирование. Они являются рекурсивными фильтрами, которые оценивают состояние линейной динамической системы по ряду неполных или шумных измерений. Алгоритм фильтра Калмана опирается на представление состояния-пространства фильтров и использует набор переменных, хранящихся в векторе состояния, для полной характеристики поведения системы. Он линейно и рекурсивно обновляет вектор состояния, используя матрицу перехода состояния и оценку шума процесса.
В этом разделе описывается алгоритм фильтра Калмана и он реализован в версии MATLAB фильтра, поставляемого с данным учебным пособием.
Алгоритм предсказывает положение движущегося объекта на основе его прошлых положений с помощью оценщика фильтра Калмана. Он оценивает текущее положение путем обновления вектора состояния Калмана, который включает в себя положение (x и y), скорость (Vx и Vy) и ускорение (Ax и Ay) движущегося объекта. Вектор состояния Калмана, x_est, является постоянной переменной.
% Initial conditions
persistent x_est p_est
if isempty(x_est)
x_est = zeros(6, 1);
p_est = zeros(6, 6);
endx_est инициализирован в пустой 6x1 и обновляется при каждом использовании фильтра.Фильтр Калмана использует законы движения для оценки нового состояния:
Ax.dtVy = Vy0 + Ay.dt
Эти законы движения фиксируются в матрице перехода состояния A, которая является матрицей, содержащей значения коэффициентов x, y, Vx, Vy, Ax, и Ay.
% Initialize state transition matrix
dt=1;
A=[ 1 0 dt 0 0 0;...
0 1 0 dt 0 0;...
0 0 1 0 dt 0;...
0 0 0 1 0 dt;...
0 0 0 0 1 0 ;...
0 0 0 0 0 1 ];Процесс фильтрации имеет две фазы:
Прогнозируемое состояние и ковариация
Фильтр Калмана использует предварительно оцененное состояние, x_est, для прогнозирования текущего состояния, x_prd. Прогнозируемое состояние и ковариацию рассчитывают в:
% Predicted state and covariance x_prd = A * x_est; p_prd = A * p_est * A' + Q;
Оценка
Фильтр также использует текущее измерение, zи прогнозируемое состояние, x_prd, для оценки более точного приближения текущего состояния. Оценочное состояние и ковариация вычисляются в:
% Measurement matrix H = [ 1 0 0 0 0 0; 0 1 0 0 0 0 ]; Q = eye(6); R = 1000 * eye(2);
% Estimation S = H * p_prd' * H' + R; B = H * p_prd'; klm_gain = (S \ B)'; % Estimated state and covariance x_est = x_prd + klm_gain * (z - H * x_prd); p_est = p_prd - klm_gain * H * p_prd; % Compute the estimated measurements y = H * x_est;
Хайкин, Саймон. Адаптивная теория фильтров. Река Верхнее Седло, Нью-Джерси: Прентис-Холл, Инк., 1996.
В учебном пособии используются следующие файлы:
Файлы модели Simulink для каждого шага учебного пособия.
Пример файлов кода MATLAB для каждого шага учебного пособия.
В этом учебном пособии рассматривается работа с моделями Simulink, которые вызывают файлы MATLAB, содержащие алгоритм фильтра Калмана.
MAT-файл, содержащий пример входных данных.
Файл MATLAB для печати.
Файлы учебного пособия доступны в следующей папке: docroot\toolbox\simulink\examples\kalman. Для запуска учебного пособия необходимо скопировать эти файлы в локальную папку. Инструкции см. в разделе Локальное копирование файлов.
| Напечатать | Имя | Описание |
|---|---|---|
| Файлы функций MATLAB | ex_kalman01 | Базовая реализация MATLAB скалярного фильтра Калмана. |
ex_kalman02 | Версия исходного алгоритма, пригодного для генерации кода. | |
ex_kalman03 | Версия фильтра Калмана, пригодная для генерации кода и использования с входами на основе кадров и пакетов. | |
ex_kalman04 | Отключено вложение для создания кода. | |
| Файлы модели Simulink | ex_kalman00 | Модель Simulink без функционального блока MATLAB. |
ex_kalman11 | Завершение модели Simulink с блоком MATLAB Function для скалярного фильтра Калмана. | |
ex_kalman22 | Модель Simulink с функциональным блоком MATLAB для фильтра Калмана, который принимает входные данные фиксированного размера (на основе кадра). | |
ex_kalman33 | Модель Simulink с функциональным блоком MATLAB для фильтра Калмана, который принимает входные данные переменного размера (на основе пакетов). | |
ex_kalman44 | Модель Simulink для вызова ex_kalman04.m, которая была выключена. | |
| Файл данных MATLAB | position | Содержит входные данные, используемые алгоритмом. |
| Файлы печати | plot_trajectory | Строит график траектории объекта и расчетного положения фильтра Калмана. |
Скопируйте файлы учебного пособия в локальную рабочую папку:
Создание локального solutions папка, например, c:\simulink\kalman\solutions.
Изменение на docroot\toolbox\simulink\examples папка. В командной строке MATLAB введите:
cd(fullfile(docroot, 'toolbox', 'simulink', 'examples'))
Копирование содержимого kalman вложенная папка в локальную папку solutions , указывая полный путь к папке solutions папка:
copyfile('kalman', 'solutions')Например:
copyfile('kalman', 'c:\simulink\kalman\solutions')Ваш solutions теперь содержит полный набор решений для учебного пособия. Если не требуется выполнять шаги для каждой задачи в учебном пособии, можно просмотреть решения, чтобы увидеть, как должен выглядеть код.
Создание локального work папка, например, c:\simulink\kalman\work.
Скопируйте следующие файлы из solutions папку в вашу work папка.
ex_kalman01
ex_kalman00
position
plot_trajectory
Ваш work теперь содержит все файлы, необходимые для начала работы с учебным пособием.
Для создания функционального блока MATLAB требуется поддерживаемый компилятор. MATLAB автоматически выбирает компилятор по умолчанию. Если в системе установлено несколько компиляторов, поддерживаемых MATLAB, можно изменить значение по умолчанию с помощью mex -setup команда. См. раздел Изменение компилятора по умолчанию.
Сначала изучите ex_kalman00 модель, поставляемая с учебным пособием, чтобы понять проблему, которую вы пытаетесь решить с помощью фильтра Калмана.
Откройте окно ex_kalman00 модель в Simulink:
Установите текущую папку MATLAB в папку, содержащую рабочие файлы для данного учебного пособия. В командной строке MATLAB введите:
cd work
work - полный путь к папке, содержащей файлы.В командной строке MATLAB введите:
ex_kalman00
Эта модель является неполной моделью для демонстрации интеграции кода MATLAB с Simulink. Полная модель: ex_kalman11, который также поставляется с данным учебным пособием.
Функция обратного вызова модели InitFcn. Модель использует эту функцию обратного вызова для:
Загрузите данные о положении из MAT-файла.
Настройка данных, используемых блоком генератора индекса, который обеспечивает второй вход в блок селектора.
Для просмотра этого обратного вызова:
На вкладке Моделирование (Modeling) выберите Параметры модели (Model Settings) > Свойства модели (Model Properties).
Выберите вкладку Обратные вызовы.
Выбрать InitFcn на панели Обратные вызовы модели (Model callbacks).
Появится обратный вызов.
load position.mat; [R,C]=size(position); idx=(1:C)'; t=idx-1;
Исходные блоки. Модель использует два блока Source для предоставления позиционных данных и скалярного индекса блоку Selector.
Блок селектора. Модель использует блок селектора, который выбирает элементы своего входного сигнала и генерирует выходной сигнал на основе его индексного ввода и параметров индексного параметра. Изменяя конфигурацию этого блока, можно генерировать сигналы различных размеров.
Для просмотра настроек блока селектора дважды щелкните блок селектора, чтобы просмотреть параметры функционального блока.
В этой модели параметр Index Option для первого порта имеет значение Select all и для второго порта Index vector (port). Поскольку входные данные являются 2 x 310 матрица положения и приращение индексных данных от 1 кому 310, блок селектора просто выводит один 2x1 вывод в каждый момент времени выборки.
Функциональный блок MATLAB. Модель использует функциональный блок MATLAB для построения графика траектории объекта и расчетного положения фильтра Калмана. Эта функция:
Во-первых, объявляет figure, hold, и plot_trajectory функции как внешние, поскольку эти функции визуализации MATLAB не поддерживаются для генерации кода. При вызове неподдерживаемой функции MATLAB необходимо объявить ее внешней, чтобы MATLAB мог выполнить ее, но не пытался создать для нее код.
Создает окно фигуры и удерживает его в течение всего периода моделирования. В противном случае для каждого образца времени появится новое окно рисунка.
Вызывает plot_trajectory функция, отображающая траекторию объекта и расчетное положение фильтра Калмана.
Время остановки моделирования. Время остановки моделирования составляет 309, поскольку вход в фильтр является вектором, содержащим 310 элементы и Simulink используют индексацию на основе нуля.
Чтобы изменить модель и код самостоятельно, выполните упражнения в этом разделе. В противном случае откройте предоставленную модель ex_kalman11 в вашем solutions для просмотра измененной модели.
Для целей данного учебного пособия необходимо добавить функциональный блок MATLAB в ex_kalman00.mdl модель, поставляемая с учебным пособием. Вам придется разработать свой собственный стенд, начиная с пустой модели Simulink.
Добавление функционального блока MATLAB. Добавление функционального блока MATLAB к ex_kalman00 модель:
Открытый ex_kalman00 в Simulink.
ex_kalman00
Добавьте в модель функциональный блок MATLAB:
В командной строке MATLAB введите slLibraryBrowser для открытия обозревателя библиотеки Simulink.
В списке библиотек Simulink выберите User-Defined Functions библиотека.
Щелкните функциональный блок MATLAB и перетащите его в ex_kalman00 модель. Поместите блок чуть выше красной текстовой аннотации, которая читает Place MATLAB Function Block here.
Удаление красных текстовых аннотаций из модели.
Сохранить модель в текущей папке как ex_kalman11.
Вызов кода MATLAB из функционального блока MATLAB. Для вызова кода MATLAB из функционального блока MATLAB:
Дважды щелкните по функциональному блоку MATLAB, чтобы открыть редактор функциональных блоков MATLAB.
Удалите код по умолчанию, отображаемый в редакторе.
Скопируйте следующий код в функциональный блок MATLAB.
function y = kalman(u) %#codegen y = ex_kalman01(u);
Сохраните модель.
Подключение ввода и вывода функционального блока MATLAB
Подключите вход и выход функционального блока MATLAB таким образом, чтобы модель выглядела следующим образом.

Сохраните модель.
Для моделирования модели:
В окне Модель симулятора (Simulink model) щелкните Выполнить (Run).
Когда Simulink запускает модель, она отображает траекторию объекта синим цветом, а оценочное положение фильтра Калмана - зеленым. Первоначально можно увидеть, что для согласования расчетного положения с фактическим положением объекта требуется короткое время. Затем происходит три резких сдвига в положении - каждый раз фильтр Калмана корректирует и отслеживает объект после нескольких итераций.

Моделирование прекращается.
Вы доказали, что ваш алгоритм MATLAB работает в Simulink. Теперь можно изменить фильтр для принятия ввода фиксированного размера, как описано в разделе Изменение фильтра для принятия ввода фиксированного размера.
Фильтр, над которым вы работали до сих пор в этом учебном пособии, использует простой пакетный процесс, который принимает по одному входу за раз, поэтому функцию необходимо вызывать повторно для каждого ввода. В этой части учебного пособия вы узнаете, как изменить алгоритм, чтобы принять ввод фиксированного размера, что делает алгоритм подходящим для обработки на основе кадров. Затем модель модифицируется для предоставления входных данных в виде кадров фиксированного размера и вызывается фильтр, проходящий в данных по одному кадру за раз.
Изменение кода MATLAB. Чтобы изменить код самостоятельно, выполните упражнения в этом разделе. В противном случае откройте предоставленный файл ex_kalman03.m в вашем solutions для просмотра измененного алгоритма.
Теперь можно изменить алгоритм для обработки вектора, содержащего несколько входных данных. Необходимо найти длину вектора и вызвать код фильтра для каждого элемента вектора по очереди. Для этого вызовите алгоритм фильтра в for цикл.
Открытый ex_kalman02.m в редакторе MATLAB. В командной строке MATLAB введите:
edit ex_kalman02.m
Добавить for закольцовывание кода фильтра.
Перед комментарием:
% Predicted state and covariance
for i=1:size(z,2)
После:
% Compute the estimated measurements y = H * x_est;
end
Выберите код между for оператор и оператор end, щелкните правой кнопкой мыши, чтобы открыть контекстное меню, и выберите «Смарт-отступы» для отступа кода.
Теперь код фильтра должен выглядеть следующим образом:
for i=1:size(z,2) % Predicted state and covariance x_prd = A * x_est; p_prd = A * p_est * A' + Q; % Estimation S = H * p_prd' * H' + R; B = H * p_prd'; klm_gain = (S \ B)'; % Estimated state and covariance x_est = x_prd + klm_gain * (z - H * x_prd); p_est = p_prd - klm_gain * H * p_prd; % Compute the estimated measurements y = H * x_est; end
Измените строку, которая вычисляет оценочное состояние и ковариацию, чтобы использовать ith элемент входа z.
Изменение:
x_est = x_prd + klm_gain * (z - H * x_prd);
x_est = x_prd + klm_gain * (z(1:2,i) - H * x_prd);
Измените строку, которая вычисляет расчетные измерения, чтобы добавить результат к ith элемент выходного сигнала y.
Изменение:
y = H * x_est;
y(:,i) = H * x_est;
Индикатор сообщения анализатора кода в правом верхнем углу становится оранжевым, указывая, что анализатор кода обнаружил предупреждения. Анализатор кода подчеркивает код-нарушитель оранжевым цветом и размещает оранжевый маркер справа.
Наведите указатель на оранжевый маркер для просмотра информации об ошибке.
Анализатор кода обнаруживает, что y должен быть полностью определен перед его вложенным сценарием, и невозможно увеличить переменные с помощью индексирования в сгенерированном коде.
Чтобы устранить это предупреждение, предварительно выделите память для вывода y, который имеет тот же размер, что и вход z. Добавить этот код перед for цикл.
% Pre-allocate output signal: y=zeros(size(z));
Оранжевый маркер исчезает, а индикатор сообщения анализатора кода в правом верхнем крае кода становится зеленым, что указывает на исправление всех ошибок и предупреждений, обнаруженных анализатором кода.
Измените имя функции на ex_kalman03 и сохраните файл как ex_kalman03.m в текущей папке.
Вы готовы приступить к выполнению следующей задачи в учебном пособии «Изменение модели для вызова обновленного алгоритма».
Изменение модели для вызова обновленного алгоритма. Чтобы изменить модель самостоятельно, выполните упражнения в этом разделе. В противном случае откройте предоставленную модель ex_kalman22.mdl в вашем solutions для просмотра измененной модели.
Затем обновите модель, чтобы ввести данные в виде кадров фиксированного размера, и вызовите ex_kalman03 прохождение в данных по одному кадру за раз.
Открытый ex_kalman11 модель в Simulink.
ex_kalman11
Дважды щелкните по функциональному блоку MATLAB, чтобы открыть редактор функциональных блоков MATLAB.
Замените код, который вызывает ex_kalman02 с вызовом ex_kalman03.
function y = kalman(u) %#codegen y = ex_kalman03(u);
Закройте редактор.
Изменение InitFcn обратный вызов:
На вкладке Моделирование (Modeling) выберите Параметры модели (Model Settings) > Свойства модели (Model Properties).
Откроется диалоговое окно Свойства модели (Model Properties).
В этом диалоговом окне выберите вкладку Обратные вызовы.
Выбрать InitFcn на панели Обратные вызовы модели (Model callbacks).
Замените существующий обратный вызов на:
load position.mat; [R,C]=size(position); FRAME_SIZE=5; idx=(1:FRAME_SIZE:C)'; LEN=length(idx); t=(1:LEN)'-1;
5и индекс для приращения на 5.Щелкните Применить (Apply) и закройте диалоговое окно Свойства модели (Model Properties).
Обновите блок выбора, чтобы использовать правильные индексы.
Дважды щелкните блок выбора для просмотра параметров функционального блока.
Откроется диалоговое окно Параметры функционального блока (Function Block Parameters).
Установите второй параметр индекса в значение Starting index (port).
Задайте для параметра «Размер вывода» для второго ввода значение FRAME_SIZEнажмите «Применить» и закройте диалоговое окно.
Теперь параметр Index Option для первого порта: Select all и для второго порта Starting index (port). Потому что индекс увеличивается на 5 каждый раз выборки, и размер вывода 5блок селектора выводит 2x5 вывод в каждый момент времени выборки.
Изменение времени остановки моделирования модели на 61. Теперь размер кадра 5Таким образом, моделирование завершается через пятую часть времени выборки.
В окне Модель симуляции (Simulink model) на вкладке Моделирование (Modeling) щелкните Параметры модели (Model Settings).
На левой панели диалогового окна Параметры конфигурации (Configuration Parameters) выберите Решатель (Solver).
На правой панели установите для параметра Время остановки значение 61.
Нажмите кнопку Применить (Apply) и закройте диалоговое окно.
Сохранить модель как ex_kalman22.mdl.
Тестирование измененного алгоритма. Для моделирования модели:
В окне Модель Simulink (Simulink model) щелкните Выполнить (Run).
При запуске модели модулем Simulink траектория объекта отображается синим цветом, а расчетное положение фильтра Калмана - зеленым, как и раньше при использовании пакетного фильтра.
Моделирование прекращается.
Вы доказали, что ваш алгоритм принимает сигнал фиксированного размера. Теперь вы готовы к следующей задаче «Использование фильтра для принятия ввода переменного размера».
В этой части учебного пособия рассматривается задание данных переменного размера в модели Simulink. Затем вы тестируете алгоритм фильтра Калмана с входами переменного размера и видите, что алгоритм подходит для обработки пакетов данных различного размера. Дополнительные сведения об использовании данных переменного размера в Simulink см. в разделе Основы сигналов переменного размера.
Обновление модели для использования входных данных переменного размера. Чтобы изменить модель самостоятельно, выполните упражнения в этом разделе. В противном случае откройте предоставленную модель ex_kalman33.mdl в вашем solutions для просмотра измененной модели.
Открытый ex_kalman22.mdl в Simulink.
ex_kalman22
Изменение InitFcn обратный вызов:
На вкладке Моделирование (Modeling) выберите Параметры модели (Model Settings) > Свойства модели (Model Properties).
Откроется диалоговое окно Свойства модели (Model Properties).
Выберите вкладку Обратные вызовы.
Выбрать InitFcn на панели Обратные вызовы модели (Model callbacks).
Замените существующий обратный вызов на:
load position.mat;
idx=[ 1 1 ;2 3 ;4 6 ;7 10 ;11 15 ;16 30 ;
31 70 ;71 100 ;101 200 ;201 250 ;251 310];
LEN=length(idx);
t=(0:1:LEN-1)';101 кому 200, содержит 100 элементов.Щелкните Применить (Apply) и закройте диалоговое окно Свойства модели (Model Properties).
Обновите блок выбора, чтобы использовать правильные индексы.
Дважды щелкните блок выбора для просмотра параметров функционального блока.
Откроется диалоговое окно Параметры функционального блока (Function Block Parameters).
Установите второй параметр индекса в значение Starting and ending indices (port)затем нажмите кнопку «Применить» и закройте диалоговое окно.
Этот параметр означает, что вход в порт индекса определяет начальный и конечный индексы для входа в каждый момент времени выборки. Поскольку ввод индекса определяет различные начальный и конечный индексы в каждый момент времени выборки, блок селектора выдает сигнал переменного размера по мере выполнения моделирования.
Использование диспетчера портов и данных для установки ввода функции MATLAB x и выходные данные y в виде данных переменного размера.
Дважды щелкните по функциональному блоку MATLAB, чтобы открыть редактор функциональных блоков MATLAB.
В меню редактора выберите «Редактировать данные».
На левой панели «Ports and Data Manager» выберите входные данные. u.
Диспетчер портов и данных отображает информацию о u в правой панели.
На вкладке Общие (General) установите флажок Размер переменной (Variable size) и нажмите кнопку Применить (Apply).
На левой панели выберите вывод y.
На вкладке Общие:
Задать размер y кому [2 100] для указания матрицы 2-D, где верхние границы 2 для первого измерения и 100 для второго, который является максимальным входным размером, указанным в InitFcn обратный вызов.
Установите флажок Размер переменной.
Нажмите кнопку «Применить».
Закройте диспетчер портов и данных.
Теперь выполните то же самое для другого функционального блока MATLAB. Использование диспетчера портов и данных для установки входных данных блока визуализации y и z в виде данных переменного размера.
Дважды щелкните блок визуализации, чтобы открыть редактор функциональных блоков MATLAB.
В меню редактора выберите «Редактировать данные».
На левой панели «Ports and Data Manager» выберите входные данные. y.
На вкладке Общие (General) установите флажок Размер переменной (Variable size) и нажмите кнопку Применить (Apply).
На левой панели выберите входные данные. z.
На вкладке Общие (General) установите флажок Размер переменной (Variable size) и нажмите кнопку Применить (Apply).
Закройте диспетчер портов и данных.
Изменение времени остановки моделирования модели на 10. На этот раз фильтр обрабатывает один из одиннадцати входов различных размеров каждый раз выборки.
Сохранить модель как ex_kalman33.mdl.
Тестирование измененной модели. Для моделирования модели:
В окне Модель симулятора (Simulink model) щелкните Выполнить (Run).
Когда Simulink запускает модель, он отображает траекторию объекта синим цветом, а фильтр Калмана оценивает положение зеленым, как и раньше.
Обратите внимание, что сигнальные линии между блоком селектора и блоками отслеживания и визуализации изменяются, чтобы показать, что эти сигналы имеют переменный размер.
Моделирование прекращается.
Успешно создан алгоритм, принимающий входные данные переменного размера. Далее описывается отладка функционального блока MATLAB, как описано в разделе Отладка функционального блока MATLAB.
Отладку функционального блока MATLAB можно выполнить так же, как отладку функции в MATLAB.
Дважды щелкните блок функции MATLAB, вызывающий фильтр Калмана, чтобы открыть редактор функциональных блоков MATLAB.
В редакторе щелкните символ тире (-) в левом поле строки:
y = kalman03(u);
В поле этой линии появляется небольшой красный шарик, указывающий на то, что вы установили точку останова.
В окне Модель симулятора (Simulink model) щелкните Выполнить (Run).
Моделирование приостанавливается, когда выполнение достигает точки останова, и в левом поле появляется небольшая зеленая стрелка.
Наведите указатель на переменную u.
Значение u появляется рядом с указателем.
В меню Редактор функциональных блоков MATLAB выберите Шаг в.
kalman03.m файл открывается в редакторе, и теперь можно перейти к этому коду с помощью команд Шаг (Step), Шаг в (Step In) и Шаг вне (Step Out).
Выберите «Выйти».
kalman03.m файл закрывается, и в редакторе снова появляется блоковый код функции MATLAB.
Наведите указатель на выходную переменную y.
Теперь можно увидеть значение y.
Щелкните красный шарик, чтобы удалить точку останова.
В меню Редактор функциональных блоков MATLAB выберите Выход из отладки.
Закройте редактор.
Закройте окно рисунка.
Теперь вы готовы к следующей задаче - Генерирование кода C.
Вы доказали, что ваш алгоритм работает в Simulink. Затем создается код C/C + + для модели. Для создания кода требуется Simulink Coder.
Примечание
Перед созданием кода необходимо проверить, подходит ли код MATLAB для создания кода. При вызове кода MATLAB в качестве внешней функции перед созданием кода необходимо удалить внешние вызовы.
Переименование функционального блока MATLAB в Tracking. Чтобы переименовать блок, дважды щелкните аннотацию MATLAB Function под функциональным блоком MATLAB и заменить текст на Tracking.
При создании кода для функционального блока MATLAB кодер Simulink использует имя блока в сгенерированном коде. Рекомендуется использовать значимое имя.
Перед созданием кода убедитесь, что Simulink Coder создает отчет о создании кода. Этот HTML-отчет предоставляет простой доступ к списку созданных файлов с сводкой настроек конфигурации, используемых для создания кода.
В окне Модель симуляции (Simulink model) на вкладке Моделирование (Modeling) щелкните Параметры модели (Model Settings).
Откроется диалоговое окно Параметры конфигурации (Configuration Parameters).
На левой панели диалогового окна «Параметры конфигурации» выберите «Отчет» в разделе «Создание кода».
На правой панели выберите Создать отчет о создании кода и Открыть отчет автоматически.
Нажмите кнопку Применить (Apply) и закройте диалоговое окно Параметры конфигурации (Configuration Parameters).
Сохраните модель.
Чтобы создать код для блока отслеживания:
Щелкните правой кнопкой мыши блок «Tracking» и выберите «C/C + + Code» > «Build Selected Subsystem».
В окне Build code for Subsystem щелкните Build. Дополнительные сведения см. в разделе Создание кода и исполняемых файлов для отдельных подсистем (Simulink Coder).
Программное обеспечение Simulink генерирует ошибку, информирующую о невозможности регистрации сигналов переменного размера в виде массивов. Необходимо изменить формат данных, сохраненных в рабочей области MATLAB. Чтобы изменить этот формат:
В окне Модель симуляции (Simulink model) на вкладке Моделирование (Modeling) щелкните Параметры модели (Model Settings).
Откроется диалоговое окно Параметры конфигурации (Configuration Parameters).
На левой панели диалогового окна «Параметры конфигурации» выберите Импорт/экспорт данных и задайте для параметра «Формат» значение Structure with time.
Записанные данные теперь представляют собой структуру, которая имеет два поля: поле времени и поле сигналов, что позволяет Simulink регистрировать сигналы переменного размера.
Нажмите кнопку Применить (Apply) и закройте диалоговое окно Параметры конфигурации (Configuration Parameters).
Сохраните модель.
Повторить шаг 3 для создания кода для блока отслеживания.
Программное обеспечение Simulink Coder генерирует код C для блока и запускает отчет о создании кода.
Дополнительные сведения об использовании отчета по генерации кода см. в разделе Отчеты по генерации кода (Simulink Coder).
На левой панели отчета о создании кода нажмите кнопку Tracking.c ссылка для просмотра сгенерированного кода C. Следует отметить, что в коде, сгенерированном для функционального блока MATLAB, Tracking, может не быть отдельного кода функции для ex_kalman03 функция, поскольку включение функции включено по умолчанию.
Измените алгоритм фильтра, чтобы отключить встраивание:
В ex_kalman03.mпосле объявления функции добавить:
coder.inline('never');Измените имя функции на ex_kalman04 и сохраните файл как ex_kalman04.m в текущей папке.
В вашем ex_kalman33 дважды щелкните на блоке «Отслеживание».
Откроется редактор функциональных блоков MATLAB.
Изменение вызова алгоритма фильтра для вызова ex_kalman04.
function y = kalman(u) %#codegen y = ex_kalman04(u);
Сохранить модель как ex_kalman44.mdl.
Создайте и проверьте код C.
Повторите шаг 3.
На левой панели отчета о создании кода нажмите кнопку Tracking.c ссылка для просмотра сгенерированного кода C.
Проверьте сгенерированный код C для ex_kalman04 функция.
/* Forward declaration for local functions */
static void Tracking_ex_kalman04(const real_T z_data[620], const int32_T
z_sizes[2], real_T y_data[620], int32_T y_sizes[2]);
/* Function for MATLAB Function Block: '<Root>/Tracking' */
static void Tracking_ex_kalman04(const real_T z_data[620], const int32_T 48
z_sizes[2], real_T y_data[620], int32_T y_sizes[2]) |
Создайте резервную копию кода MATLAB перед его изменением.
Выберите соглашение об именовании файлов и часто сохраняйте промежуточные версии. Например, в этом учебном пособии используется двухзначный суффикс для различения различных версий алгоритма фильтра.
В целях моделирования перед созданием кода вызовите код MATLAB с помощью coder.extrinsic чтобы проверить, подходит ли алгоритм для использования в Simulink. Эта практика обеспечивает следующие преимущества:
Код MATLAB не должен использоваться для создания кода.
Код MATLAB можно отладить в MATLAB при вызове из Simulink.
Создайте отчет о создании кода Simulink Coder. Этот HTML-отчет предоставляет простой доступ к списку созданных файлов с сводкой настроек конфигурации, используемых для создания кода.