matlab генерация c кода
Документация
Сгенерируйте код С из кода MATLAB
Этот пример использует:
Этот пример генерирует код С от Построения Синусоидальный Сигнал Используя Высокий энергетический Содействующий пример БПФ и создает исполняемый файл из сгенерированного кода.
Вот код MATLAB для этого примера:
Настройте компилятор
Вспыхните вычислительная часть алгоритма в функцию MATLAB
Сделайте код подходящим для генерации кода
Прежде чем вы сгенерируете код, необходимо подготовить код MATLAB к генерации кода.
Проверяйте проблемы во время проектирования
Анализатор кода обнаруживает проблемы кодирования во время проектирования, когда вы вводите код. Чтобы включить анализатор кода, необходимо добавить %#codegen прагма к вашему файлу MATLAB.
Инструмент готовности генерации кода экранирует код MATLAB на функции, которые не поддерживаются для генерации кода. Один из способов получить доступ к этому инструменту путем щелчка правой кнопкой по файлу MATLAB в его текущей папке. Работа инструмента генерации кода GenerateSignalWithHighEnergyFFTCoeffs.m не находит проблем.
Проверяйте проблемы во время генерации кода
Прежде чем вы сгенерируете код С, гарантируете, что код MATLAB успешно генерирует MEX-функцию. codegen (MATLAB Coder) команда раньше генерировала MEX-функцию, обнаруживает любые ошибки, которые предотвращают код для того, чтобы подойти для генерации кода.
Запущенный codegen on GenerateSignalWithHighEnergyFFTCoeffs.m функция.
Следующее сообщение появляется в командной строке MATLAB:
Проверяйте проблемы во время выполнения
Запустите сгенерированную MEX-функцию, чтобы видеть, существуют ли какие-либо проблемы во время выполнения, о которых сообщают. Для этого замена
Обвязка теперь похожа:
Код запускается успешно, указывая, что нет никаких ошибок времени выполнения.
Сравните MEX-функцию с симуляцией
Заметьте, что обвязка запускается намного быстрее с MEX-функцией по сравнению с регулярной функцией. Причина генерации MEX-функции не только, чтобы обнаружить генерацию кода и проблемы во время выполнения, но также и ускорить определенные части вашего алгоритма. Для примера смотрите Ускорение алгоритма Обработки сигналов в MATLAB.
Результаты соответствуют очень тесно, подтверждая, что генерация кода успешна.
Сгенерируйте независимый исполняемый файл
Регистрируйте все 1 000 систем координат входа и восстановленного сигнала, и количество коэффициентов БПФ раньше восстанавливало каждую систему координат сигнала. Запишите все эти данные в двоичный файл под названием data.bin использование dsp.BinaryFileWriter Система object™. Этот пример регистрирует количество коэффициентов, которые являются скалярными значениями как первый элемент каждой системы координат входного сигнала и восстановленного сигнала. Данные, которые будут записаны, имеют формат кадра M = L + 1 и имеют формат, который выглядит так фигура.
N является количеством коэффициентов БПФ, которые представляют 99,99% энергии сигнала текущего входного кадра. Метаданные двоичного файла указывают эту информацию. Выпустите средство записи двоичного файла и закройте двоичный файл в конце.
Следующий шаг в генерации исполняемого файла C должен создать a coder.config объект для исполняемого файла и обеспечивает a main.c функционируйте к этому объекту.
Вот то, как reconstructSignalTestbench_Main.c функция ищет этот пример.
Установите CustomInclude свойство настройки возражает, чтобы задать местоположение основного файла. В этом примере местоположение является текущей папкой.
Сгенерируйте исполняемый файл C путем выполнения следующей команды в командной строке MATLAB:
Считайте и проверьте данные о двоичном файле
Прототип заголовка должен иметь структуру, похожую на структуру заголовка, записанную в файл. Считайте данные как два канала.
Настройка matlab для генерации C/C++ кода из m файлов в Windows
Matlab программа с невероятными возможностями, но как и любое прикладное приложение, рано или поздно программу созданную в матлабе нужно переписать для использования в вашем приложении.
Я играю цифровыми фильтрами. При работе с ними нужно использовать свёртку или преобразование Фурье и прочие специфические функции. Естественно писать их с нуля смысла особого нет, но и искать вам придётся скорее всего долго..
И тут апогеем творчества MathWorks стал Matlab Coder который позволяет сгенерировать вам код на C/C++ из функции матлаба.
Наткнулся на подводный камень в виде необходимости установить VS для работы кодера. Почему было не сделать строчку в графическом интерфейсе не ясно..
Итак. Ставим VS (нам понадобится её компилятор). Ставим аккуратно выбирая из таблички на сайте матлаба нужную версию.
У меня 2013 матлаб, табличка говорит что Microsoft Visual C++ 2010 Professional нам вполне подойдёт.
Теперь нужно воспользоваться командой:
Просто пшем её в Command Window матлаба и выполняем. У вас спросят какой компилятор настроить для использования.
Весь вывод команды такой:
Вот впринципе и всё что нужно для работы. Очень странно, что всё делается командой. но это уже не нашего ума дело.
зы без этого матлаб будет выдавать ошибку matlab coder unknown compiler
Русские Блоги
Преобразование кода Matlab в код C на основе Matlab Coder
Недавно я выполняю функции, связанные с обработкой сигналов, сначала выполняю симуляцию на matlab, затем использую c / c ++ для реализации и затем пытаюсь использовать Matlab Coder для выполнения функции преобразования.
1. Концепция и процесс разработки
MATLAB Coder может генерировать независимый, читаемый и переносимый код C / C ++ из кода MATLAB.
С точки зрения непрофессионала, это преобразование написанного кода функционального модуля matlab в код на языке c / c ++, и затем мы будем совершенствоваться на этом основании.
Среда разработки этой статьи: Win10 64, VS2015, Matlab R2016A.
Процесс разработки: 3 шага для генерации кода C с использованием MATLAB Coder:
2. Практический тест
Ссылочная статья дает идею отделения кода функционального модуля от тестового кода, поэтому эта статья опирается на эту идею для проведения практического тестирования.
Конечно, файл a.m функционального модуля можно использовать как файл b.m. Оба должны быть выбраны для компиляции во время компиляции (может пониматься как зависимость), но в этой статье пока не рассматривается реализация этой функции.
2.1 Код функционального модуля Matlab и его тестовый код
myfft.m
Удалите компонент постоянного тока из входных данных и выполните БПФ. Среди них% # codegen используется для предотвращения ошибок предупреждения
test_main.m
Создать набор данных и проверить
выход Matlab:
f = (N-1)Fs/N = 261000/256=100Hz。
2.2 Используйте MATLAB Coder для генерации кода на языке c / c ++
2.3 Проверка VS2015
Вывод:
Генерация кода для программируемых логических контроллеров в программе Matlab
Компания MathWorks объявила о выпуске нового продукта — Simulink PLC Coder. Данный продукт позволяет автоматически генерировать согласно стандарту IEC 61131 код для программируемых логических контроллеров (ПЛК) и программируемых контроллеров автоматизации. Это нововведение позволяет использовать модельно-ориентированное проектирование для промышленного и силового оборудования, управляемого ПЛК.
С помощью Simulink PLC Coder, инженеры могут автоматически генерировать код для промышленных систем управления, включая замкнутые системы и системы контроля с обратной связью. Автоматическая генерация кода, неотъемлемая часть Модельно-ориентированного проектирования, помогает устранить ошибки, связанные с традиционным ручным написанием кода и уменьшает время разработки и валидации.
Simulink PLC Coder генерирует исходный код в структурированном текстовом формате из моделей Simulink, диаграмм Stateflow, и кода Embedded MATLAB, а затем использует интегрированную среду разработки (IDE) от поставщика средств промышленной автоматизации, для компиляции кода и запуска его на контроллерах ПЛК.
Для генерации кода необходима программа Matlab начиная с версии 2010a. Разрабатывать будем программу для ПЛК Siemens SIMATIC STEP 7.
Создаем файл модели, в котором будем создавать математическую модель. Для этого нам понадобится библиотека plclib, поэтому из командной строки Matlab запускаем ее.
Создаем математическую модель системы управления с дискретным ПИД регулятором (рисунок 1). На рисунке 2 приведена внутренняя структура блока pid_feedforward.
Рисунок 1 — Математическая модель системы управления
Рисунок 2 — Внутренняя структура блока pid_feedforward
Рисунок 3 — Переходный процесс системы
Выбираем блок pid_feedforward, нажимаем правую клавишу мыши и выбираем Subsystem Parametrs. В этом окне отмечаем «Treat as atomic unit» и нажимаем кнопку Ок.
На функциональном блоке нажимаем правую клавишу мыши и выбираем PLC Coder / Options.
Выбираем в какой тип ПЛК будет сгенерирован код (Target IDE) и нажимаем клавишу Generate code.
Сгенерированный код для SIMATIC STEP 7
(*
*
* File: plc.scl
*
* IEC 61131-3 Structured Text (ST) code generated for Simulink model «plc.mdl»
*
* Model version: 1.1
* Simulink PLC Coder version: 1.1 (R2010b) 03-Aug-2010
* ST code generated on: Fri Jun 03 18:52:23 2011
*
* Target IDE selection: Siemens SIMATIC Step 7 5.4
* Test Bench included: No
*
*)
FUNCTION_BLOCK FB1
VAR_INPUT
ssMethodType: INT;
In3: REAL;
In2: REAL;
In3_c: REAL;
END_VAR
VAR_OUTPUT
Out1: REAL;
END_VAR
VAR
Integrator_DSTATE: REAL;
Filter_DSTATE: REAL;
rtb_et: REAL;
rtb_Sum: REAL;
c_rtb_FilterCoeffi: REAL;
END_VAR
CASE ssMethodType OF
2:
(* InitializeConditions for DiscreteIntegrator: ‘/Integrator’ *)
Integrator_DSTATE := 0;
(* InitializeConditions for DiscreteIntegrator: ‘/Filter’ *)
Filter_DSTATE := 0;
3:
(* Sum: ‘/Sum’ incorporates:
* Inport: ‘/In1’
* Inport: ‘/In2’
*)
rtb_et := In3 — In2;
(* Gain: ‘/Filter Coefficient’ incorporates:
* DiscreteIntegrator: ‘/Filter’
* Gain: ‘/Derivative Gain’
* Sum: ‘/SumD’
*)
c_rtb_FilterCoeffi := ((-1.26102994076046 * rtb_et) — Filter_DSTATE) * 0.178109803713032;
(* Sum: ‘/Sum’ incorporates:
* DiscreteIntegrator: ‘/Integrator’
* Gain: ‘/Proportional Gain’
*)
rtb_Sum := ((1.7018012505578 * rtb_et) + Integrator_DSTATE) + c_rtb_FilterCoeffi;
(* Outport: ‘/Out1’ incorporates:
* Inport: ‘/In1’
* Sum: ‘/Sum1’
*)
Out1 := In3 + rtb_Sum;
(* Update for DiscreteIntegrator: ‘/Integrator’ incorporates:
* Gain: ‘/Integral Gain’
* Sum: ‘/Sum2’
* Sum: ‘/SumI1’
* Sum: ‘/SumI3’
* Update for Inport: ‘/In1’
* Update for Inport: ‘/In3’
*)
Integrator_DSTATE := (((In3_c — In3) — rtb_Sum) + (0.208461637073455 * rtb_et)) + Integrator_DSTATE;
(* Update for DiscreteIntegrator: ‘/Filter’ *)
Filter_DSTATE := Filter_DSTATE + c_rtb_FilterCoeffi;
Следующим этапом является создание проекта в Siemens SIMATIC Step 7 и вставки в редактор SCL сгенерированного кода.
Результатом компиляции кода является создание функционального блока.
Рисунок 4 — Функциональный блок FB1
С помощью OPC сервера осуществим обмен между ПЛК и Matlab. При использовании реального железа используем Simatic Net OPC Server, при использовании симулятора ПЛК (PLC-Sim) необходимо использовать SCADA-систему WinCC и WinCC OPC Server.
Рисунок 5 — Обмен данными между ПЛК и Matlab
Рисунок 6 — Сравнение работы ПИД регуляторов