Simulink - Overview¶
API Documentation
Explanation¶
The FERAL Simulink module facilitates the incorporation of compiled Simulink models into simulation scenarios within the FERAL framework. Initially, the compiled Simulink models, in the form of Windows DLL or Linux SO files, must be loaded. Following this, the ports of FERAL can be aligned with the native Simulink structure. Consequently, initialization of the Simulink worker using the native Simulink library is mandatory, whereby a discrete time/event MOCC is also required. This worker enables port mapping and facilitates message transmission via the ports.
Supported data types for messages include double, int, float, long, and short. Messages containing these data types can be read or written as scalars or arrays.
Ultimately, the compiled Simulink model processes these inputs according to the defined operations and produces an output, which is subsequently integrated into the FERAL simulation.
Usage¶
Simulink Example
This example demonstrates how a compiled Simulink model is utilized, particularly focusing on its integration and application within the FERAL framework. In this instance, a simple Simulink model is employed to showcase the addition of two distinct scalar values in a simulation scenario.
package de.fraunhofer.iese.feral.ext.pcc.simulink.regression.nativelibrary;
import java.util.ArrayList;
import java.util.Collection;
import de.fraunhofer.iese.feral.ext.pcc.simulink.nativelibrary.SimulinkPortDefinition;
import de.fraunhofer.iese.feral.ext.pcc.simulink.nativelibrary.util.Util;
import de.fraunhofer.iese.feral.ext.pcc.simulink.nativelibrary.SimulinkNativeLibrary;
import de.fraunhofer.iese.feral.ext.pcc.simulink.nativelibrary.SimulinkNativeLibraryWorker;
import de.fraunhofer.iese.feral.krnl.scf.core.util.test.ConstantValueProvider;
import de.fraunhofer.iese.feral.krnl.scf.core.link.Link;
import de.fraunhofer.iese.feral.krnl.scf.core.mocc.Director;
import de.fraunhofer.iese.feral.krnl.scf.core.mocc.discretetime.DiscreteTimeMOCC;
import de.fraunhofer.iese.feral.krnl.scf.core.scenario.Scenario;
import de.fraunhofer.iese.feral.krnl.scf.core.scenario.SimulationScenario;
import de.fraunhofer.iese.feral.krnl.scf.core.time.SimulationDuration;
import static de.fraunhofer.iese.feral.ext.pcc.simulink.nativelibrary.SimulinkPortDataType.DOUBLE;
public class Documentation_Example_Simulink {
public static void main(String... args) throws Exception {
SimulationDuration stepDuration = new SimulationDuration(SimulationDuration._1S);
SimulinkNativeLibraryWorker simulinkWorker;
Scenario scenario = new SimulationScenario();
Director director = new DiscreteTimeMOCC(scenario, stepDuration.getRawTimeNS());
String libraryFileName = "";
String simulinkModelName = "sum";
String simulinkDllPath;
if (System.getProperty("os.name").toLowerCase().contains("windows")) {
libraryFileName = "sum.dll";
} else if (System.getProperty("os.name").toLowerCase().contains("linux")) {
libraryFileName = "sum.so";
}
simulinkDllPath = Util.getTestLibraryPath() + libraryFileName;
Collection<SimulinkPortDefinition> inputStructureDefinition = new ArrayList<>();
inputStructureDefinition.add(new SimulinkPortDefinition("in1", DOUBLE, 1));
inputStructureDefinition.add(new SimulinkPortDefinition("in2", DOUBLE, 1));
Collection<SimulinkPortDefinition> outputStructureDefinition = new ArrayList<>();
outputStructureDefinition.add(new SimulinkPortDefinition("sum", DOUBLE, 1));
SimulinkNativeLibrary simulinkNativeLibrary = new SimulinkNativeLibrary(
inputStructureDefinition,
outputStructureDefinition,
null,
simulinkDllPath,
simulinkModelName);
simulinkWorker = new SimulinkNativeLibraryWorker(director, simulinkNativeLibrary);
ConstantValueProvider<Double> doubleConstant1 = new ConstantValueProvider<>(director);
doubleConstant1.setValue(42.0);
ConstantValueProvider<Double> doubleConstant2 = new ConstantValueProvider<>(director);
doubleConstant2.setValue(4711.0);
new Link(doubleConstant1.getOutputPort("output"), simulinkWorker.getInputPort("in1"));
new Link(doubleConstant2.getOutputPort("output"), simulinkWorker.getInputPort("in2"));
System.out.println("Input 1 = " + doubleConstant1.getValue());
System.out.println("Input 2 = " + doubleConstant2.getValue());
scenario.startSimulation(SimulationDuration.s(2));
System.out.println("Output = " + simulinkNativeLibrary.getOutputStructure().getMembers().get(0).getValue());
doubleConstant1.setValue(142.0);
doubleConstant2.setValue(4811.0);
System.out.println("Input 1 = " + doubleConstant1.getValue());
System.out.println("Input 2 = " + doubleConstant2.getValue());
scenario.startSimulation(SimulationDuration.s(2));
System.out.println("Output = " + simulinkNativeLibrary.getOutputStructure().getMembers().get(0).getValue());
}
}