Real-Time Communication and Control
MODELICA _D EVICE D RIVERS Library
1 Copyright © Open Source Modelica Consortium
Main contributors: Bernhard Thiele,
Communication & I/O Devices: Thomas Beutlich, Volker Waurich,
M ODELICA _D EVICE D RIVERS Library Martin Sjölund, Tobias Bellmann
• Free library for interfacing hardware drivers
• Cross-platform (Windows and Linux)
• UDP, SharedMemory, CAN, Keyboard,
Joystick/Gamepad
• DAQ cards for digital and analog IO (only Linux)
• Developed for interactive real-time simulations
https://github.com/modelica/Modelica_DeviceDrivers/
2 Copyright © Open Source Modelica Consortium
Motivation for Modelica Device Drivers Library
Certain Modelica applications need to interact
with their environment, e.g.,
Human‐in‐the‐Loop (HITL) simulators
(flight, driving, marine training
simulators)
Hardware‐in‐the‐Loop (HIL) simulators
Offline process simulators that need to
be coupled to external applications
Embedded control applications
How to do it?
3 Copyright © Open Source Modelica Consortium
How to Do It?
Established: Code export to third‐party environments for real‐time
applications, as supported by some Modelica tools Example: Integration
with the MATLAB/Simulink tool chain as supported by Dymola or
SimulationX
More recent: Generate FMUs which can be imported into compatible
simulator environments
Customization: Self‐grown customized tool chains. Example:
N. Worschech and L. Mikelson. A Toolchain for Real‐Time Simulation using the OpenModelica Compiler . In
9 t h Int. Modelica Conference, 2012.
Library approach: Access external devices by utilizing Modelica’s external
function interface for interfacing to the C API of various device drivers
directly from Modelica models
4 Copyright © Open Source Modelica Consortium
Library approach: Modelica_DeviceDrivers (MDD)
Open‐source Modelica library for interfacing hardware drivers Originates
from an DLR internal library named ExternalDevices
T. Bellmann. Interactive Simulations and advanced Visualization with Modelica . In 7 t h Int. Modelica Conference, 2009.
ExternalDevices was split into two libraries for separating different
concerns and ease further development:
• DLR Visualization library (became a commercial library)
• Modelica_DeviceDrivers (MDD) library (became open‐source)
First public version of MDD v0.9 released in 2012
Latest release is MDD v1.5.0: Substantial contributions and efforts by
several developers since the first concept
https://github.com/modelica/Modelica_DeviceDrivers
5 Copyright © Open Source Modelica Consortium
Layered Architecture
Block Layer
Blocks ClockedBlocks
when sample() then Clocked Synchronous
style for calls to the Language Elements
Function Layer. for periodic calls
Function Layer
Modelica (external C) functions
C-Code Layer
The glue C-code interfaced by the External C-
Function Layer.
Windows Linux Other
6 Copyright © Open Source Modelica Consortium
Example: Game controller function layer API
model Game Controller Exa mple
import M o d e l i c a _ D e v i c e D r i v e r s . I n p u t
Devices. *;
parameter I n t e g e r i d = 0 "0 = f i r s t a t t a c h e d game c o n t r o l l e r " ;
G a m e C o n t r o l l e r gc = G a m e C o n t r o l l e r ( i d ) ;
d i s c r e t e R e a l axesRaw[6] ;
I n t e g e r b u t t o n s [3 2], pOV ;
equation
when sample (0, 0.1 ) then
(axesRaw, buttons, pOV ) = G a m e C o n t r o l l e r _ . g e t D a t a ( gc ) ;
end when ;
end Game Controller Exa mple ;
axesRaw[1]
4e+04
Connect controller and simulate, 3e+04
2e+04
e.g., in OpenModelica using 1e+04
0
simulation flag -rt=1 for -1e+04
-2e+04
real‐time synchronisation. -3e+04
-4e+04
0 1 2 3 4 5
7 Copyright © Open Source Modelica Consortium
Example: Game controller block layer
Blocks ClockedBlocks
Sampling period by parameter: Modelica_Synchronous compatible:
when sample ( 0 , sample Time ) then when Clock() then
(axesRaw, buttons, pOV ) = (axesRaw, buttons, pOV ) =
G a m e C o n t r o l l e r _ . g e t D a t a (gc) ; G a m e C o n t r o l l e r _ . g e t D a t a ( gc ) ;
end when; end when;
8 Copyright © Open Source Modelica Consortium
Supported input and communication devices
Blocks.Communication
LCM: set of libraries and tools for message passing and data marshalling: h t t p s : / / l c m ‐ p r o j . g i t h u b . i o /
9 Copyright © Open Source Modelica Consortium
Packaging concept
10 Copyright © Open Source Modelica Consortium
SerialPackager blocks and connectors
Blocks.Packaging connector PackageIn "Packager input"
input SerialPackager pkg;
input Boolean trigger ;
input Real dummy ;
output Boolean backwardTrigger;
output Integer userPkgBitSize;
output Integer autoPkgBitSize;
end PackageIn;
• Symmetrically, PackageOut
has reversed causalities
• pkg is an external object
Symmetrical blocks for retrieving variables
Byte order can be specified packInt for packing pointing to a C byte array
unsigned integer values at the bit level (next slide)
11 Copyright © Open Source Modelica Consortium
Serial packager external C byte array structure
• pkg objects are propagated through connections
• pkg points to a C byte array in which C variables with
respectively indicated types are simply successively
appended in a data‐flow prescribed order
Conceptually (using magic numbers for array offsets):
double v1[3] = { 1.1, 2.2, 3.3 };
int v2 = 4;
unsigned char * data =
(unsigned char*)calloc(28, sizeof(unsigned char)) ;
memcpy(&data[0], &v1[0], sizeof (v1));
memcpy(&data[2 4], &v2, sizeof (v2));
12 Copyright © Open Source Modelica Consortium
HardwareIO: Support for the Linux control and
measurement device interface ”COMEDI”
13 Copyright © Open Source Modelica Consortium
Real‐time synchronization
MDD models typically need real‐time synchronization
For interactive simulations soft r.‐t. is often sufficient
Blocks.OperatingSystem
MDD contains a block for (soft) real‐time synchronization Modelica tools
may provide better (tool‐specific) options!
Standard Windows/Linux desktops ≈ soft r.‐t., but low‐latency kernels can
push limits
14 Copyright © Open Source Modelica Consortium
Modelica’s External Function Interface
function getKey
input Integerkey Code "Key code";
output Integer keyState "Key state" ;
external "C" MDD_keyboardGetKey ( keyCode , k e y S t a t e )
annotation(
Include = "#include \"MDDKeyboard.h\"",
Library = {"X11", "User32" } ) ;
annotation(_ _ ModelicaAssociation_Impure = true);
end getKey;
Include header file MDDKeyboard.h =⇒ use # if , # elif , etc. in header file
for platform differentiation Link with libraries X11 and User32
Declare function impure =⇒ don't optimize call away!
X11↔Linux, User32↔Windows, but this cannot be stated
Workaround: Link with all libraries and provide dummy libraries for
libraries missing for a platform
15 Copyright © Open Source Modelica Consortium
Serial packager
External Object Aliasing
External objects are propagated through connections
Hence, aliasing equations are generated (in.pkg = out.pkg)
Hence, objects are not explicitly created by calling an external
object constructor
not allowed in Modelica v3.3!
Automatic Buffer Size
Ext. obj. constructor needs bufferSize of C byte array
Setting bufferSize manually is possible, but bufferSize can also be
deduced automatically by solving a system of initial equation
not supported by all Modelica tools and a specification corner
case!
16 Copyright © Open Source Modelica Consortium
DLR and TUD Demonstrators
DLR Institute of System Dynamics and Control: DLR
Robotic Motion Simulator & other demonstrators
Force‐feedback steering wheels connected via CAN
blocks
Consumer based input devices such as pedals
via JoystickInput block
TUD Chair of Construction
Machinery: Customized control devices
with Arduino connected via serial port blocks
to real‐time simulation. Wireless by using
Bluetooth module with Serial Port Profile
(SPP).
17 Copyright © Open Source Modelica Consortium
Linköping University, Embedded Control Demonstrator
SBHS (Single Board Heating System)
Single board heating system (from IIT
Bombay)
Use for teaching basic control
theory
Usually controlled by serial port (set
fan value, read temperature, etc)
OpenModelica can generate code
targeting the ATmega16 on the
board (AVR-ISP programmer in the
lower left).
Program size is 4090 bytes including
LCD driver and PID-controller (out of Movie Demo, see next page!
16 kB flash memory available).
18 Copyright © Open Source Modelica Consortium
SBHS (Single Board Heating System)
Wrap‐up: Modelica_DeviceDrivers
Free library for interfacing hardware drivers Cross‐platform
(Windows and Linux)
UDP, SharedMemory, CAN, Keyboard, Joystick/Gamepad, … DAQ cards for
digital and analog IO (only Linux)
Developed for interactive real‐time simulations
Works in Dymola, SimulationX, and (for the most part) OpenModelica
20 Copyright © Open Source Modelica Consortium
Outlook
Many conceivable future extensions due to myriad number of (hardware)
devices and communication protocols
Frequently requested: Revised data serialization, possibly using LCM,
MessagePack, or similar
Internet of Things (IoT) related extension, e.g., support mqtt protocol
Support of embedded systems beyond the current prototypical work
Hopefully, further Modelica standard improvements for facilitating the
development of cross‐platform, external C code dependent libraries
Thanks to all contributors and organisations that supported MDD
Pull requests welcome …
21 Copyright © Open Source Modelica Consortium
Exercise – plot keyboard input
Load Modelica_DeviceDrivers in OMEdit
File‐>System Libraries‐>Modelica_DeviceDrivers
Open Model: Modelica_DeviceDrivers.Blocks.Examples.TestInputKeyboard
Simulate the model TestInputKeyboard and during simulation press keys:
space, down, up, left, right in any order you want and as many times as you
want
Plot keyboardInput.*
22 Copyright © Open Source Modelica Consortium
Resources
https://github.com/modelica/
Modelica_DeviceDrivers
23 Copyright © Open Source Modelica Consortium
External Objects in Records
SocketCan and Comedi blocks use a Modelica record for specifying general
hardware settings
Approach: Instantiate record once and pass it to blocks using the device
record Comedi Config
parameter String deviceName = "/dev/comedi0" "Name of Comedi device";
final parameter Comedi dh = Comedi(deviceName) "Handle to Comedi device";
end record ;
Can be interpreted as the record returning the object and assigning
it to another external object (forbidden in Modelica v3.3)
24 Copyright © Open Source Modelica Consortium