TIA Ausführungszeit IF-Statement

Darksmoerff

Level-1
Beiträge
3
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich hätte da eine etwas unkonventionelle Frage:
In meinem Code gibt es teilweise recht große Statemachines aus Case-Strukturen
In diesen kann man bekanntlich keine "Region"s einfügen um den Code übersichtlicher zu gestalten.
Wäre es eine denkbare Lösung "If true then" - Statements einzubauen um den Coden dann mit Folding übersichtlicher zu gestalten?
Schlägt sich das auf die Performance nieder? Ich meine es muß ja im Grunde keine Rechenoperation ausgeführt werden - in anderen Sprachen
optimiert ein Compiler solche Zeilen direkt weg.

CASE var OF
10 :if true then
Zeile 1
Zeile 2
Zeile 3
end_if;
20 :if true then
Zeile 1
Zeile 2
Zeile 3
end_if;
.....

damit bietet mir dann TIA an den Code zu folden:

CASE var OF
10 :if true then ... end_if;
20 :if true then ... end_if;
....

Gruß

Stefan
 
Moin Darksmoerff,

genau das Thema hat mich auch schon manches mal genervt.
Deine Lösung ist unkonventionell aber pragmatisch.
Ob die Zeilen "wegoptimiert" werden kann ich zwar nicht sagen, aber es sollte kein Performanceproblem darstellen. Selbst bei kleinen Steuerungen fällt eine IF-Abfrage (uns es ist ja nur eine, da ja nicht alle abgefragt werden) nicht weiter ins Gewicht. Einzig bei SEHR vielen Abfragen könnte es ein Speicherthema werden. Aber auch das bezweifle ich.

VG
MFreiberger
 
Zuviel Werbung?
-> Hier kostenlos registrieren
in anderen Sprachen
optimiert ein Compiler solche Zeilen direkt weg.
Schreibe die Anweisungen, übersetze und schaue, ob sich die Arbeitsspeicher-Codegröße ändert. Nimm testweise auch mal echte Vergleiche anstatt "IF true" und schau, ob sich da die Arbeitsspeicher-Codegröße ändert.
 
das ist keinen Option ?


Code:
CASE #tempCounter OF
      
    1:  // Statement section case 1
        REGION case1
            // Statement section REGION
            #tempBool1 := #tempBool1;
        END_REGION
      
    2:  // Statement section case 2
        REGION case2
            // Statement section REGION
            #tempBool1 := #tempBool1;
        END_REGION
    3:  // Statement section case 3
        REGION case3
            // Statement section REGION
            #tempBool1 := #tempBool1;
        END_REGION

    4:  // Statement section case 4
        REGION case4
            // Statement section REGION
            #tempBool1 := #tempBool1;
        END_REGION
    ELSE  // Statement section ELSE
        ;
END_CASE;

1709045302972.png
 
Wie meinst du das mit den Regions in case-Anweisungen?
So hier geht es zumindest in V17.
Man kann immer einen Schritt mit einer Region eingrenzen. Das reicht mir zumindest vollkommen aus.

Bildschirmfoto 2024-02-27 um 15.52.22.jpg

PS: Ach, der Peter war schneller ;-)
 
Zuletzt bearbeitet:
Hi, danke für alle Infos und Sorry

das mit den Regions klappt natürlich - ich hatte das mal für mehrere Cases probiert - so nach dem Motto: diese drei Cases sind hierfür, diese drei dafür und so weiter - das geht nicht (Caseübergreifend) - hab ich in meinem Programmiererhirn fälschlicherweise als "Regions in Cases = geht nix" abgespeichert.

GRuß

Stefan
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Stefan,
ich habe neulich einfach mein großes Case in 4 kleine aufgeteilt, dann konnte ich auch die Region um das Case setzen. Man muss dann natürlich aufpassen, dass man nicht ausversehen in die ELSE Sektion rutscht, ich habe dort einfach die Bereiche der anderen Cases abgefragt um das zu vermeiden.
Ist zwar auch nicht der ganz konventionelle Weg, aber aufgrund der Übersichtlichkeit fand ich ihn ganz gut.

Code:
//Stop Mode
REGION Stop Mode
CASE #q_ui_StatePrinter OF                
        1000: ... ;
        1001: ... ;
ELSE IF NICHT Region manual /auto /sleeve THEN
    normale ELSE Anweisung
END_CASE;
END_REGIO

//Manual Mode
REGION Manual Mode
CASE #q_ui_StatePrinter OF                
        2000: ... ;
        2001: ... ;
ELSE IF NICHT Region stop /auto /sleeve THEN
    normale ELSE Anweisung
END_CASE;
END_REGIO

//Automatic Mode
REGION Automatic Mode
CASE #q_ui_StatePrinter OF                
        3000: ... ;
        3001: ...;
ELSE IF NICHT Region stop / manual /sleeve THEN
    normale ELSE Anweisung
END_CASE;
END_REGIO

//Sleeve Change
REGION SleeveChange
CASE #q_ui_StatePrinter OF
        4000: ... ;
        4001: ... ;
ELSE IF NICHT Region Stop / manual /auto THEN
    normale ELSE Anweisung
END_CASE;
END_REGIO
 
Hi striezel,

das Aufteilen habe ich auch schon gemacht, man muß dabei nur bedenken: normalerweise wird pro Zyklus des Blocks nur ein State verwendet, wenn ich aber z.b. im State 3000 in den State 4000 wechsel wird dieser im gleichen Zyklus durchlaufen. KANN Nachteile haben MUSS aber nicht - sollte man nur im Hinterkopf behalten.
 
Ja das hast du Recht, da hatte ich mir auch schon drüber Gedanken gemacht, aber so ein Case Wechsel käme bei mir eh von außerhalb (Betriebsartenwechsel, Not-Aus,...). Durch die Aufteilung und Reihenfolge des Aufrufs kann man aber auch einiges ausschließen (z.B. im selben Zyklus von Auto zurück zum Handbetrieb, etc..
Und wie immer, ein Tod muss man sterben 🫣
 
Zurück
Oben