Difference between revisions of "HANtune/MATLAB Interface"
(→Connecting to the MATLAB Engine) |
|||
Line 26: | Line 26: | ||
CurrentConfig.getInstance().addSoftwareLibrary(enginePath)</nowiki> | CurrentConfig.getInstance().addSoftwareLibrary(enginePath)</nowiki> | ||
− | Import the engine and connect to a ''running instance'' of MATLAB. | + | Import the engine and connect to a running instance of MATLAB. |
+ | |||
+ | ''Note: The scripts assumes there is shared instance of MATLAB currently running. To to share an instance of MATLAB, go to the command window of MATLAB and enter: '''Matlab.Engine.shareEngine'''. If you don't want to connect to a running instance, but start a new instance of MATLAB instead, remove the '''engines[0]''' argument from the call to MatlabEngine.connectMatlab().'' | ||
<nowiki> | <nowiki> |
Revision as of 09:28, 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.
Contents
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.
Note: The scripts assumes there is shared instance of MATLAB currently running. To to share an instance of MATLAB, go to the command window of MATLAB and enter: Matlab.Engine.shareEngine. If you don't want to connect to a running instance, but start a new instance of MATLAB instead, remove the engines[0] argument from the call to MatlabEngine.connectMatlab().
#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!'