Philosophiefrage: Break in C

Eben genau das ist das Problem. Meiner (und scheinbar nur meiner, aber was soll's, ich war schon immer ein Einzelkämpfer) Meinung nach wird diese Struktur durch ein Break eben zerbrochen, zwar nicht sehr, aber sagen wir mal, sie hat einen Knacks, der eventuell weiter bricht.
Nehmen wir mal ein einfaches For(Start; Abbruchbedingung; xyz++); Wenn ich z.B. eine Schleife vorzeitig verlassen will, ist für ein break kein bedarf, da ich die Abbruchbedingung ja in dem Schleifenkopf, bzw. Schleifenende bei do/while() untergebracht habe.

Das mag bei einfachen Abbruchkriterien gehen. Wenn aber innerhalb der Schleife auf mehrere Abbruchbedingungen geprüft werden soll, ist ein break sauberer und übersichtlicher als 10 verknüpfte Bedingungen innerhalb der for oder do Anweisung.
 
Bin gerade dabei eine Statusmaschine in ST zu programmieren. Um eine Echtzeitfähigkeit herzustellen muss der abzuarbeitende Code in jedem Zyklus ungefähr gleich lang sein, zumindest nicht in besonderen Fällen extrem lang sein. Ohne BREAK (ich kann es leider nicht im Sprachumfang von ST finden) habe ich das Problem, dass die Abarbeitung des INIT States und des darauf folgenden States entsprechend zu lange dauert. Der Sourcecode sollte sich auf zwei Zyklen verteilen. Momentan bekomme ich das nur hin, indem ich die Statusmaschine auf den Kopf stelle:

CASE iState OF
30: // Aufräumen
20: // Abarbeiten
10: // Initalisieren
END_CASE

von daher würde für mich CASE sehr viel Sinn machen und zur Lesbarkeit des Codes beitragen
 
Hallo,

Also in ST gibt es für CASE Anweisungen kein Break im Sinne wie bei C. Solange du in deinem State iState nicht änderst, wird die SPS immer wieder in diesen State gehen. (so kenne ich das zumindest bei ST nach IEC61131)


eine Statemachine hat in ST in etwa so eine Struktur:

Code:
CASE iState OF

10:
(* do something here *)
iState := !! hier kommt jetzt der state rein, in den du als nächstes wechseln willst !!

20:
(* do something here *)
iState := !! hier kommt jetzt der state rein, in den du als nächstes wechseln willst !!


END_CASE

wenn du die Statemachine von oben weg durchlaufen willst, so musst du iState auch so setzten.

Was mir auch nicht ganz klar ist, was die Echtzeitfähigkeit mit deinem Code zu tun hat. Ich habe Statemachines mit höchst unterschiedlichem Inhalt in den einzelnen States und musste mich um die Einhaltung der Zykluszeit noch nie kümmern. (ausser du hast eine doch wirklich schwache CPU in deiner Steuerung)

Welche Steuerung setzt du denn ein?

cheers
 
Zurück
Oben