def Simulate(this, sim): from PySimLib.Mat.OutputStream import OutputStream mdl = sim.GetModel() this.__EnsureMatlabConnectionIsSetup() # make sure result folder exists if (not this._DirExists(mdl.resultDir)): os.makedirs(mdl.resultDir) # preparations cmd = "clear" # clean up workspace cmd += "cd " + mdl.simDir + ";" # go to sim dir Simulink.__matlabConnection.run_code(cmd) # send variables cmd = "" for name in mdl.variables: cmd += name + "=" + str(mdl.variables[name].start) + ";" Simulink.__matlabConnection.run_code(cmd) # simulate cmd = "sim('" + mdl.GetFile() + "'" if (not (mdl.startTime is None)): cmd += ", 'StartTime', " + str(mdl.startTime) if (not (mdl.stopTime is None)): cmd += ", 'StopTime', " + str(mdl.stopTime) cmd += ");" cmd += "logsout.unpack('all');" # make all variables to top levels cmd += "clear logsout;" # discard simulation results, as we have direct access to vars now Simulink.__matlabConnection.run_code(cmd) # get all timeserieses outMat = Mat() varList = Simulink.__matlabConnection.get_variable('who') time = None for x in varList: data = Simulink.__matlabConnection.get_variable(x[0][0] + ".Data") if (not (data is None)): matrix = outMat.AddMatrix(x[0][0], 1, len(data)) for y in range(0, len(data)): matrix.SetValue(0, y, data[y][0].item()) tmp = Simulink.__matlabConnection.get_variable(x[0][0] + ".Time") if ((time is None) or (len(tmp) > len(time))): time = tmp # add time matrix = outMat.AddMatrix('time', 1, len(time)) for y in range(0, len(time)): matrix.SetValue(0, y, time[y][0].item()) # write mat file file = open(this.__GetSimResultFilePath(sim), "wb") stream = OutputStream(file) outMat.Write(stream) file.close()
def __save_observer(this): from PySimLib.Mat.Mat import Mat from PySimLib.Mat.OutputStream import OutputStream nan = float("NaN") variables = ["time", "modeID"] + this.observe lastVariable = variables[len(variables) - 1] # get for every simulation the maximum number of datapoints nDataPointsPerSim = [] for p in this.__observer[ "modeID"]: # init all sims with datapoints-length of 1 nDataPointsPerSim.append(1) for key in variables: if (key == "modeID"): continue # unimportant for i in range(0, len(nDataPointsPerSim)): if (len(this.__observer[key][i]) > nDataPointsPerSim[i]): nDataPointsPerSim[i] = len(this.__observer[key][i]) nDataPointsSum = 0 for n in nDataPointsPerSim: nDataPointsSum += n # write mat mat = Mat() # names matrix names = mat.AddTextMatrix("names", len(this.__observer)) i = 0 for key in variables: names.SetString(i, key) i += 1 # values matrix values = mat.AddMatrix("values", len(this.__observer), nDataPointsSum) x = 0 for key in variables: i = 0 y = 0 if (key == "modeID"): # modeID is special... for p in this.__observer[key]: for j in range(0, nDataPointsPerSim[i]): values.SetValue(x, y, p) y += 1 i += 1 else: for points in this.__observer[key]: for p in points: values.SetValue(x, y, p) y += 1 for j in range(len(points), nDataPointsPerSim[i]): values.SetValue(x, y, nan) y += 1 i += 1 x += 1 file = open("result" + os.sep + "observer_data.mat", "wb") stream = OutputStream(file) mat.Write(stream) file.close() # write csv file = open("result" + os.sep + "observer_data.csv", "w") # var names for key in variables: file.write(key) if (key != lastVariable): file.write(";") file.write("\n") # var values y = 0 while (y < nDataPointsSum): x = 0 for key in variables: p = values.GetValue(x, y) x += 1 file.write(str(p)) if (key != lastVariable): file.write(";") file.write("\n") y += 1 file.close()