Absoluter Anfänger! Fragen zu ner Programmierung eines Tanks



  • Hallo,

    ich habe mich hier angemeldet, weil ich relativ dringend Hilfe zu einer bestimmten Sache brauche 😃
    Ich bastle an ner Simulation zu einer Brennstoffzelle. Dazu versuche ich gerade, den Wasserstofftank zu simulieren. Soll alles ganz einfach und übersichtlich werden, daher auch nicht vollkommen physikalisch korrekt. Ich habe nun das Problem, dass ich versuche, den Wirkungsgrad der BSZ über einen Vorgang Entladen/Laden bzw. Leeren/Füllen des Tanks zu bestimmen. Da ich mich fachlich zwar relativ gut auskenne, es mit dem Programmieren aber etwas hinterher ist, bitte ich nun um etwas Hilfe 😃 (sollte hier sicher gar kein Problem sein, vom Schwierigkeistgrad her)

    if(VTank <=VTankmax && VTank> 0.00)
      {dVTank = -BedarfBSZ*spGew;}
       if(VTank <= 0.00)
       {dVTank = 0.00;}
    

    So habe ich es bislang einfach gelöst, einmal das Leeren des Tanks zu simulieren, alles übrigens mit Visual Basic 2010.

    [] VTankmax ist mein maximales Volumen des Tanks (hier 500kg).
    [
    ] VTank ist das derzeitige Volumen mit dem Startwert 500kg.
    [] dVTank ist dann die zeitliche Veränderung des Volumens.
    [
    ] BedarfBSZ ist der Umsatz der BSZ an H2 (in m^3/s) und spGew das spezifische Gewicht von H2 (in kg/m^3). Diese beiden Werte sind fest vorgegeben.

    über
    dydt[9] = dVTank
    und
    VTank = y[9];
    lasse ich mir die Werte dann immer quasi jede Sekunge einmal runter rechnen und in VTank wieder ausgeben.
    Mit Gnuplot habe ich mir das Ganze dann angeschaut und es hat wunderbar funktioniert. Der 500kg Tank wird passend zu den Werten geleert und bleibt dann bei 0kg stehen.
    Nun möchte ich aber, dass sobald der Tank 0.00 erreicht, er wieder durch einen Elektrolyseur gefüllt wird. Dessen Umsatz an H2 habe ich mit "ErzeugElek" deklariert und mit dem entsprechenden Wert versehen.
    Aber egal wie ich was versuche, ich bekomme es nicht hin! Entweder der Tank wird gar nicht mehr geleert, oder er wird plötlich über 500kg gefüllt obwohl die Grenze angeben ist, oder, oder, oder....

    Was ich also zusammenfassend gerne hätte:
    der Tank soll wenn er voll ist, durch die BSZ geleert werden bis 0kg und sobald er geleert ist, wieder komplett bis 500kg gefüllt werden.

    Ich hoffe, ihr könnt mir helfen 😃



  • Du klingst eigentlich wie jemand der grundsätzlich in der Lage ist, das auch zu programmieren.

    Meine Vermutung - besonders in anbetracht der Einrückung in Deinem Beispiel - ist:
    Du setzt die geschweiften Klammern nicht richtig.

    Wenn nicht: bitte ein vollständiges, kompilierbares Beispiel posten.
    Siehe:Wie man Probleme nachstellbar und nachvollziehbar macht



  • naja, so wirklich in der Lage bin ich nicht, ich versuche mich da nun etwas rein zu fummeln.
    Habe noch mal etwas gespielt:

    if(VTank <=VTankmax && VTank > 1)
    	{dVTank = -BedarfBSZ*spGew;}
    
    if(VTank <= 0)
    	{dVTank = +ErzeugElek*spGew;}
    

    Das macht ja nun im Prinzip das was ich möchte. Nur sind die Bedingungen falsch. Hier wird nun bei 1 das letzte mal der Tank geleert und anschließend wieder gefüllt. Sobald nun aber ja VTank>1 wieder zutrifft, wird ja direkt wieder geleert. Daher schwankt der Wert Momentan zwischen 0 und 1.
    Gibt es da irgendwelche Tricks, wie ich die Bedingungen setzen kann, dass erst wieder geleert wird, wenn der Tank vorher ganz voll war?


  • Mod

    Suchst du else?



  • welche Funktion oder so ich suche, weiß ich ja leider nicht. Bin wie erwähnt absoluter Anfänger im Programmieren 😞



  • Du bist vor allem Anfänger im strukturiertem Denken.

    Wie wäre es mit folgender Beschreibung:

    Ich habe einen Tank, der soll mit jeder Iteration geleert werden. Größe des Tanks ist 500 <Einheiten>, zum Anfang hin komplett gefüllt. Jede Sekunde werden X <Einheiten> verbraucht (diese Werte sind Konstanten, ändern sich daher nicht).
    Dafür habe ich diesen Code gehackt:

    const float iteration_consumption = consumption_of_cell * specific_weight;
    
    float tank_current = 500.0f;
    
    do
    {
            /*Wenn wir genug im Tank haben, bitte langsam leeren.*/
            if(tank_current > iteration_consumption)
                    tank_current -= iteration_consumption;
    
            /*Ansonsten ist der Tank halt leer, und wir können ihn nur noch 0 setzen.*/
            else
                    tank_current = 0.0f;
    }
    while(wait_a_sec())
    

    Jetzt will ich aber, dass der Tank, sobald er 0 erreicht hat, wieder in Iterationen aufgefüllt wird. Diesmal in einer anderen Geschwindigkeit. Und in der gleichen Schleife. Mir fehlt aber der Durchblick, wie man dies machen kann, und wäre für einen Stupser in die richtige Richtung dankbar.

    Zumindest verstehe ich deinen Post so. Und dann hätte ich vielleicht so etwas geschrieben wie:

    Du musst in deiner Schleife merken, in welchem Status du dich jetzt befindest - auffüllen oder leeren. Nimm dafür eine Flag-Variable:

    const float iteration_consumption = consumption_of_cell * specific_weight;
    const float iteration_refill = refill_speed * specific_weight;
    const float tank_max = 500.0f;
    
    float tank_current = tank_max;
    
    /*Erwähntes Flag*/
    int on_consumption = 1;
    
    do
    {
            /*Sollen wir leeren*/
            if(on_consumption)
            {
                    /*Wenn wir genug im Tank haben, bitte langsam leeren.*/
                    if(tank_current > iteration_consumption)
                            tank_current -= iteration_consumption;
    
                    /*Ansonsten ist der Tank halt leer, und wir können ihn nur noch 0 setzen.*/
                    else
                    {
                            tank_current = 0.0f;
    
                            /*Nicht vergessen - wir müssen signalisieren, dass wir bitte wieder aufgefüllt werden wollen.*/
                            on_consumption = 0;
                    }
            }
            /*Ansonsten spielen wir den Wiederauflader*/
            else
            {
                    /*Wenn wir noch nicht genug im Tank haben, bitte langsam füllen.*/
                    if(tank_current > iteration_refill)
                            tank_current += iteration_refill;
    
                    /*Ansonsten ist der Tank wieder voll, und wir können ihn voll setzen.*/
                    else
                    {
                            tank_current = tank_max;
    
                            /*Nicht vergessen - wir müssen signalisieren, dass wir bitte wieder verbrauchen wollen.*/
                            on_consumption = 1;
                    }
            }
    }
    while(wait_a_sec())
    

    Aber leider bin ich mir nicht wirklich sicher, was du überhaupt willst. Weil deine Problembeschreibung nicht strukturiert ist. Und deine Beschreibung vom Programmablauf ebenfalls nicht.

    Außerdem: "rumspielen" bringt nur dann was, wenn du Autodidakt bist und die Zeit und Motivation dafür aufbringen kannst. Meistens bringt es dich jedoch nicht weiter, wenn du nicht verstehst, WAS du da machst.



  • DrGrape schrieb:

    welche Funktion oder so ich suche, weiß ich ja leider nicht. Bin wie erwähnt absoluter Anfänger im Programmieren 😞

    Dann mach dich darüber schlau, wie und wo man else einsetzt.



  • danke an alle, habs nun hinbekommen! 🙂


Anmelden zum Antworten