OpenModelica (im Folgenden als OM bezeichnet) kann aufgrund seiner schwachen Parameterstudienfunktion und der Funktionen zur Verarbeitung, Analyse und Visualisierung von Ergebnissen unbefriedigend sein. Da OM eine Funktion zum Verknüpfen mit Python hat, kann der Mangel an OM möglicherweise durch Ausführen von Berechnungen und Verarbeiten von Ergebnissen in Python ausgeglichen werden. Um dies zu bestätigen, überprüfen Sie zunächst den Betrieb der Python-OM-Verknüpfungsfunktion und verarbeiten Sie die Berechnungsergebnisse mit einer Datenanalysebibliothek namens Pandas. Python ist fast unerfahren. Bitte weisen Sie auf Fehler hin.
OM hat drei Funktionen zum Verknüpfen mit Python. Es führt hauptsächlich OM-Befehle von Python aus.
omc.sendExpression("simulate(BouncingBall, stopTime=3.0)")
mod.simulate()
Wir werden den Betrieb des grundlegendsten OMPython überprüfen. Die Ausführung auf der Python-Seite erfolgt in Jupyter Lab.
Windows10 Home 1809 conda version : 4.5.4 conda-build version : 3.10.5 python version : 3.6.5.final.0 JupyterLab : 1.2.6 OpenModelica : 1.13.2 64bit
Installieren Sie gemäß dem unten stehenden Read Me. https://github.com/OpenModelica/OMPython
Es wird davon ausgegangen, dass OM und Anaconda im Voraus installiert werden.
① Starten Sie die Anaconda-Eingabeaufforderung und wechseln Sie in den folgenden Ordner Hier ist "% OPENMODELICAHOME%" der Pfad direkt unter dem Ordner, in dem OM installiert ist.
cd %OPENMODELICAHOME%\share\omc\scripts\PythonInterface
② Installieren Sie mit dem folgenden Befehl
python -m pip install -U .
Ich habe diese Nachricht erhalten.
Could not install packages due to an EnvironmentError: [WinError 5]Zugriff verweigert.: 'C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\Anaconda3_64\\Lib\\site-packages\\future'
Consider using the `--user` option or check the permissions.
Die Fehlermeldung ist sehr nett. Mit --user
wie angegeben erneut ausführen. erledigt.
python -m pip install --user -U .
③ Starten Sie Jupyter Lab, um zu überprüfen, ob es installiert ist. Starten Sie zum Starten Anaconda Navigator über das Startmenü und starten Sie "Jupyter Lab". Wählen Sie Python für Notebook.
④ Führen Sie Folgendes aus
import OMPython
help(OMPython.ModelicaSystem)
Das Bild von Jupyter Lab sieht so aus. Intuitiv und einfach zu bedienen. Mit Strg + Eingabetaste ausführen. Fügen Sie Zelle b ein und löschen Sie d zweimal.
Help on class ModelicaSystem in module OMPython:
class ModelicaSystem(builtins.object)
| Methods defined here:
|
| del(self)
|
| init(self, fileName=None, modelName=None, lmodel=[], useCorba=False)
| "constructor"
| It initializes to load file and build a model, generating object, exe, xml, mat, and json files. etc. It can be called :
| •without any arguments: In this case it neither loads a file nor build a model. This is useful when a FMU needed to convert to Modelica model
| •with two arguments as file name with ".mo" extension and the model name respectively
| •with three arguments, the first and second are file name and model name respectively and the third arguments is Modelica standard library to load a model, which is common in such models where the model is based on the standard library. For example, here is a model named "dcmotor.mo" below table 4-2, which is located in the directory of OpenModelica at "C:\OpenModelica1.9.4-dev.beta2\share\doc\omc estmodels".
| Note: If the model file is not in the current working directory, then the path where file is located must be included together with file name. Besides, if the Modelica model contains several different models within the same package, then in order to build the specific model, in second argument, user must put the package name with dot(.) followed by specific model name.
| ex: myModel = ModelicaSystem("ModelicaModel.mo", "modelName")
|
| convertFmu2Mo(self, fmuName)
| In order to load FMU, at first it needs to be translated into Modelica model. This method is used to generate Modelica model from the given FMU. It generates "fmuName_me_FMU.mo". It can be called:
| •only without any arguments
| Currently, it only supports Model Exchange conversion.
|
| - Input arguments: s1
| * s1: name of FMU file, including extension .fmu
|
| convertMo2Fmu(self)
| This method is used to generate FMU from the given Modelica model. It creates "modelName.fmu" in the current working directory. It can be called:
| •only without any arguments
|
| getContinuous(self, *names)
| This method returns dict. The key is continuous names and value is corresponding continuous value.
| If *name is None then the function will return dict which contain all continuous names as key and value as corresponding values. eg., getContinuous()
| Otherwise variable number of arguments can be passed as continuous name in string format separated by commas. eg., getContinuous('cName1', 'cName2')
|
| getInputs(self, *names)
| This method returns dict. The key is input names and value is corresponding input value.
| If *name is None then the function will return dict which contain all input names as key and value as corresponding values. eg., getInputs()
| Otherwise variable number of arguments can be passed as input name in string format separated by commas. eg., getInputs('iName1', 'iName2')
|
| getLinearInputs(self)
|
| getLinearOutputs(self)
|
| getLinearQuantityInformation(self)
|
| getLinearStates(self)
|
| getLinearizationOptions(self, *names)
| This method returns dict. The key is linearize option names and value is corresponding linearize option value.
| If *name is None then the function will return dict which contain all linearize option names as key and value as corresponding values. eg., getLinearizationOptions()
| Otherwise variable number of arguments can be passed as simulation option name in string format separated by commas. eg., getLinearizationOptions('linName1', 'linName2')
|
| getOptimizationOptions(self, *names)
|
| getOutputs(self, *names)
| This method returns dict. The key is output names and value is corresponding output value.
| If *name is None then the function will return dict which contain all output names as key and value as corresponding values. eg., getOutputs()
| Otherwise variable number of arguments can be passed as output name in string format separated by commas. eg., getOutputs(opName1', 'opName2')
|
| getParameters(self, *names)
| This method returns dict. The key is parameter names and value is corresponding parameter value.
| If *name is None then the function will return dict which contain all parameter names as key and value as corresponding values. eg., getParameters()
| Otherwise variable number of arguments can be passed as parameter name in string format separated by commas. eg., getParameters('paraName1', 'paraName2')
|
| getQuantities(self, names=None)
| This method returns list of dictionaries. It displays details of quantities such as name, value, changeable, and description, where changeable means if value for corresponding quantity name is changeable or not. It can be called :
| •without argument: it returns list of dictionaries of all quantities
| •with a single argument as list of quantities name in string format: it returns list of dictionaries of only particular quantities name
| •a single argument as a single quantity name (or in list) in string format: it returns list of dictionaries of the particular quantity name
|
| getSimulationOptions(self, *names)
| This method returns dict. The key is simulation option names and value is corresponding simulation option value.
| If *name is None then the function will return dict which contain all simulation option names as key and value as corresponding values. eg., getSimulationOptions()
| Otherwise variable number of arguments can be passed as simulation option name in string format separated by commas. eg., getSimulationOptions('simName1', 'simName2')
|
| getSolutions(self, *varList)
| This method returns tuple of numpy arrays. It can be called:
| •with a list of quantities name in string format as argument: it returns the simulation results of the corresponding names in the same order. Here it supports Python unpacking depending upon the number of variables assigned.
|
| linearize(self)
| This method linearizes model according to the linearized options. This will generate a linear model that consists of matrices A, B, C and D. It can be called:
| •only without any arguments
|
| optimize(self)
| This method optimizes model according to the optimized options. It can be called:
| •only without any arguments
|
| requestApi(self, apiName, entity=None, properties=None)
| # request to OMC
|
| setContinuous(self, **cvals)
| This method is used to set continuous values. It can be called:
| •with a sequence of continuous name and assigning corresponding values as arguments as show in the example below:
| setContinuousValues(cName1 = 10.9, cName2 = 0.066)
|
| setInputs(self, **nameVal)
| This method is used to set input values. It can be called:
| •with a sequence of input name and assigning corresponding values as arguments as show in the example below:
| setParameterValues(iName = [(t0, v0), (t1, v0), (t1, v2), (t3, v2)...]), where tj<=tj+1
|
| setLinearizationOptions(self, **linearizationOptions)
| This method is used to set linearization options. It can be called:
| •with a sequence of linearization options name and assigning corresponding value as arguments as show in the example below
| setLinearizationOptions(stopTime=0, stepSize = 10)
|
| setOptimizationOptions(self, **optimizationOptions)
| This method is used to set optimization options. It can be called:
| •with a sequence of optimization options name and assigning corresponding values as arguments as show in the example below:
| setOptimizationOptions(stopTime = 10,simflags = '-lv LOG_IPOPT -optimizerNP 1')
|
| setParameters(self, **pvals)
| This method is used to set parameter values. It can be called:
| •with a sequence of parameter name and assigning corresponding value as arguments as show in the example below:
| setParameterValues(pName1 = 10.9, pName2 = 0.066)
|
| setSimulationOptions(self, **simOptions)
| This method is used to set simulation options. It can be called:
| •with a sequence of simulation options name and assigning corresponding values as arguments as show in the example below:
| setSimulationOptions(stopTime = 100, solver = 'euler')
|
| simulate(self)
| This method simulates model according to the simulation options. It can be called:
| •only without any arguments: simulate the model
Data descriptors defined here: |
dict |
dictionary for instance variables (if defined) |
weakref |
list of weak references to the object (if defined) |
Folgen Sie dem offiziellen Tutorial unten. Das Berechnungsziel ist das Verhalten des springenden Balls. https://www.openmodelica.org/doc/OpenModelicaUsersGuide/OpenModelicaUsersGuide-v1.13.2.pdf
① Laden Sie das Modell, verschieben Sie den Ordner usw., um die Berechnung auszuführen
② Ausführung der Berechnung Ausgabe mit CSV zur späteren Ergebnisverarbeitung mit Pandas
③ Erfassung des berechneten Wertes
④ Ergebnisplot
Python und Jupyter Lab sind intuitiv und einfach zu bedienen. Wenn Sie sich an Pandas gewöhnen, ist es wahrscheinlich in Ordnung. Ich war überzeugt, dass es ein Standardwerkzeug für die Datenanalyse mit einfacher Bedienbarkeit ist. Da die Bestätigung und Verarbeitung des Ergebnisses jedoch befehlsbasiert ist, wie bei MATLAB und Excel Ich würde mich freuen, wenn ich ein Diagramm erstellen könnte, indem ich Daten mit der Maus grafischer auswähle und auf die Schaltflächen klicke. Die Verarbeitung wie Berechnungsausführung und Datenverarbeitung (Extraktion der erforderlichen Ergebnisse, Mittelwertbildung und Differenz) wird von Python durchgeführt. Ich denke, dass Sie Excel usw. ordnungsgemäß für die Erstellung von Diagrammen und Berichte für die Übermittlung der verarbeiteten numerischen Werte verwenden können.
Nachtrag Im folgenden Artikel wurde sehr leicht zu verstehen, wie Excel und Python richtig verwendet werden. https://qiita.com/taka000826/items/ca8fa4a1a392728f688c
OMPython hat gut funktioniert und gute Arbeit geleistet. Immerhin habe ich einfach den OMShell-Befehl gedrückt, wie er ist Dies ist sehr hilfreich, da Python das Verhalten behandelt, in dem OMShell nicht gut ist. Ich werde es auch in Zukunft weiter verwenden.
Recommended Posts