Можно запустить 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