General Description ========================== This document specifies the ways in which environmental effect models, sensor models and logical models using the `Open Simulation Interface`_ are to be packaged for their use in simulation environments using FMI 2.0. This is version 1.0.0 of this document. The version number is to be interpreted according to the `Semantic Versioning Specification (SemVer) 2.0.0`_. The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in `RFC 2119`_. Kinds of Models --------------- The current specification supports the following kinds of models, that can be packaged as FMUs: - Environmental effect models, which consume ``osi::SensorView`` as input and produce ``osi::SensorView`` as output, - Sensor models, which consume ``osi::SensorView`` as input and generate ``osi::SensorData`` as output, and - Logical models, like e.g. sensor fusion models, which consume ``osi::SensorData`` as input and produce ``osi::SensorData`` as output. Additionally complex models that combine various aspects of the model kinds above are possible, however configuration and setup of such FMUs will require manual intervention in those cases. .. _fmi-20: FMI 2.0 ------- The model MUST be packaged as a valid `FMI`_ 2.0 FMU for Co-Simulation, as specified in the `FMI 2.0 standard`_. Unless otherwise noted in this document all specifications in the FMI 2.0 standard apply as-is. Basic Conventions ----------------- The following basic conventions apply: - In order to mark the FMU as being conformant to this version of the specification the following annotation MUST be placed into the ``VendorAnnotations`` element of the ``modelDescription.xml``: .. code:: XML where the ``osi-version`` attribute SHOULD contain the major, minor and patch version number of the open simulation interface specification that this model was compiled against. This is to ensure that the importing environment can determine which OSI version to use prior to communicating with the FMU, which might be impossible in cases of major version changes. In case this specification is used without OSI data being transported across binary variables, this attribute SHOULD be left unspecified. - The variable naming convention of the FMU MUST be ``structured``. - The default experiment step size SHOULD be supplied and SHOULD indicate the actual model refresh rate (for the input side) in seconds, i.e. it is OK for the simulation to only call the FMU fmi2DoStep routine at this implied rate. If it is not supplied the configuration of the model communication rate is determined from any input configuration data the model provides (see below) or has to be performed manually. - Besides the model parameters, inputs and outputs specified below the model can have additional inputs, outputs, and parameters (i.e. all kinds of variables as specified in the FMI 2.0 standard), as long as the sensor model can be run correctly with all of those variables left unconnected and at their default values. The sensor model MUST NOT rely on other connections (beside the specified data connections) being made. Definition of Binary Variables ------------------------------ In order to support the efficient exchange of binary data, especially binary data as provided for by the OSI `Protocol Buffer `_ definitions, the following convention is used to define such variables for FMI 2.0: - For a notional binary variable of a name given by ````, which MUST be a valid structured name according to FMI 2.0, three actual FMU integer variables MUST be defined: - ``.base.lo`` (Integer) This is the lower (i.e. least significant) 32bit address of the binary data buffer to be passed into or out of the model, cast into a signed 32bit integer (without changing bit values, i.e. as by reinterpret_cast in C++). - ``.base.hi`` (Integer) This is the higher (i.e. most significant) 32bit address of the binary data buffer to be passed into or out of the model, cast into a signed 32bit integer (without changing bit values, i.e. as by reinterpret_cast in C++). Note that this variable is only used for 64bit platforms, for 32bit platforms it will always be 0, but MUST still be present (in order to support FMUs including both 32bit and 64bit implementations). - ``.size`` (Integer) This is the size of the binary data buffer to be passed into or out of the model as a signed 32bit integer (restricting the maximum size of binary data buffers being passed around to < 2GB of size). - The three actual variables MUST have matching causality and variability, which will be the causality and variability of the notional binary variable. - Unless the causality and variability combination of the actual variables precludes this (i.e. for fixed or tunable calculatedParameter), the variables MUST have a start value of 0, indicating that no valid binary data buffer is available. Model FMUs MUST interpret values of 0 for either the base address (merged from lo and hi for 64bit) or the size to indicate that no valid binary data buffer is available and must handle this case safely. - The three actual variables MUST contain an annotation of the following form in the ``Annotations`` child element of their ``ScalarVariable`` element of the ``modelDescription.xml``: .. code:: XML where ```` is the prefix as defined above, and ```` is either ``base.lo``, ``base.hi`` or ``size``, depending on the variable. This annotation marks the variable as belonging to a notional binary variable named ````, with the given variable having the specified ````, and the transported binary content being specified by the ``mime-type`` attribute, as given by ````, which MUST be a valid MIME type specification. In the case of OSI-specified data, the MIME type MUST be of the form ``application/x-open-simulation-interface; type=SensorView; version=3.0.0`` indicating that the binary content is conformant to a given OSI version (3.0.0 in this example), containing a message of the type given in the ``type`` parameter (````osi::SensorView```` in this example). The version parameter given for the MIME type ``application/x-open-simulation-interface`` will default to the version specified in the ``osi-version`` attribute as part of the top-level ``osmp:osmp`` annotation. It is an error if a version number is specified neither as part of the MIME type nor using the ``osi-version`` attribute. It is an error if the mime-type specified in the annotations for one notional binary variable (i.e. with identical name attribute) differ, or if there is not exactly one variable of each role for the same name. - The FMU MUST NOT contain any variable that is named ````: This restriction ensures that there is no conflict between the notional binary variable defined and another variable. - The guaranteed lifetime of the binary data buffer pointer transported through the actual variables is defined for each kind of variable specified below. Sensor View Inputs ------------------ - Sensor view inputs MUST be named with the prefix ``OSMPSensorViewIn``. If more than one sensor view input is to be configured, the prefix MUST be extended by an array index designator, i.e. two inputs will use the prefixes ``OSMPSensorViewIn[1]`` and ``OSMPSensorViewIn[2]``. The indices MUST start at 1 and MUST be consecutive. If only one sensor view input is needed the prefix MUST be just ``OSMPSensorViewIn``. - Each sensor view input MUST be defined as a notional discrete binary input variable, as specified above, with ``causality="input"`` and ``variability="discrete"``. - The MIME type of the variable MUST specify the ``type=SensorView``, e.g. ``application/x-open-simulation-interface; type=SensorView; version=3.0.0``. - The sensor view MUST be encoded as ``osi::SensorView`` (see the OSI specification documentation for more details). - The guaranteed lifetime of the sensor view protocol buffer pointer provided as input to the FMU MUST be from the time of the call to ``fmi2SetInteger`` that provides those values until the end of the following ``fmi2DoStep`` call, i.e. the sensor model can rely on the provided buffer remaining valid from the moment it is passed in until the end of the corresponding calculation, and thus does not need to copy the contents in that case (zero copy input). - The sensor view passed to the model must contain data as specified by the corresponding ``OSMPSensorViewInConfiguration`` parameter. Sensor View Input Configuration ------------------------------- - For each notional sensor view input variable (named with the base prefix ``OSMPSensorViewIn``) a corresponding calculatedParameter (named with base prefix ``OSMPSensorViewInConfigRequest``) and a parameter (named with base prefix ``OSMPSensorViewInConfig``) CAN exist. If the calculatedParameter exists, then the corresponding parameter MUST exist. - If the calculatedParameter exists it MUST be named with the prefix ``OSMPSensorViewInConfigRequest``, and MUST have a ``causality`` of ``calculatedParameter`` and a variability of either ``fixed`` or ``tunable``. - If the parameter exists it MUST be named with the prefix ``OSMPSensorViewInConfig``, and MUST have a ``causality`` of ``parameter`` and a variability of either ``fixed`` or ``tunable``, where the variability MUST match the variability of the corresponding calculatedParameter. - The MIME type of both variables MUST specify the ``type=SensorViewConfiguration``, e.g. ``application/x-open-simulation-interface; type=SensorViewConfiguration; version=3.0.0``. - The variables values MUST be encoded as ``osi::SensorViewConfiguration`` (see the OSI specification documentation for more details). - As long as no non-zero value has been assigned to the corresponding ``OSMPSensorViewInConfig`` parameter, the calculated parameter value MUST be the desired sensor view configuration for the corresponding ``OSMPSensorViewIn`` variable, based on model internal requirements and any other parameters on which this calculated parameter depends. Once a non-zero value has been assigned to the corresponding ``OSMPSensorViewInConfig`` parameter, the value of this calculated parameter MUST be an encoded OSI protocol buffer containing the same data as the parameter. - The simulation environment SHOULD, during FMI initialization mode, query the ``OSMPSensorViewInConfigRequest`` calculatedParameter value, and, taking this value into account, determine a suitable and supported SensorView configuration. The simulation environment MUST set this configuration using the corresponding ``OSMPSensorViewInConfig`` parameter before exiting initialization mode. Sensor View Outputs ------------------- - Sensor view outputs are present in environmental effect models. - Sensor view outputs MUST be named with the prefix ``OSMPSensorViewOut``. If more than one sensor view output is to be provided, the prefix MUST be extended by an array index designator, i.e. two outputs will use the prefixes ``OSMPSensorViewOut[1]`` and ``OSMPSensorViewOut[2]``. The indices MUST start at 1 and MUST be consecutive. If only one sensor view output is needed the prefix MUST be just ``OSMPSensorViewOut``. - Each sensor view output MUST be defined as a notional discrete binary output variable, as specified above, with ``causality="output"`` and ``variability="discrete"``. - The MIME type of the variable MUST specify the ``type=SensorView``, e.g. ``application/x-open-simulation-interface; type=SensorView; version=3.0.0``. - The sensor view MUST be encoded as ``osi::SensorView`` (see the OSI specification documentation for more details). - The guaranteed lifetime of the sensor view protocol buffer pointer provided as output by the FMU MUST be from the end of the call to ``fmi2DoStep`` that calculated this buffer until the beginning of the **second** ``fmi2DoStep`` call after that, i.e. the simulation engine can rely on the provided buffer remaining valid from the moment it is passed out until the end of the next Co-Simulation calculation cycle, and thus does not need to copy the contents in that case (zero copy output for the simulation engine, at the cost of double buffering for the environmental effect model). This arrangement (and hence the need for double buffering) is required to support use of the environmental effect model FMUs in simulation engines that have no special support for the protocol buffer pointers, i.e. using this convention it is possible to daisy chain FMUs with protocol buffer inputs/outputs in a normal simulation engine like e.g. MATLAB/Simulink, and get valid results. Sensor Data Outputs ------------------- - Sensor data outputs MUST be named with the prefix ``OSMPSensorDataOut``. If more than one sensor data output is to be provided, the prefix MUST be extended by an array index designator, i.e. two outputs will use the prefixes ``OSMPSensorDataOut[1]`` and ``OSMPSensorDataOut[2]``. The indices MUST start at 1 and MUST be consecutive. If only one sensor data output is needed the prefix MUST be just ``OSMPSensorDataOut``. - Each sensor data output MUST be defined as a notional discrete binary output variable, as specified above, with ``causality="output"`` and ``variability="discrete"``. - The MIME type of the variable MUST specify the ``type=SensorData``, e.g. ``application/x-open-simulation-interface; type=SensorData; version=3.0.0``. - The sensor data MUST be encoded as ``osi::SensorData`` (see the OSI specification documentation for more details). - The guaranteed lifetime of the sensor data protocol buffer pointer provided as output by the FMU MUST be from the end of the call to ``fmi2DoStep`` that calculated this buffer until the beginning of the **second** ``fmi2DoStep`` call after that, i.e. the simulation engine can rely on the provided buffer remaining valid from the moment it is passed out until the end of the next Co-Simulation calculation cycle, and thus does not need to copy the contents in that case (zero copy output for the simulation engine, at the cost of double buffering for the sensor model). This arrangement (and hence the need for double buffering) is required to support use of the sensor model FMUs in simulation engines that have no special support for the protocol buffer pointers, i.e. using this convention it is possible to daisy chain FMUs with protocol buffer inputs/outputs in a normal simulation engine like e.g. MATLAB/Simulink, and get valid results. Sensor Data Inputs ------------------ - Sensor data inputs are present in logical models. - Sensor data inputs MUST be named with the prefix ``OSMPSensorDataIn``. If more than one sensor data input is to be configured, the prefix MUST be extended by an array index designator, i.e. two inputs will use the prefixes ``OSMPSensorDataIn[1]`` and ``OSMPSensorDataIn[2]``. The indices MUST start at 1 and MUST be consecutive. If only one sensor data input is needed the prefix MUST be just ``OSMPSensorDataIn``. - Each sensor data input MUST be defined as a notional discrete binary input variable, as specified above, with ``causality="input"`` and ``variability="discrete"``. - The MIME type of the variable MUST specify the ``type=SensorData``, e.g. ``application/x-open-simulation-interface; type=SensorData; version=3.0.0``. - The sensor data MUST be encoded as ``osi::SensorData`` (see the OSI specification documentation for more details). - The guaranteed lifetime of the sensor data protocol buffer pointer provided as input to the FMU MUST be from the time of the call to ``fmi2SetInteger`` that provides those values until the end of the following ``fmi2DoStep`` call, i.e. the logical model can rely on the provided buffer remaining valid from the moment it is passed in until the end of the corresponding calculation, and thus does not need to copy the contents in that case (zero copy input). - The sensor data passed to the model depends on any prior models or processes that generated the data, i.e. the exact details of the contents will depend on the processing pipeline. Examples -------- An example dummy sensor model implementation is provided in the OSMPDummySensor sub-directory of the examples directory of this repository. Below you can find an example modelDescription.xml file that would satisfy the requirements of this document for a sensor model FMU with one input and output and no additional features: .. code:: XML Future Evolution ---------------- For FMI 3.0, which is currently in development, an opaque binary data type (a binary data type that is defined in the same way as the current string data type, but length terminated instead of zero-terminated) is planned to be added. This will allow migration of sensor models using the current convention to one where the relevant OSMP binary variables will be directly mapped to such new binary variables, instead of relying on the annotated trio of integer variables for each notional binary variable as is currently specified. The life-time of the new FMI 3.0 variables will be the standard life-time of all FMI variables, and thus shorter than is currently specified, so copying on input and output is going to be required. Other than that the current specification can be mapped 1:1 onto this new mechanism, and once FMI 3.0 is released, an updated OSMP specification including this option and mapping will be released. .. _Open Simulation Interface: https://github.com/OpenSimulationInterface/open-simulation-interface .. _Semantic Versioning Specification (SemVer) 2.0.0: http://semver.org/spec/v2.0.0.html .. _RFC 2119: https://www.ietf.org/rfc/rfc2119.txt .. _FMI: https://fmi-standard.org/ .. _FMI 2.0 standard: https://svn.modelica.org/fmi/branches/public/specifications/v2.0/FMI_for_ModelExchange_and_CoSimulation_v2.0.pdf .. |Build Status| image:: https://travis-ci.org/OpenSimulationInterface/osi-sensor-model-packaging.svg?branch=master :target: https://travis-ci.org/OpenSimulationInterface/osi-sensor-model-packaging