Benötige Hilfe
-
Hallo und schönen guten Abend, bin C-Einstiger und wollte ein geschriebenes Programm eigentlich nur anpassen... in diesem ist der Anfahrvorgang eines Fahrzeuges modelliert... nun gibts leider noch einige Probleme..
ich füge das Programm einfach mal an, könnt ihr mir sagen welche Fehler ich gemacht habe bzw. was ich ändern muss um die gewünschten Größen zu ermitteln? Entschuldigt die allgemine Fragestellung...
#include <stdio.h> //Triebstrang
#include <stdlib.h>
#include <math.h>
#define MIN (a,b) ((a<b)?a:b)
#define MAX (a,b) ((a>b)?a:b)
#define PI 3.141592654//Eingangsgrößen wie Fahrbahnsteigung, Reibwertfaktoren, Gang, Fahrpedalweg, Kupplungspedalweg
void e (double t, double wm, double*al, double*myl, doublemyr,
int*G, double*pf, doublepk) {static int shift=0, Gnew=1; static double ts=0.7, ts0;
double upm=30/PI*wm;*al=0.0;
*myl=1.0;
*myr=1.0;//einkuppeln und losfahren
*pf=1.0;
*pk=0.0;
if (t<0.5) {*pf=t/0.5; *pk=1.0-*pf; *G=1; return;}//drehzahlabhängiges Schalten
if (upm>6650. && !shift && *G<5) {shift=1; ts=t; Gnew=*G+1;}
if (upm<2000. && !shift && *G>1) {shift=1; ts0=t; Gnew=*G-1;}
if (shift) {
if (t-ts0>ts) {
shift=0;
} else {
*pk=0.5-0.5*cos(2*PI/ts*(t-ts0));
if (t-ts0>.5*ts) *G=Gnew;
*pf=1-*pk;
}
}
}//Hilfsfunktion billineare Interpolation des Motorkennfeldes
double bilin (double xmax, double ix, double ymax,
double iy, double zd[][5], double x, double y) {int i,j; double p,q;
p=MAX(x,1e-10);
p=(ix-1)*MIN(p,xmax-1e-10)/xmax; i=(int)p;
p=p-i;
q=MAX(y,1e-10);
q=(iy-1)MIN(y,ymax-1e-10)/ymax; j=(int)q;
q=q-j;
return (1-q)((1-p)*zd[i][j] + p*zd [i+1][j]) +
q *((1-p)*zd[i][j+1] + p*zd[i+1][j+1]);
}//Hauptprogramm, Fahrzeugdaten
void main () {
double
h=0.001, //Schrittweite
tend=60, //Stopzeit
jm=0.6,
jgi=0.1,
jgo=0.1,
jr=1,
m=1200,
ca=10000,
da=1,
cs=7500,
Mkm=280,
Ig[]={ //Getriebeübersetzung für drehzahlabhängigs Schalten
-4.15,
0.00,
4.15,
2.52,
1.69,
1.24,
1.00},
id=3.27,
r=0.3,
my=0.9, b=0.17, c=1.6,
Fz=4000,
cw=0.31,
rho=1.293,
A=2.0,
wmmax=7000.*PI/30,
iwm=15,
ipf=5,
Mms[][5]={ //MOtorkennfeld zur Interpolation
-10, -10, -10, -10, -10,
22, 174, 186, 187, 188,
-8, 59, 197, 210, 212,
-29, 24, 200, 217, 222,
-31, 4, 206, 230, 235,
-40, -7, 196, 237, 246,
-44, -11, 180, 239, 248,
-46, -17, 161, 242, 250,
-59, -20, 147, 251, 260,
-72, -28, 132, 250, 258,
-76, -30, 108, 246, 250,
-83, -32, 102, 222, 229,
-85, -42, 100, 200, 206,
-86, -62, 95, 180, 180,
-87 -87, -87, -87, -87},//Anfangswerte der Zustandsgrößen
v=0, wrl=0, wrr=0, wdi=0, wgo=0, //Fahrzeug steht
s=0, tl=0, ta=0, Fl=0, Fr=0,
wm=800.PI/30, //Motor im Leerlauf
//Hilfsvariable
jg, kal, kar, Mm, Mk, Ma, Ml,
Mr, Fw, a, t,
ig, pk, pf, al, myl, myr, dnum,
Mkb, ne, Fls, Frs, Tl, Tr,
Cw=0.5*rho*cw*A;int G=1; //erster Gang eingelegt
for (t=0;t<=tend;t=t+h) { //Simulation von t=0 bis tend
e(t,wm,&al,&myl,&myr,&G,&pf,%pk);
ig=Ig[G+1]; //gangabhängige Getriebeübersetzung
jg=ig*ig*jgi+jgo //Getriebeträgheitsmoments=s+hv; //zurückgelegter Weg
ta=ta+h(wdi-wgo);
tl=tl+h*(wdi/id-.5*(wrl+wrr));Mm=bilin(wmmax,iwm,1.0,ipf,Mms,wm,pf); //Motormoment.=funktion von (Fahrpedal, Drehzahl)
Mkb=(1.0-pk)Mkm; //Kupplungsmoment
dnum=1.5*jm*jg/(jg+ig*ig*jm)/h;
Mk=dnum(ig*wgo-wm);
Mk=MAX(-Mkb,MIN(Mkb,Mk));Ma=ca*ta+da*(wdi-wgo);
Ml=cs*tl;
Mr=Ml;ne=MAX(fabs(rwrl),0.2);
kal=100(rwrl-v)/ne;
Fls=myl*my*Fz*sin(c*atan(bkal));Tl=MAX(0.10,0.01/ne);
FL=Fls+exp(-h/Tl)*(Fl-Fls);//Reifenschlupf und Umfangskraft links
ne=MAX(fabs(rwrl),0.2);
kar=100(rwrl-v)/ne);
Frs=myl*my*Fz*sin(c*atan(bkar));
Tl=MAX(0.10, 0.01/ne);
Fl=Fls+exp(-h/Tl)*(Fl-Fls);//Reifenschlupf und Umfangskraft rechts
ne=MAX(fabs(rwrr),0.5);
kar=100(rwrr-v)/ne);
Frs=myr*my*Fz*sin(c*atan(bkar));
Tr=MAX(0.05, 0.01/ne);
Fr=Frs+exp(-h/Tr)*(Fr-Frs);//Luftwiderstand Fahrzeugaufbau
Fw=-Cw*v*fabs(v);a=(Fl+Fr+Fw)/m-.0981al; //Längsbeschleunigung
v=v+ha; //Fahrzeuggeschw.
wrl=wrl+h/jr*(Ml-rFl); //Radrehzahlen
wrr=wrr+h/jr(Mr-rFr);
wdi=wdi-h/jd(Ma+(Ml+Mr)/id); //Drehzahl Differentialeingang
wm=wm+h/jm*(Mm+Mk); //Motordrehzahl
wgo=wgo+h/jg*(Ma-ig*Mk); //Getriebedrehzahl//Ausgabe Daten an Datei
//#include "trieb.sav"
}
}
Vielen Dank für eure Hilfe, bin grad ein wenig verzweifelt, weil mir die nötige Kenntnis fehlt... Gruß Thomas
-
Als Einsteiger sei dir vieles verziehen!
Bedenke aber bitte, fertige lange Codes mag niemand gerne nach nicht einmal benannten Problemen durchwühlen.1. Übernommenen Code unverändert erst einmal selbst ausprobieren
2. Problemstellen analysieren
3. Code für weitere Fragen auf den Problembereich reduzieren
4. Code durch Einrückungen lesbar machenWir können hier nicht unterscheiden, ob deine Probleme in den Berechnungsansätzen
oder in deren Umsetzung liegen.
-
-
Thomas12 schrieb:
//Ausgabe Daten an Datei
//#include "trieb.sav"
}
}
Vielen Dank für eure Hilfe, bin grad ein wenig verzweifelt, weil mir die nötige Kenntnis fehlt... Gruß ThomasLass mich raten, die Ausgabe geht nicht?
Kein Wunder, denn include kopiert einfach nur vor dem Kompilieren den Inhalt der Datei trieb.sav an die entsprechende Stelle ein.
Für Ausgabe an Dateien musst du FILE benutzen.
Suche mal nach einem Tutorial für C.
-
Jetzt funktionierts;) ja genau, das Programm erstellt jetzt eine Textdatei
fprintf(datei,"| Zeit : %f |Danke für eure Antworten, allerdings hätt ich da noch n Frage, wie kann ich die Daten plotten? Also geplottet werden sollen Momente, Drehzahlen etc. über der Zeit.... geht das so einfach aus einer Textdatei?
Gruß Thomas
-
Du meinst Graphen?
Nein, das geht nicht mit einer Textdatei, da musst du dir eine Lib suchen die das kann.
Z.B. die (eine minute googlen): http://www.gnu.org/software/plotutils/
-
Okay. Kennt sich jemand zufällig mit der Übergabe der Daten in ein Matlab-File aus? Das die Daten eventuell in ein Array übergeben werden und in Matlab dargestellt werden können? Sorry für die nicht fachgebundene Formulierung
-
Auf welchem Gerät (Bildschirm, Drucker, Plotter) willst du die grafische Ausgabe haben? Diese Ausgabe ist heute gewöhnlich pixelorientiert,
seltener vektororientiert. In jedem Falle brauchst du eine passende LIB zur Aufbereitung der X-Y-Daten. Eine MathLib einzusetzen erscheint
unzweckmässig, da du die X-Y-Daten bereits hast.
-
Danke hab alles was ich benötige!