This package contains blocks and functions that embed Python 2.7 in Modelica. Data can be sent to Python functions and received from Python functions. This allows for example data analysis in Python as part of a Modelica model, or data exchange as part of a hardware-in-the-loop simulation in which Python is used to communicate with hardware.
See Buildings.Utilities.IO.Python27.UsersGuide for instruction.
Extends from Modelica.Icons.VariantsPackage (Icon for package containing variants).Name | Description |
---|---|
UsersGuide | User's Guide |
Real_Real | Block that exchanges a vector of real values with a Python function |
Functions | Package with functions that call Python |
Examples | Collection of models that illustrate model use and test models |
For each element in the input vector uR[nDblWri]
,
the value of the flag flaDblWri[nDblWri]
determines whether
the current value, the average over the sampling interval or the integral
over the sampling interval is sent to Python. The following three options are allowed:
flaDblWri[i] | Value sent to Python |
0 | Current value of uR[i] |
1 | Average value of uR[i] over the sampling interval |
2 | Integral of uR[i] over the sampling interval |
Type | Name | Default | Description |
---|---|---|---|
Time | samplePeriod | Sample period of component [s] | |
Time | startTime | 0 | First sample time instant [s] |
String | moduleName | Name of the python module that contains the function | |
String | functionName | moduleName | Name of the python function |
Integer | nDblWri | Number of double values to write to Python | |
Integer | nDblRea | Number of double values to be read from the Python | |
Integer | flaDblWri[nDblWri] | zeros(nDblWri) | Flag for double values (0: use current value, 1: use average over interval, 2: use integral over interval) |
Type | Name | Description |
---|---|---|
input RealInput | uR[nDblWri] | Real inputs to be sent to Python |
output RealOutput | yR[nDblRea] | Real outputs received from Python |
model Real_Real "Block that exchanges a vector of real values with a Python function" extends Modelica.Blocks.Interfaces.DiscreteBlock(startTime=0); parameter String moduleName "Name of the python module that contains the function"; parameter String functionName=moduleName "Name of the python function"; parameter Integer nDblWri(min=1) "Number of double values to write to Python"; parameter Integer nDblRea(min=1) "Number of double values to be read from the Python"; parameter Integer flaDblWri[nDblWri] = zeros(nDblWri) "Flag for double values (0: use current value, 1: use average over interval, 2: use integral over interval)";Modelica.Blocks.Interfaces.RealInput uR[nDblWri] "Real inputs to be sent to Python"; Modelica.Blocks.Interfaces.RealOutput yR[nDblRea] "Real outputs received from Python"; Real uRInt[nDblWri] "Value of integral"; Real uRIntPre[nDblWri] "Value of integral at previous sampling instance"; public Real uRWri[nDblWri] "Value to be sent to Python"; initial algorithm uRInt := zeros(nDblWri); uRIntPre := zeros(nDblWri); for i in 1:nDblWri loop assert(flaDblWri[i]>=0 and flaDblWri[i]<=2, "Parameter flaDblWri out of range for " + String(i) + "-th component."); end for; equation for i in 1:nDblWri loop der(uRInt[i]) = if (flaDblWri[i] > 0) then uR[i] else 0; end for; algorithm when {sampleTrigger} then // Compute value that will be sent to Python for i in 1:nDblWri loop if (flaDblWri[i] == 0) then uRWri[i] :=pre(uR[i]); // Send the current value. else uRWri[i] :=uRInt[i] - uRIntPre[i]; // Integral over the sampling interval if (flaDblWri[i] == 1) then uRWri[i] := uRWri[i]/samplePeriod; // Average value over the sampling interval end if; end if; end for; // Exchange data yR :=Buildings.Utilities.IO.Python27.Functions.exchange( moduleName=moduleName, functionName=functionName, dblWri=uRWri, intWri={0}, nDblWri=nDblWri, nDblRea=nDblRea, nIntWri=0, nIntRea=0, nStrWri=0, strWri={""}); // Store current value of integral uRIntPre:=uRInt; end when;end Real_Real;