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
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.
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.
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).
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.