WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Excel Datei direkt in SIMULINK nicht zu verarbeiten

 

Rechenknecht86
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 03.03.15
Wohnort: Hannover
Version: ---
     Beitrag Verfasst am: 14.05.2015, 21:33     Titel: Excel Datei direkt in SIMULINK nicht zu verarbeiten
  Antworten mit Zitat      
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
clear all;
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;
 



AUSGABE:

Drehzahl =

0
585.16
1162.09
1741.76
2318.68
2722.53
3178.57
3464.29
4035.71
4631.87
5228.02
5810.44
6002.75

Drehmoment =

262.02
262.02
262.02
262.02
262.02
262.02
236.69
217.81
183.48
143.99
115.66
95.49
94.64

P2_output =

0
16.31
32.19
47.85
63.95
75.32
79.40
79.83
78.33
70.60
63.73
58.80
56.01

U_voltage =

7.94
16.31
32.19
47.85
63.95
75.32
75.32
75.32
75.32
75.32
75.32
75.32
75.32

I_current =

74.89
74.89
74.89
74.89
74.89
74.89
74.89
74.89
74.89
66.95
60.30
55.79
52.36

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)
 
a=1;
for x=3:-1:0
 
n_eingang=input('Eingabe:');
 
if (n_eingang < min(Drehzahl))||(n_eingang > max(Drehzahl))
 
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)
 
end
end
 

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
 
function [M_out,P2_out, U,I] = Formel(n_mot)
 
%Auslesen MotorKennfeld aus Excel-Datei
 
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);
 
% Lineare Interpolation - Drehzahl / Drehmoment
x = Drehzahl; % x-Datenwerte
y = Drehmoment; % y-Datenwerte
xi = n_mot; % x-Interpolationswerte
yi = interp1(x,y,n_mot,'linear'); % y-Interploationswerte
yi=M_out;
 
% Lineare Interpolation - Drehzahl / P2_output
x = Drehzahl; % x-Datenwerte
y = P2_output; % y-Datenwerte
xi = n_mot; % x-Interpolationswerte
yi = interp1(x,y,n_mot,'linear'); % y-Interploationswerte
yi=P2_out;
 
% Lineare Interpolation - Drehzahl / U_voltage
x = Drehzahl; % x-Datenwerte
y = U_voltage; % y-Datenwerte
xi = n_mot; % x-Interpolationswerte
yi = interp1(x,y,n_mot,'linear'); % y-Interploationswerte
yi=U;
 
% Lineare Interpolation - Drehzahl / I_current
x = Drehzahl; % x-Datenwerte
y = I_current; % y-Datenwerte
xi = n_mot; % x-Interpolationswerte
yi = interp1(x,y,n_mot,'linear'); % y-Interploationswerte
yi=I;
 
end

 
Leider sagt er mir nun:

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!

[EDITED, Jan, Bitte Code-Umgebung verwenden - Danke!]
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 14.05.2015, 22:05     Titel:
  Antworten mit Zitat      
Hallo,

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.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Epfi
Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.05.2015, 06:31     Titel:
  Antworten mit Zitat      
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.
Private Nachricht senden Benutzer-Profile anzeigen
 
Rechenknecht86
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 03.03.15
Wohnort: Hannover
Version: ---
     Beitrag Verfasst am: 17.05.2015, 13:37     Titel:
  Antworten mit Zitat      
Hallo Harald, hallo Epfi!

Zuerteinmal vielen lieben Dank für die schnelle Antwort.

@Harald: Sie haben natürlich recht, das mein "Post" zu umfangreich und ungenau ist. Ich versuche das zukünftig zu konkretisieren.

@Epfi: Derzeit versuche ich gerade mit einem 1-D Lookup Table entsprechende Werte einzulesen.

Table date (Vermuhtlich Wert x? )- Drehzahl:
0
585.16
1162.09
1741.76
2318.68
2722.53
3178.57
3464.29
4035.71
4631.87
5228.02
5810.44
6002.75

Breakpoint 1 (Vermuhtlich Wert y? ) - Drehmoment:
262.02
262.08
262.01
262.03
262.05
262.02
236.69
217.81
183.48
143.99
115.66
95.49
94.64



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.


Viele Grüße
Sebastian Stegen
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 17.05.2015, 14:18     Titel:
  Antworten mit Zitat      
Hallo,

ich würde ja "vermuten", dass du Table Data und Breakpoints1 genau vertauschen musst. Sicherheit würde natürlich die Dokumentation geben...

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Epfi
Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.05.2015, 16:18     Titel:
  Antworten mit Zitat      
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.
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.