Выполнение моделирования Simulink с C++

Команда MATLAB, чтобы запустить моделирование

Можно запустить Simulink® симуляции с помощью MATLAB® Engine API для C++. Вот основные шаги, чтобы запустить симуляцию программно:

  • Запустите сеанс работы с MATLAB.

  • Загрузите модель Simulink в MATLAB с помощью MATLAB load_system (Simulink) функция.

  • Запустите симуляцию определенными параметрами симуляции с помощью MATLAB sim (Simulink) функция.

  • Доступ к результатам методов использования симуляции возвращенного Simulink.SimulationOuput Объект (Simulink).

Для получения информации о рабочих симуляциях программно из MATLAB, смотрите Симуляции Индивидуума Запуска (Simulink).

Модель Simulink vdp с C++

vdp Simulink блок-схема симулирует уравнение Ван дер Поля, которое является дифференциальным уравнением второго порядка. Simulink решает уравнения с помощью начальных условий и параметров конфигурации, заданных моделью.

КОД MATLAB, чтобы запустить моделирование

Этот код MATLAB показывает команды, чтобы запустить симуляцию программно. 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++.

Смотрите также

| |

Похожие темы