Difference between revisions of "HANtune/MATLAB Interface"

From OpenMBD
Jump to: navigation, search
(Connecting to the MATLAB Engine)
Line 20: Line 20:
 
enginePath = "C:\Program Files\MATLAB\R2017b\extern\engines\java\jar\engine.jar"</nowiki>
 
enginePath = "C:\Program Files\MATLAB\R2017b\extern\engines\java\jar\engine.jar"</nowiki>
  
 +
Add the engine to the java classpath so we can call it from a script.
  
 
  <nowiki>#Add matlab engine to the classpath
 
  <nowiki>#Add matlab engine to the classpath
 
from datahandling import CurrentConfig
 
from datahandling import CurrentConfig
 
CurrentConfig.getInstance().addSoftwareLibrary(enginePath)</nowiki>
 
CurrentConfig.getInstance().addSoftwareLibrary(enginePath)</nowiki>
 +
 +
Import the engine and connect to a ''running instance'' of MATLAB.
  
 
  <nowiki>
 
  <nowiki>
Line 32: Line 35:
 
engines = MatlabEngine.findMatlab()
 
engines = MatlabEngine.findMatlab()
 
engine = MatlabEngine.connectMatlab(engines[0])</nowiki>
 
engine = MatlabEngine.connectMatlab(engines[0])</nowiki>
 +
 +
Optionally you can set the engine as a global variable across all interpreters. This allows you to initialize the engine once and then call it from another script.
  
 
  <nowiki>#Add engine as a global variable to all interpreters
 
  <nowiki>#Add engine as a global variable to all interpreters
 
from nl.han.hantune.scripting import ScriptingManager
 
from nl.han.hantune.scripting import ScriptingManager
 
ScriptingManager.getInstance().setGlobal("engine", engine)</nowiki>
 
ScriptingManager.getInstance().setGlobal("engine", engine)</nowiki>
 +
 +
Optionally we can redirect the output (e.g. print statements, warnings, errors) to the console of HANtune.
  
 
  <nowiki>#Redirect matlab output to HANtune console
 
  <nowiki>#Redirect matlab output to HANtune console

Revision as of 09:19, 23 October 2019

HANtune can be interfaced with MATLAB® (and by extension Simulink®). We can do this by using the MATLAB engine and calling it from a script.

The scripts needed to run this example can be found in HANtune\scripts\examples\MATLAB_Interface. These are:

  • ConnectToMatlab.py
  • ReadSimulinkModel.py
  • createDaqList.m
  • getDaqListData.m


Note: You will need to have installed a version of MATLAB® with the Java MATLAB engine.


Connecting to the MATLAB Engine

The first thing we need to do is tell HANtune where to find the MATLAB engine.

Open ConnectToMatlab.py and change the following line to the location of your MATLAB engine:

#Change this to your location of the MATLAB engine
enginePath = "C:\Program Files\MATLAB\R2017b\extern\engines\java\jar\engine.jar"

Add the engine to the java classpath so we can call it from a script.

#Add matlab engine to the classpath
from datahandling import CurrentConfig
CurrentConfig.getInstance().addSoftwareLibrary(enginePath)

Import the engine and connect to a running instance of MATLAB.

#Import matlab engine
from com.mathworks.engine import MatlabEngine

#Initialize matlab engine
engines = MatlabEngine.findMatlab()
engine = MatlabEngine.connectMatlab(engines[0])

Optionally you can set the engine as a global variable across all interpreters. This allows you to initialize the engine once and then call it from another script.

#Add engine as a global variable to all interpreters
from nl.han.hantune.scripting import ScriptingManager
ScriptingManager.getInstance().setGlobal("engine", engine)

Optionally we can redirect the output (e.g. print statements, warnings, errors) to the console of HANtune.

#Redirect matlab output to HANtune console
from java.lang import System
from nl.han.hantune.scripting import Console
System.setOut(Console.getGUI().getOut())
System.setErr(Console.getGUI().getErr())

Reading data from a running Simulink model

Set your model

#Change these to the name and location of your model
modelName = 'MyModel'
modelPath = 'C:\Users\Michiel Klifman\Desktop'


#Add folders to MATLAB path
from java.lang import System
scriptPath = System.getProperty("user.dir") + "\scripts\examples\MATLAB_Interface"
engine.eval("addpath('" + scriptPath + "')")
engine.eval("addpath('" + modelPath + "')")

Creating a daq list

#Create a daqlist from signals in the model
result = engine.feval(2, 'createDaqList', modelName, 'signals')
daqItemNames = result[0]
daqList = result[1]
daqSize = len(daqList)
#Create a signal for each item in the daq list
signals = []
removeAllSignals()
for name in daqItemNames:
	signal = createSignal(name)
	signals.append(signal)
updateLayout()
print 'DAQ list created with ' + str(daqSize) + ' items'

Reading

#Start the simulation
engine.eval("set_param('" + modelName +"','SimulationCommand','start');")
print 'Simulation started...'


#Read data from the model in Simulink and add it to the signals in HANtune
while (True):
	data = engine.feval('getDaqListData', modelName, daqList, daqSize)
	if not data:
		break

	i = 0
	for value in data:
		signals[i].setValueAndTime(value, 0)
		i += 1

print 'Simulation completed!'