Category Archives: Programming

FMI4cpp

FMI4cpp is a brand new FMI 2.0 implementation for C++.  It has been written from the ground up in modern C++. The API is very similar to FMI4j.

All dependencies are available through vcpkg.


#include <iostream>
#include <fmi4cpp/fmi2/fmi4cpp.hpp>

using namespace fmi4cpp::fmi2;

const double stop = 10.0; 
const double stepSize = 1.0/100;

int main() {

    import::Fmu fmu("path/to/fmu.fmu");
    auto slave = fmu.asCoSimulationFmu().newInstance();

    auto md = slave->getModelDescription();    
    auto var = md.getVariableByName("myVar").asReal();

    slave->init();
    
    double t;
    double value;
    while ( (t = slave->getSimulationTime()) <= stop) {
    
        if (slave->doStep(stepSize)!= fmi2OK) {
            break;
        }

        if (var->read(*slave, value) != fmi2OK) {
            break;
        }
    
        std::cout << var.name() << "=" << value << std::endl;
    }
    
    slave->terminate();
    
}

https://github.com/SFI-Mechatronics/FMI4cpp

Gradle plugin for FMI

I have published an Grade plugin for simplifying programmatic interaction with FMUs. The plugin is powered by FMI4j, which is compatible with FMI 2.0 for Co-simulation and Model Exchange.

Among other things, the plugin generates type safe getter and setters for all FMU variables – grouped by causality.
It also generates javadoc based on the information found in the modelDescription.xml.


FmiSimulation instance = ControlledTemperature.newInstance();

instance.init(); //throws on error

//Variables are grouped by causality and have types!
RealVariable tempRef = instance.getOutputs().temperature_Reference();

double stop = 10.0;
double stepSize = 1E-2;
while (instance.getSimulationTime() <= stop) {

  if (!instance.doStep(stepSize)) {
    break;
  }

  FmuRead<Double> read = tempRef.read();
  System.out.println(tempRef.name + "=" + read.getValue());

}

instance.terminate();

To add it to your project, simply add the following code to your build.gradle

plugins {
  id "no.mechatronics.sfi.fmi4j.FmuPlugin" version "0.4.1"
}

The plugin will automatically add the required FMI4j dependency to your project.