TIA Frage zu For Schleife in SCL

Martin2XK

Level-2
Beiträge
85
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo liebes Forum,

ich möchte gerne eine For Schleife schreiben, welche mir jedes Element welches zu dem angegebenen Bereich gehört mit logisch 1 also TRUE beschreibt. Meine Schleife sieht so aus:

Code:
FOR "TestDB".i := 22 TO 67 BY 1 DO
  
IF "Sorte".KÄSEKUCHEN THEN
    "Torte".ABC["TestDB".i] := True;
EN_IF;

END_FOR;

"Sorte".KÄSEKUCHEN => Bool
"Torte". => Array of Bool
"TestDB".i => Int


Leider funktioniert das bei mir nicht. Kann mir jemand sagen was bei dem Code falsch ist?
Anmerkung: "Sorte".KÄSEKUCHEN muss logisch 1 sein, erst dann sollen alle Elemente von 22 bis 67 mit logisch 1 beschrieben werden.

Gruß
 
Was funktioniert denn nicht? Der Tippfehler bei „END_IF“ wird es nicht sein?
Ich verwende bei FOR nur temporäre Variablen als Laufvariable, hab aber keinen Dunst ob das Muss ist
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Lässt es sich nicht compilieren, laden oder geht die PLC in Stop?

Wenn die Funktion wie in deiner Anmerkung funktionieren sollt, dann würde ich die FOR->END_FOR innerhalb der IF Anweisung machen.

Code:
IF Käsekuchen = TRUE THEN
  FOR ...
     Torte.ABC[...  ... := True;
  END_FOR;
END_IF;
 
Es wird wohl auch nicht funktionieren, da er nur auf TRUE schreibt. D.h. eine Variable die auf TRUE geschrieben wird, bleibt auch auf TRUE, auch wenn Sorte".KÄSEKUCHEN wieder false wird.

Die Variable könntest du dir eigentlich schenken und einfach eine temporäre Variable nutzen.

Das "BY 1" braucht man in dem Fall auch nicht.
 
Mal als Beispiel ( mit Variable wieder als FALSE setzen wenn "Sorte".KÄSEKUCHEN FALSE ist.
Zu beachten wäre allerdings noch, ob sich der Status der Variable "Sorte".KÄSEKUCHEN zur
Laufzeit ändern kann, z.B. wenn sie über die HMI Kommunikation kommt.

Rich (BBCode):
Code siehe #9
Und Umlaute/Sonderzeichen/Leerzeichen in Variablen solltest du vermeiden. Also statt "Käsekuchen" => "Kaesekuchen"
 
Zuletzt bearbeitet:
Code:
..."Torte".ABC := ...
Das müsste aber jedes mal
Code:
..."Torte".ABC[#i] := ...
heißen, da es ja ein Array ist.
(Das # vor dem i wird nur bei TIA, nicht aber bei Classic benötigt)


PS:
Und das man das ganze IF-Gedöns bei Michael durch 'ne einfache Zuweisung ersetzen könnte, kommt dann natürlich auch noch dazu.
Aber das weiß er selber, denn es sollte ja nur den Unterschied aufzeigen.
😁
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
PS:
Und dass man das ganze IF-Gedöns durch 'ne einfache Zuweisung ersetzen könnte, kommt dann natürlich auch noch dazu.
Das ist mir jetzt peinlich 🤭

V2:
Code:
VAR_TEMP
    i : INT;
END_VAR

FOR i := 22 TO 67 DO
    "Torte".ABC[i] := "Sorte".KÄSEKUCHEN;
END_FOR;

Natürlich nur für den Fall, dass die Variablen wieder auf FALSE wechseln sollen, wenn Käsekuchen FALSE ist.
 
Ihr habt recht, danke :) ich hab nicht dazugeschrieben was nicht funktioniert. Also das _ bei End If fehlte und ja, die Variable muss wieder auf false gesetzt werden, wenn der Käsekuchen false ist,
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich möchte gerne noch etwas hinzufügen. Ist es möglich, 2 Bedingungen also 2 For Schleifen oder einfach nur 2 Indexe in dem Fall i und k zu kombinieren? Ich meine z. B. in dieser Art:

Code:
FOR "TestDB".i := 1 TO 2 and "TestDB".k := 20 TO 24 DO
 
IF "Sorte".KÄSEKUCHEN["TestDB".i] = 0 THEN
    "Torte".ABC["TestDB".k] := True;
END_IF;

END_FOR;
 
Mal als Gedankenanstoß ( hier mit IF/ELSE Konstrukt, da ich nicht weiß, ob Käsekuchen ein ARRAY of BOOL is ).
Code:
FOR "TestDB".i := 1 TO 2 DO
   FOR "TestDB".k := 20 TO 24 DO
 
        IF "Sorte".KÄSEKUCHEN["TestDB".i] = 0 THEN
            "Torte".ABC["TestDB".k] := True;
        END_IF;

   END_FOR;
END_FOR;
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Falls das Array Käsekuchen ein Array of BOOL ist, dann könntest du:
Code:
Statt
IF "Sorte".KÄSEKUCHEN["TestDB".i] = 0 THEN
Folgendes schreiben:
IF NOT "Sorte".KÄSEKUCHEN["TestDB".i] THEN
 
Zuletzt bearbeitet:
Zurück
Oben