C Bedingungen die immer wieder neu erfüllt sein müssen

Gast #498337
Lesenswert?

Hallo,

ich habe folgendes Problem. Für eine uC-Netzteilsteuerung durchläuft der 
Code Bedingungen. Diese sind von einander abhängig. Ist Bedingung 1 
erfüllt. Teste die Bedingung 2. Ist Bedingung 1 & 2 erfüllt teste 
Bedingung 3 usw...

In C sind das dann schwer verschachtelte If else Codes. Echt ätzend.

 if(portreg->portb.bit.PWR_OK == 1)
  {
    if(portreg->portb.bit.SOFT_OK == 1)
    {
      // Reset Flg ...
      if(uTimeControlFlg.sTimeControlFlg.DCOver == 1)
      {
        ....
        if{...}
      }
      else....
    else
    {
       // Generate error
    }
  usw.

Wie man schnell sieht ist dieser Code total unübersichtlich. Mir würden 
hier so eine Art Statemachine viel besser gefallen (switch case). 
Allerdings müßte man dann in jedem Zustand alle vorhergehenden 
Bedingungen testen. Ist auch Mist.

Vieleicht kennt Ihr das Problem oder habt einen guten 
Codestruktur-Vorschlag. Bin echt gespannt auf Eure Lösungen.

Sebastian

Gast #498342
Lesenswert?

Ohne die genaue Applikation zu kennen kann man nicht
pauchal sagen, ob ne Statemachine helfen würde.

Ich finds persönlich aber deutlich übersichtlicher,
wenn man in solchen fällen, wie deinem obigen, auf das
NICHTerfülltsein der Bedingung(en) testet und dann ggfs. abbricht

Beispiel:

bool TesteBedingungen()
{
  // teste nacheinander verschiedene bedingungen
  if (bedingung_1 == FALSE) return FALSE;
  if (bedingung_2 == FALSE) return FALSE;
  if (bedingung_3 != 42) return FALSE;

  // alles erfüllt
  return TRUE;
}

Ohne die Einrückerei liest sich sowas viel besser.
Abgesehen davon muß man sowieso ab und an mal überlegen,
ob sich das was man abtesten möchte, nicht auch anders
ausdrücken läßt.

Gast #498912
Lesenswert?

Man kann eine State-Machine definieren.
Erst überlegt man, wieviele Zustände es im System überhaupt gibt.
Jeder existierende State kriegt eine Nummer.
Die Nummer zählt / setzt man entsprechend in jedem State.

Die Übergangbedingungen von einem bestehenden Zustand in den nächsten 
fragt man ab, indem die jeweiligen Übergangsbedingungen über  &&  und 
||  wie bereits geraten verknüpft werden.

In main()  erfolgt die Verzweigung über  case  anhand der 
Zustandsnummer.

Gast #498926
Lesenswert?

Du kannst dir auch 'Merkerbytes' anlegen und jedemal wenn eine Bedingung 
erfüllt wird ein Bit dafür setzen und löschen wenn sie nicht erfüllt 
ist. Dann kannst du die Merkerbytes mit Switch/case und der richtigen 
Verknüpfung abfragen.
Leider kenne ich das Programm nicht und weiß somit nicht wie einfach 
Merkerbits gesetzt werden können (z.B. bei der AD-Wandlung gleich 
Grenzwerte abfragen? Wenn Schalter oder Ausgänge betätigt/gesetzt 
werden?). Dazu müsstest du die Ein- Ausgänge in einer Schleife abfragen 
(nicht dort vernüpfungen abfragen).

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren