Verfasst am: 14.05.2015, 21:33
Titel: Excel Datei direkt in SIMULINK nicht zu verarbeiten
Hallo Liebe Forum Nutzer, ich Grüße Euch!
Derzeit versuche ich mir ein SIMULINK-Model eines E-Fahrzeugs zu erstellen.
Es erhält aus einer *.mat Datei eine von der Zeit abhängige Geschwindigkeit v(t). Also ein Fahrprofil.
Dieses v(t) wird in eine Motordrehzahl umgerechnet, ich nenne sie mal n_mot.
Aus einer MotorKennfeldaufnahme vom Hersteller eines zu verwendenden E-Motors habe ich eine Excel Tabelle erstellt. Sie zeigt mir, bei welcher Drehzahl ich gerade welches Drehmoment, welche Leistung, welchen Strom und welche Spannungsaufnahme habe. Ich habe mir vorab, zum testen, ein *.m-File erstellt. Über readxls lese ich die nötigen Spalten aus der Tabelle um sie dann mit der Eingabe n_mot zu vergleichen.
Code:
% Auslesen MotorKennfeld aus Excel-Datei clearall;
format bank;
MotorKennfeld=xlsread('Mappe1.xlsx')
Drehzahl=MotorKennfeld(1:3:37,2)
Drehmoment=MotorKennfeld(1:3:37,3)
P2_output=MotorKennfeld(1:3:37,4)
U_voltage=MotorKennfeld(1:3:37,5)
I_current=MotorKennfeld(1:3:37,6) plot(Drehzahl,Drehmoment, Drehzahl,P2_output, Drehzahl,U_voltage, Drehzahl,I_current);
grid on;
Zu Beginn habe ich nun vorgehabt, eine Drehzahl abzufragen (zum Test erstmal per Eingabe) und diese mit den Werten der Tabelle zu vergleichen und wenn nötig zwischen ihnen zu interpolieren. Die "for Schleife" soll nur zum Test dienen.
Code:
% Manuelle Eingabe Einer Drehzahl, soll noch ersetzt werden durch automatisches einlesen von n_Motor(t)
fprintf('\n WARNUNG! Die Eingabe muss zischen %4.2f 1/min und %4.2f 1/min liegen \n ',min(Drehzahl),max(Drehzahl)) elseif(n_eingang >= min(Drehzahl))||(n_eingang <= max(Drehzahl))
% Lineare Interpolation - Drehzahl / Drehmoment
x = Drehzahl; % x-Datenwerte
y = Drehmoment; % y-Datenwerte
xi = n_eingang; % x-Interpolationswerte
yi = interp1(x,y,n_eingang,'linear'); % y-Interploationswerte fprintf('\nBei eine Motordrehzahl von %4.2f 1/min hat der E-Motor ein Drehmoment von %4.2f Nm ',n_eingang,yi)
% Lineare Interpolation - Drehzahl / P2_output
x = Drehzahl; % x-Datenwerte
y = P2_output; % y-Datenwerte
xi = n_eingang; % x-Interpolationswerte
yi = interp1(x,y,n_eingang,'linear'); % y-Interploationswerte fprintf('\nBei eine Motordrehzahl von %4.2f 1/min hat der E-Motor ein P2_output von %4.2f W ',n_eingang,yi)
% Lineare Interpolation - Drehzahl / U_voltage
x = Drehzahl; % x-Datenwerte
y = U_voltage; % y-Datenwerte
xi = n_eingang; % x-Interpolationswerte
yi = interp1(x,y,n_eingang,'linear'); % y-Interploationswerte fprintf('\nBei eine Motordrehzahl von %4.2f 1/min hat der E-Motor ein U_voltage von %4.2f V ',n_eingang,yi)
% Lineare Interpolation - Drehzahl / I_current
x = Drehzahl; % x-Datenwerte
y = I_current; % y-Datenwerte
xi = n_eingang; % x-Interpolationswerte
yi = interp1(x,y,n_eingang,'linear'); % y-Interploationswerte fprintf('\nBei eine Motordrehzahl von %4.2f 1/min hat der E-Motor ein I_current von %4.2f A ',n_eingang,yi)
Das funktioniert auch sehr gut, Ich gebe eine Drehzahl ein und das Programm gibt mir alle passenden Werte dazu aus.
Eingabe:388.2
Bei eine Motordrehzahl von 388.20 1/min hat der E-Motor ein Drehmoment von 262.02 Nm
Bei eine Motordrehzahl von 388.20 1/min hat der E-Motor ein P2_output von 10.82 W
Bei eine Motordrehzahl von 388.20 1/min hat der E-Motor ein U_voltage von 13.49 V
Bei eine Motordrehzahl von 388.20 1/min hat der E-Motor ein I_current von 74.89 A
Jetzt das Problem. Ich wollte jetzt in SIMULINK einen MATLAB Formelblock erstellen, der nun die Drehzahl erhält und diese genau wie oben beschrieben, aber diesmal automatisch, einließt und die passenden Werte auf einem Scope ausgibt.
Also v(t) variiert z.B. eine Minute und die Werte aus der Tabelle sind ja dann passend dazu auch anders. Das auf dem Scope über die Zeit auftragen.
Code:
%Motordaten-Verarbeitung
%n_mot ---> Motorkennlinie --> M,P2_out,U_volt und I_cur
The function 'xlsread' is not supported for standalone code generation. See the documentation for coder.extrinsic to learn how you can use this function in simulation. Function 'MATLAB Function2' (#32.183.205), line 8, column 15: "xlsread('Mappe1.xlsx')" Launch diagnostic report.
Component: MATLAB Function | Category: Coder error
Und für die Variablen(hier als Beispiel für "MotorKennfeld"):
Undefined function or variable 'MotorKennfeld'. The first assignment to a local variable determines its class. Function 'MATLAB Function2' (#32.357.370), line 13, column 11: "MotorKennfeld" Launch diagnostic report.
Component: MATLAB Function | Category: Coder error
Es funktioniert also nicht, innerhalb von Simulink direkt aus einer Excel-Datei zu lesen und deshalb weiss er auch nicht was "Drehzahl", "Drehmoment", etc ist.
Gibt es dafür bessere, funktionierende Möglichkeiten?
From File oder From Workspace scheint ja stets Zeitabhängigkeit vorauszusetzen oder nicht?
Ich hoffe dass man versteht, wo mein Problem liegt.
Also:
(In SIMULINK)
1.Excel Datei auslesen
2.v(t)-Wert einlesen und in n(t) wandelt
3.n(t) mit n_mot(t) aus Excel Datei vergleichen und passende werte interpolieren.
4. Werte zur weiteren Verarbeitung ausgeben
Vielen Dank für Eure Mühen!
Viele Grüße
Sebastian Stegen!
bei der Länge des Beitrags ist es schwierig, den Überblick zu bekommen.
Generell würde ich empfehlen, die Excel-Datei über einen Model-Callback einzulesen und die Datendann über einen Lookup-Table zu interpolieren.
Ich glaube, Du suchst eine Lookup-Table. Da steckst Du einen Wert rein (n_mot) und bekommst einen korrespondierenden Tabellenwert (z.B. M_out, ...) raus. Das dürfte auch etwas schneller sein, als in jedem Rechenschritt eine Excel-Datei zu öffnen...
Das Laden der Datei machst Du vor der Simulation einem Matlab-Skript und speicherst alle Werte in Variablen, die Du dann bei den Parametern der Lookup-Table einsetzt.
Ansonsten noch ein Hinweis am Rande: die Drehzahl eines Motors hat nicht sehr viel mit seinem Drehmoment und den fließenden Strömen zu tun. Das Kennfeld gibt Dir wahrscheinlich lediglich an, welches Drehmoment der Motor liefern *kann* (aber nicht zwangsweise tut), welche Spannung man dazu anlegen muss und welchen Strom das zur Folge hat.
Wenn Du mit 100km/h bergab rollst, muss der Motor eine andere Leistung liefern, als wenn Du mit der gleichen Geschwindigkeit einen Berg hoch fährst. Logisch. Bergab: kein bzw. kaum Strom, Spannung, Drehmoment. Bergauf: so viel Drehmoment, dass der Motor die Hangabtriebskraft, die Reibung, den Luftwiderstand usw. gerade ausgleicht und die Summe der angreifenden Kräfte null und die Geschwindigkeit des Fahrzeugs deswegen konstant ist (vgl. Newton).
Welches Drehmoment der Motor liefern muss, hat also weniger damit zu tun, wie schnell der Motor sich dreht, sondern viel mehr damit, wie groß die am Fahrzeug angreifenden Kräfte sind und welchen Beitrag der Motor leisten muss, das Kräftegleichgewicht so zu verschieben, dass das Fahrzeug entweder die Geschwindigkeit hält oder zur gewünschten Geschwindigkeit hin beschleunigt oder verzögert.
Leider beschwert sich Matlab, das die Daten nicht monot steigend/ fallen sind. Zumindest verstehe ich das so.
Fehlermeldung:
Values of BreakpointsForDimension1 in 'untitled/1-D Lookup Table' must be monotonically increasing. The problem occurs at the number 13 breakpoint. Please change the breakpoint data or use the fixedpoint tools such as Auto Scaling or Fixed-Point Advisor to determine a different parameter dialog type
Component: Simulink | Category: Block error
Warscheinlich darf jeder x-Wert nur einem y-Wert entsprechen. Wenn das der Fall ist, gibt es da irgendwie abhilfe? Das Drehmoment hat nunmal über einen gewissen Zeitraum den gleichen Wert.
Können Sie mir da weiter helfen?
Mit dem grundsätzlichen Verhalten des Motors ohne und mit Last haben Sie natürlich völlig recht. Ich versuche hier nur ein annährend korrektes Verhalten des Motors zu erstellen und nutze hier erstmal die aufgenommenen Daten.
Das Verhalten einer geregelten elektrischen Maschine in einem dynamischen System lässt sich einfach nicht über eine Lookup-Table abbilden. Auch nicht so ungefähr. Drehzahl und Drehmoment sind bei der Maschine zwei unabhängige Größen. Der Antrieb kann (im Rahmen gewisser physikalischer Grenzen) bei jeder Drehzahl jedes beliebige Drehmoment zur Verfügung stellen. Je nach vorhandener Ausrüstung können Drehzahl und Drehmoment sogar alle möglichen Vorzeichen in allen denkbaren Kombinationen annehmen. Also vorwärts beschleunigen, rückwärts beschleunigen, vorwärts bremsen und rückwärts bremsen. Wobei vorwärts bedeutet, dass die Maschine mit einer beliebigen Geschwindigkeit vorwärts drehen kann. Und beschleunigen bedeutet, dass die Maschine mit einem beliebigen Moment beschleunigen kann.
Es gibt da einfach keine zusammengehörigen Wertepaare wie man sie zum Beispiel bei Anströmgeschwindigkeit und Luftreibungskraft oder Menge der gekauften Wurst und Preis, den man dafür bezahlen muss finden kann.
Üblicherweise würde man die Geschwindigkeit aus dem Fahrprofil als Sollwert für einen Drehzahlregler verwenden, der daraus das Drehmoment berechnet, das erforderlich ist, um eben genau dem Fahrprofil zu folgen. Diese Aufgabe übernimmt normalerweise entweder der Fahrer oder ein Tempomat. In der Simulation würde man wohl am ehesten einen PI-Regler dafür verwenden. Der fährt zwar nicht so, wie ein Mensch, aber so ungefähr passt das schon.
Ansonsten hast Du glaube ich x und y vertauscht. Break Points sind die Werte, die man gewöhnlich auf der x-Achse abträgt und TableData sind die Werte, die man auf der y-Achse finden würde.
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.