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, double
    pk) {

    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ägheitsmoment

    s=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(b
    kal));

    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(b
    kar));
    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(b
    kar));
    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+h
    a; //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 machen

    Wir 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ß Thomas

    Lass 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! 😉


Anmelden zum Antworten