Можно запустить Simulink® симуляции с использованием MATLAB® Engine API для C++. Вот основные шаги для выполнения симуляции программно:
Запуск сеанса работы с MATLAB.
Загрузите модель Simulink в MATLAB с помощью MATLAB load_system (Simulink) функция.
Запустите симуляцию с определенными параметрами симуляции с помощью MATLAB sim (Simulink) функция.
Доступ к результатам симуляции с помощью методов возвращенной Simulink.SimulationOuput (Simulink) объект.
Для получения информации о программном выполнении симуляций из MATLAB, смотрите Запуск отдельных симуляций (Simulink).
The Simulink vdp блок моделирует уравнение Ван дер Поля, которое является дифференциальным уравнением второго порядка. Simulink решает уравнения, используя начальные условия и параметры конфигурации, заданные моделью.
Этот код MATLAB показывает команды для выполнения симуляции программно. The Simulink.SimulationOuput get объекта метод возвращает результаты и временной вектор.
load_system('vdp'); parameterStruct.SaveOutput = 'on'; parameterStruct.OutputSaveName = 'yOut'; parameterStruct.SaveTime = 'on'; parameterStruct.TimeSaveName = 'tOut'; simOut = sim('vdp',parameterStruct); y = simOut.get('yOut'); t = simOut.get('tOut');
Этот код MATLAB создает график выхода симуляции и экспортирует график в файл изображения JPEG.
plot(t,y) print('vdpSimulation','-djpeg')
Этот пример кода запускает симуляцию Simulink для vdp модель. Код выполняет следующие операции:
Подключитесь к именованному сеансу работы с MATLAB, в котором установлен Simulink.
Создайте matlab::data::ArrayFactory и создайте StructArray который содержит параметры симуляции.
Передайте структуру параметра симуляции в рабочее пространство MATLAB.
Загрузите vdp Simulink моделирует использование асинхронного вызова к MATLABEngine::evalAsync. Выполнение ожидает, пока MATLAB загрузит модель.
Запустите симуляцию с помощью другого асинхронного вызова, чтобы MATLABEngine::evalAsync. Выполнение ожидает завершения симуляции.
Извлеките данные моделирования из Simulink.SimulationOutput объект в рабочем пространстве MATLAB.
Постройте графики данных и экспортируйте изображение JPEG в текущую папку MATLAB с помощью MATLABEngine::eval для выполнения команд MATLAB.
#include "MatlabDataArray.hpp"
#include "MatlabEngine.hpp"
#include <chrono>
#include <iostream>
void runSimulation() {
using namespace matlab::engine;
// Connect to named shared MATLAB session started as:
// matlab -r "matlab.engine.shareEngine('myMatlabEngine')"
String session(u"myMatlabEngine");
std::unique_ptr<MATLABEngine> matlabPtr = connectMATLAB(session);
// Create MATLAB data array factory
matlab::data::ArrayFactory factory;
// Create struct for simulation parameters
matlab::data::StructArray parameterStruct = factory.createStructArray({ 1,4 }, {
"SaveOutput",
"OutputSaveName",
"SaveTime",
"TimeSaveName" });
parameterStruct[0]["SaveOutput"] = factory.createCharArray("on");
parameterStruct[0]["OutputSaveName"] = factory.createCharArray("yOut");
parameterStruct[0]["SaveTime"] = factory.createCharArray("on");
parameterStruct[0]["TimeSaveName"] = factory.createCharArray("tOut");
// Put simulation parameter struct in MATLAB
matlabPtr->setVariable(u"parameterStruct", parameterStruct);
// Load vdp Simulink model
FutureResult<void> loadFuture = matlabPtr->evalAsync(u"load_system('vdp')");
std::cout << "Loading Simulink model... " << std::endl;
std::future_status loadStatus;
do {
loadStatus = loadFuture.wait_for(std::chrono::seconds(1));
} while (loadStatus != std::future_status::ready);
std::cout << "vdp model loaded\n";
// Run simulation
FutureResult<void> simFuture = matlabPtr->evalAsync(u"simOut = sim('vdp',parameterStruct);");
std::cout << "Running simulation... " << std::endl;
std::future_status simStatus;
do {
simStatus = loadFuture.wait_for(std::chrono::seconds(1));
} while (simStatus != std::future_status::ready);
std::cout << "vdp simulation complete\n";
// Get simulation data and create a graph
matlabPtr->eval(u"y = simOut.get('yOut');");
matlabPtr->eval(u"t = simOut.get('tOut');");
matlabPtr->eval(u"plot(t,y)");
matlabPtr->eval(u"pause(10)");
matlabPtr->eval(u"print('vdpSimulation','-djpeg')");
}Для получения информации о том, как настроить и создать программы C++ engine, смотрите Сборка программ C++ Engine.
matlab::data::ArrayFactory | matlab::engine::connectMATLAB | matlab::engine::MATLABEngine