Forum: Compiler & IDEs if - verschachteln - aber wie?


von Rocco L. (kaufparkangucker)


Lesenswert?

Hallo,

so wie meine if derzeit aufgebaut ist wird ja erst x und y überprüft und 
dann p und q. Ich würde das gern "gleichzeitig" machen.
In meinem Fall sind x,y,p,q Temperaturen. x,y  sowie  p,q gehören zu 
einem getrennten System. In jedem System sollen Solltemperatur und 
Isttemperaturen verglichen werden. Je nach dem soll eine Heizung ein 
oder aus geschaltet werden.

Blööd ist nur das erst eine If immer kommplett erledigt sein muss bevor 
es zur anderen if geht - bis dahin ist Heizer 2 natürlich schon viel zu 
lange heiß. Wie kann man solche if abfragen sicherer optimieren, so das 
gleichzeitig beide Heizer gesteuert werden können?
1
if(x_ist <= y_soll) 
2
 {
3
  PORTD |= (1<<PD0); //Heizer an
4
  PORTD &= ~(1<<PD1; //Rührer aus
5
 }
6
else if (x_ist > y_soll) 
7
 {
8
  PORTD |= (1<<PD1); //Rührer an
9
  PORTD &= ~(1<<PD0; //Heizer aus
10
 }
11
else  
12
 {
13
  PORTD &= ~(1<<PD0; //Heizer aus 
14
  PORTD &= ~(1<<PD1; //Rührer aus 
15
 }
16
17
if(p_ist < q_soll) 
18
 {
19
  PORTB |= (1<<PC0); // zweiten Heizer an
20
 }
21
else if (p >= q)  
22
 {
23
  PORTB &= ~(1<<PC0); //zweiten Heizer aus
24
 }

Gruß Rocco

von JensM (Gast)


Lesenswert?

Wenn ich mir den Code so anschaue, so dauert e nur wenige Mikrosekunden 
bis der Code vom 2. Heizer ausgeführt wird. In der Zeit überhizt der 
sicher nicht. Wo ist das Problem?

Gruß JensM

von anforferer (Gast)


Lesenswert?

Hallo,

ich behaupte Du hast Dich ein wenig verannt.
Vielleicht erklärst Du uns (Menschlich) Deine Problemstellung.

Dadurch bekommt man selbst auch einen besseren Zugang.

Gegenfrage : Was ist Gleichzeitigkeit ? 1ms, 1µs, 1 ns... ?

von pG (Gast)


Lesenswert?

Rocco L. schrieb:
> Blööd ist nur das erst eine If immer kommplett erledigt sein muss bevor
> es zur anderen if geht


Normalerweise wird ein Programm Zyklisch durchgelaufen.
Wenn deine Hardware schnell ist wird der Code ein paar mal/sek 
durchlaufen.

Wenn das dann erfüllt ist werden die Anweisungen aufgeführt.

Da wartet nichts oder muss komplett durchlaufen sein bis etwas anderes 
erledigt wird.


Du startet ja auch nicht den Taschenrechner(Windows) und musst so lange 
warten bis du den wieder zugemachst hast um Firefox zu starten.

von Rocco L. (kaufparkangucker)


Lesenswert?

Mal sehen ob ich das einigermaßen beschrieben bekomme.
Es sind 2 voneinander getrennte Heizgeräte - die haben nichts 
miteinander zu tun und führen 2 unterschiedliche Experimente aus.

Für jedes der beiden Heizgertäe gebe ich eine Solltemperatur vor die 
erreicht und über einen längeren Zeitraum (30min...5h) gehalten werden 
soll.
Dazu soll immer wieder geprüft werden ob die Isttemperatur in dem 
jeweiligen Wasserbad bereits der Solltemperatur enspricht. Ist die 
jewelige Solltemperatur nicht erreicht soll geheizt werden. Beim 
erreichen der Solltemperatur soll der jeweilige Heizer abgeschaltet 
werden. Fällt die Isttemperatur wieder unter die Solltemperatur so soll 
wieder geheizt werden.

Das ganze Konstruckt von oben steckt noch in einer do Schleife:
1
do{
2
3
//.....
4
//alles von oben
5
//.....
6
7
}while(1);

von xXx (Gast)


Lesenswert?

Dann musst du eben beide Geraete in deiner Schleife regeln.

von Rupert (Gast)


Lesenswert?

Und wie soll jetzt Heizer 2 viel zu lange heiß sein? Gehen wir von einer 
pessimistischen Schätzung aus dass ein Durchlauf 10 ms dauert. Damit 
würden immer noch 100 mal pro Sekunde sämtliche Parameter geprüft. Und 
mir kann jetzt irgendwie keiner erzählen dass ein Heizer sich so schnell 
aufheizen und abkühlen kann, dass jede Millisekunde, die die Prüfung 
länger dauert, kritisch ist.

von JensM (Gast)


Lesenswert?

Wenn das so wie beschrieben ist, sollte es wie gewünscht funktionieren.
Alle if Abfragen werden zyklisch innerhalb weniger µs ausgeführt.

Schnell genug für die Regelung beider Regelkreise.

Nochmal wo ist das Problem?

von Andy A. (crusty)


Lesenswert?

Ich sehe das genauso, so schnell kann kein Heizer sein das er in wenigen 
ms zu stark aufheizt.
Das mit dem gleichzeitig wird auch nicht funktionieren denn wie mein 
Vorredner schon erwähnt hat, ist die Verarbeitung Zyklisch also immer 
eins nach dem anderen.
Da wird dir nix anderes übrig bleiben als erst den Soll-Ist Vergleich 1 
abzufragen und dann den Soll-Ist Vergleich 2 (So machst du es ja auch)

Vielleicht denkst du im Moment einfach zu kompliziert.

von seppl (Gast)


Lesenswert?

Rocco L. schrieb:
> if(x_ist <= y_soll)
>  {
>   PORTD |= (1<<PD0); //Heizer an
>   PORTD &= ~(1<<PD1; //Rührer aus
>  }
> else if (x_ist > y_soll)
>  {
>   PORTD |= (1<<PD1); //Rührer an
>   PORTD &= ~(1<<PD0; //Heizer aus
>  }
> else
>  {
>   PORTD &= ~(1<<PD0; //Heizer aus
>   PORTD &= ~(1<<PD1; //Rührer aus
>  }

Du bist dir bewusst, dass die welt untergeht wenn er in das letzte else 
kommen sollte?

von Rocco L. (kaufparkangucker)


Lesenswert?

Jetzt sehe ich was ich vergessen habe. Ich habe noch einen Motor der 
eine Probe zwischen den Beiden Wasserbädern hin und her fährt...
Die Probe fährt zunächst in das erste Wasserbad und wenn deren 
Temperaturen gleich sind fährt sie in das andere Wasserbad und wenn 
deren Temperaturen gleich sind geht es wieder zurück ins erste Wasserbad 
und immer so weiter.
Damit der Motor weis wenn die Probe im Wasserbad ist, hat jedes 
Wasserbad einen Anschlagtaster.
Der Motor soll also so lange in Richtung eines Wasserbades fahren bis 
der jeweilige Anschlagtaster auslöst.
Die Anschlagtaster habe ich WB und KB genannt
CW heißt Clockweise: Motor im Uhrzeigersinn drehen
CCW ist Counter Clockwise: Motor entgegen dem Uhrzeigersinn drehen
1
if ((x_temp_ist <= y_temp_soll) && (!(PINC & (1<<WB))))
2
   {  
3
    //Fahre ins Wärmebad        
4
    PORTC &= ~(1<<CW);
5
    PORTC |= (1<<CCW);  
6
    while(!(PINC & (1<<WB))){} //solange ins Wärmebad fahren bis Anschlagtaster erreicht ist
7
   }
8
else if ((x_temp >= z_temp_soll) && (!(PINC & (1<<KB))))
9
        {        
10
  //Fahre ins Kälteebad
11
  PORTC &= ~(1<<CCW);
12
  PORTC |= (1<<CW);
13
  while(!(PINC & (1<<KB))){} //solange ins Kältebad fahren bis Anschlagtaster erreicht ist
14
  }
15
  else{
16
        PORTC &= ~(1<<CW);
17
        PORTC &= ~(1<<CCW);  
18
      }
19
    
20
    
21
//SollTempSchalter ist ein Dill-Schalter an dem ich die Solltemperatur einstelle
22
    
23
if(z_temp_soll < SollTempSchalter)
24
  {  
25
   //Heizung an        
26
   HEIZUNG_OUTB |= (1<<HOT);
27
   HEIZUNG_OUTB |= (1<<HOT_LED);      
28
  }
29
else if ( temp_pc2_int >= SollTempSchalter )
30
      {        
31
  //Heizung aus
32
  LED_OUTB &= ~(1<<HOT);
33
  LED_OUTB &= ~(1<<HOT_LED);
34
      }

Richtig störend sind dabei die "while" Schleifen, da ist auch die 
erwähnte Wartezeit in der der Heizer heizt und heizt..
Hat da jemand eine Idee wie ich das besser lösen kann?

von Krapao (Gast)


Lesenswert?

Die Schleifen haben für mich keinen Sinn. Wenn sie weggelassen werden 
wird die if-Bedingung beim nächsten übergeordneten Schleifendurchlauf 
wieder geprüft und dabei werden die Endschalter über das && eh 
überprüft.

von anforferer (Gast)


Lesenswert?

Wie wäre es wenn Du das ganze als FSM schreibst !?
Das ganze wird dann gleich viel einfacher...

Bzw gib uns doch mal den ganzen Source und nicht brocken für brocken

von Rocco L. (kaufparkangucker)


Lesenswert?

habe es hin bekommen - closed

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.