Monthly Archives: August 2018

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

FMU-proxy

FMU-proxy is a framework for working with Functional Mock-up Units (FMUs) across languages and platforms. This is done by wrapping a set of FMUs inside a server program. Using common and language independent Remote Procedure Call (RPC) frameworks, like Apache Avro, Apache Thrift, gRPC and JSON-RPC over a range of network protocols, the FMU functions are effectively made available from pretty much any language on any platform.

Both Co-simulation and Model Exchange FMUs are supported, with the latter being wrapped as a Co-simulation FMU.

Server implementations exists in C++ and for the JVM. The C++ implementation is cross platform and builds just as easy on both platforms thanks to vcpkg and CMake.
For handling the FMUs, the C++ version relies on FMI Library, while the JVM version uses FMI4j.

Clients exists for C++, Python, JavaScript and for the JVM. Clients in other languages can easily be implemented as most of the code will be auto generated by your chosen RPC framework using the available schemas.
On the JVM, FMU-proxy shares the same interface as FMI4j – making local and remote execution of FMUs almost indistinguishable from one another.

Only FMI 2.0 and onward are planned to be supported.

https://github.com/SFI-Mechatronics/FMU-proxy