Сгенерируйте код и разверните контроллер на целевых устройствах в реальном времени

Программное обеспечение Model Predictive Control Toolbox™ обеспечивает функциональность генерации кода для контроллеров, разработанных в MATLAB® или Simulink®.

Генерация кода в MATLAB

После разработки контроллера MPC в MATLAB можно сгенерировать код С с помощью MATLAB Coder™ и развернуть его для управления в реальном времени.

Чтобы сгенерировать код для вычисления оптимальных ходов MPC управления для неявного или явного линейного контроллера MPC:

  1. Сгенерируйте структуры данных из контроллера MPC или явного контроллера MPC, используя getCodeGenerationData.

  2. Чтобы убедиться, что ваш контроллер производит ожидаемые результаты замкнутой системы, симулируйте его с помощью mpcmoveCodeGeneration вместо mpcmove.

  3. Сгенерируйте код для mpcmoveCodeGeneration использование codegen (MATLAB Coder). Этот шаг требует программного обеспечения MATLAB Coder.

Для получения примера смотрите Сгенерировать код для вычисления оптимальных перемещений MPC в MATLAB.

Можно также сгенерировать код для нелинейных контроллеров MPC, которые используют значение по умолчанию fmincon решатель с алгоритмом SQP. Чтобы сгенерировать код для вычисления оптимальных ходов управления для нелинейного контроллера MPC:

  1. Сгенерируйте структуры данных из нелинейного контроллера MPC с помощью getCodeGenerationData.

  2. Чтобы убедиться, что ваш контроллер производит ожидаемые результаты замкнутой системы, симулируйте его с помощью nlmpcmoveCodeGeneration вместо nlmpcmove.

  3. Сгенерируйте код для nlmpcmoveCodeGeneration использование codegen (MATLAB Coder). Этот шаг требует программного обеспечения MATLAB Coder.

Генерация кода в Simulink

После разработки контроллера в Simulink с использованием любого из блоков MPC, можно сгенерировать код и развернуть его для управления в реальном времени. Можно развертывать контроллеры ко всем целям, поддерживаемым следующими продуктами:

  • Simulink Coder

  • Embedded Coder®

  • Simulink PLC Coder™

  • Функции Simulink Real-Time™

Можно сгенерировать код для любого из блоков Model Predictive Control Toolbox Simulink.

Типы контроллеровБлоки
Неявные контроллеры MPC

MPC Controller

Явные контроллеры MPC

Explicit MPC Controller

Планируемые по усилению контроллеры MPC

Multiple MPC Controllers

Multiple Explicit MPC Controllers

Адаптивные контроллеры MPC

Adaptive MPC Controller

Контроллеры MPC для автомобильных приложений

Adaptive Cruise Control System

Lane Keeping Assist System

Path Following Control System

Нелинейные контроллеры MPC, которые используют fmincon с SQP

Nonlinear MPC Controller

Для получения дополнительной информации о генерации кода см. Simulation and Code Generation Using Simulink Coder and Simulation and Structured Text Generation Using Simulink PLC Coder.

Примечание

Блоки MPC Controller, Explicit MPC Controller, Adaptive MPC Controller и Nonlinear MPC Controller реализованы с помощью блока Функция MATLAB (Simulink). Чтобы увидеть структуру, щелкните правой кнопкой мыши блок и выберите Mask > Look Under Mask. Затем откройте подсистему MPC под.

Примечание

Если ваш нелинейный контроллер использует дополнительные параметры, вы также должны сгенерировать код для блока Bus Creator, соединенного с params входным портом блока Nonlinear MPC Controller. Для этого поместите блоки Nonlinear MPC Controller и Bus Creator в подсистему и сгенерируйте код для этой подсистемы.

Сгенерируйте код CUDA для линейных контроллеров MPC

Можно сгенерировать CUDA® код для контроллера MPC, используя GPU Coder™. Дополнительные сведения о поддерживаемых графических процессорах см. в разделе Поддержка GPU по версии (Parallel Computing Toolbox). Дополнительные сведения об установке и настройке необходимого продукта см. в разделе Установка необходимых продуктов (GPU Coder) и Настройка необходимых продуктов (GPU Coder).

Чтобы сгенерировать и использовать код GPU в MATLAB:

  1. Проектируйте линейный контроллер с помощью mpc объект.

  2. Сгенерируйте структуры для ядра, состояний и оперативных данных от вашего линейного контроллера MPC с помощью getCodeGenerationData функция.

  3. Опционально симулируйте замкнутый цикл итеративно, используя mpcmoveCodeGeneration функция и структуры данных, созданные на предыдущем шаге.

  4. Создайте объект опций строения кодера с помощью coder.gpuConfig и сконфигурируйте опции генерации кода.

  5. Сгенерируйте код для mpcmoveCodeGeneration функцию, использующую codegen function и объект опций строения кодера. Это генерирует новую функцию, которая использует код, выполняемый на графическом процессоре.

  6. Симулируйте свой контроллер, используя новую сгенерированную функцию и структуры данных.

Для примера использования кода GPU в MATLAB, смотрите Использование графический процессор для вычисления перемещений MPC в MATLAB

Можно сгенерировать и использовать код GPU из блоков MPC Controller, Adaptive MPC Controller или Explicit MPC Controller.

Чтобы сгенерировать код GPU из модели Simulink, содержащей любой из этих блоков, откройте диалоговое окно Параметры конфигурации (Configuration Parameters), нажав Model Settings. Затем в Code Generation разделе выберите Generate GPU code.

Для получения дополнительной информации о том, как сконфигурировать модель для генерации кода GPU, смотрите Генерацию кода из моделей Simulink с GPU Coder (GPU Coder).

Частота дискретизации в окружение реального времени

Частота дискретизации, которую контроллер может достичь в окружение реального времени, зависит от системы. Для примера, для типичного небольшого приложения управления MIMO, работающего на Simulink Real-Time, шаг расчета может составлять до 1-10 мс для линейного MPC и 100-1000 мс для нелинейного MPC. Чтобы определить шаг расчета, сначала протестируйте менее агрессивный контроллер, чья частота дискретизации обеспечивает приемлемую эффективность для целевого устройства. Затем уменьшите шаг расчета и проконтролируйте время выполнения контроллера. Можно дополнительно уменьшить шаг расчета, пока оптимизация безопасно завершается в течение каждого периода отбора проб при нормальных условиях эксплуатации объекта. Чтобы уменьшить шаг расчета, вы также можете рассмотреть использование:

  • Явный MPC. В то время как явные контроллеры MPC имеют более быстрое время выполнения, они также имеют большую площадь памяти, поскольку они хранят предварительно вычисленные законы управления. Дополнительные сведения см. в разделе Явный проект MPC.

  • Неоптимальное решение QP после заданного количества максимальных итераций решателя. Для получения дополнительной информации см. Suboptimal QP Solution.

Совет

Меньший шаг расчета контроллера не обязательно обеспечивает лучшую эффективность. На самом деле, вы хотите выбрать шаг расчета, который достаточно мал, чтобы дать вам хорошую эффективность, но не меньше. Для того же времени предсказания меньшие шаги расчета приводят к большим шагам предсказания, что, в свою очередь, создает большую площадь памяти и более сложную задачу оптимизации.

QP- Конструкции задачи для сгенерированного кода C

На каждом контрольном интервале неявный или адаптивный контроллер MPC создает новую задачу QP, которая определяется как:

Minx(12xHx+fx)

удовлетворяющее линейным ограничениям неравенства

Axb

где

  • x - вектор решения.

  • H - матрица Гессия.

  • A является матрицей линейных ограничительных коэффициентов.

  • f и b являются векторами.

В сгенерированном коде C следующие матрицы используются для предоставления H, A, f и b. В зависимости от типа и строения контроллера MPC, эти матрицы являются либо постоянными, либо регенерированными в каждом контрольном интервале.

Постоянная матрицаРазмерЦельНеявный MPCНеявный MPC с онлайн настройкой весаАдаптивный MPC или LTV MPC
HinvNM -by- NMОбратная матрица Гессия, HПостоянныйВосстановленныйВосстановленный
LinvNM -by- NMОбратное нижне-треугольное Холецкое разложение H
AcNC -by- NMЛинейные ограничительные коэффициенты, AПостоянный
KxNxqp -by- (NM -1)Используется для генерации fВосстановленный
Krp * Ny -by- (NM -1)
Ku1Nmv -by- (NM -1)
Kv(Nmd + 1) * (p + 1) -by- (NM -1)
Kutp * Nmv -by- (NM -1)
MlimNC -by-1Используется для генерации bПостоянныйКонстанта, кроме случаев, когда существуют пользовательские ограничения
MxNC -by- NxqpВосстановленный
Mu1NC -by- Nmv
MvNC -by- (Nmd + 1) * (p + 1)

Здесь:

  • p - горизонт предсказания.

  • Nmv - количество манипулируемых переменных.

  • Nmd - количество измеренных нарушений порядка.

  • Ny - количество переменных выходов.

  • NM - количество переменных оптимизации (m * Nmv + 1, где m - горизонт управления).

  • Nxqp - количество состояний, используемых для задачи QP; то есть общее количество состояний объекта и состояний модели возмущения.

  • NC - общее количество ограничений.

На каждом контрольном интервале сгенерированный код C вычисляет f и b как:

f=Kxxq+Krrp+Ku1ml+Kvvp+Kutut

b=(Mlim+Mxxq+Mu1ml+Mvvp)

где

  • xq - вектор состояния объекта и модели возмущения, оцененный фильтром Калмана.

  • ml - перемещение манипулированной переменной с предыдущего контрольного интервала.

  • ut - манипулируемая переменная цель.

  • vp - последовательность измеренных сигналов нарушения порядка через горизонт предсказания.

  • rp - последовательность опорных сигналов через горизонт предсказания.

Примечание

При генерации кода в MATLAB, getCodeGenerationData команда генерирует эти матрицы и возвращает их в configData.

Генерация кода для пользовательских решателей QP

Можно сгенерировать код для линейных контроллеров MPC, которые используют пользовательский решатель QP, написанный на C или коде MATLAB. Контроллер вызывает этот решатель вместо встроенного решателя QP на каждом контрольном интервале.

Для получения примера смотрите Моделирование и Генерация кода для контроллера MPC с пользовательским решателем QP. Для получения дополнительной информации о пользовательских решателях QP, смотрите Пользовательский решатель QP.

Для получения информации об использовании решателя FORCES PRO, смотрите Реализуйте Контроллеры MPC, используя Решатели Embotech FORCES PRO.

См. также

Функции

Блоки

Похожие темы