TIA TIA Portal V16 - SCL - While Do

CallHeTempi

Level-2
Beiträge
84
Reaktionspunkte
6
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Morgen zusammen,
ich möchte ein Programm zur Steuerung von Förderbändern, einer "Sortier-Maschine" schreiben, komme mit SCL schon recht gut klar, scheitere aber am schreiben von "Do While Schleifen"
Sobald ich eine Do While Schleife erstelle und das Programm in die SPS lade, bekomme ich den Fehler "Fehler in untergelagerter Komponente".
Es liegt definitiv an der Do While Anweisung, den wenn ich die Schleife weglasse, funktioniert mein Programm. So in etwa soll der Code innerhalb der Schleife aussehen.
Code:
WHILE #Lichtschranke = TRUE DO
    IF #OBT = TRUE THEN
        // Statement section IF
        "DC Motor links" := TRUE;
    ELSIF #LTK = TRUE THEN
        "Dc Motor rechts" := TRUE;
    END_IF;
END_WHILE;
Übersehe ich irgendwas oder sind IF-Anweisungen innerhalb einer Do While in SCL einfach nicht möglich?

Vielen Dank im voraus.Screenshot (153).png
 
Code:
WHILE #Lichtschranke = TRUE DO
    IF #OBT = TRUE THEN
        // Statement section IF
        "DC Motor links" := TRUE;
    ELSIF #LTK = TRUE THEN
        "Dc Motor rechts" := TRUE;
    END_IF;
END_WHILE;

Das passt halt nicht zu einer zyklischen Steuerung. Statt While IF nehmen, Motor links / rechts wird bei dir nicht mehr zurück gesetzt, Leerzeichen im Variablennamen vermeiden.

Folgendes wäre möglich:
Code:
"DcMotorLinks" := #Lichtschranke AND #OBT;
"DcMotorRechts" := #Lichtschranke AND #LTK;

oder besser noch
Code:
"DcMotorLinks" := #Lichtschranke AND #OBT AND NOT "Dc MotorRechts";
"DcMotorRechts" := #Lichtschranke AND #LTK AND NOT "DC MotorLinks";
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Übersehe ich irgendwas oder sind IF-Anweisungen innerhalb einer Do While in SCL einfach nicht möglich?
Wenn die SPS in einer While-Schleife "hängt", dann wird halt der restliche Code der SPS nicht mehr bearbeitet und irgendwann spricht dann die Zykluszeitüberwachung an.
 
Dadurch wirst du eine Zykluszeitüberschreitung bekommen, sobald die Lichtschranke TRUE ist.
Dein Programm muss ja zyklisch durchlaufen, bleibt aber an dieser Stelle einfach "hängen".
Sobald der OB1 länger als die eingestellte maximale Zykluszeit braucht, um fertig zu werden, gibt es einen Fehler.

(PS: Das "= TRUE" im If und While kannst du dir sparen)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ah okay! Bedeutet das, das "DcMotorLinks" dann "TRUE" ist, solange #Lichtsschranke AND #OBT "TRUE" sind?
Genau

Du brauchst es in SCL nicht so schreiben:
Code:
IF #Lichtschranke = TRUE THEN
Besser, lesbarer und moderner ist es so:
Code:
IF #Lichtschranke THEN
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Für alle mit der selben Frage, ich hab das jetzt so realisiert. Finde es auch deutlich schöner!
Code:
IF #OBT THEN
    RESET(S_BIT := #Motor,
          N := 1);
    SET(S_BIT := #"Motor VOr",
        N := 1);
END_IF;
IF #LTK THEN
    RESET(S_BIT := #"Motor VOr",
          N := 1);
    SET(S_BIT := #"Motor",
        N := 1);
END_IF;
 
IF #OBT THEN
RESET(S_BIT := #Motor,
N := 1);
SET(S_BIT := #"Motor VOr",
N := 1);
END_IF;
IF #LTK THEN
RESET(S_BIT := #"Motor VOr",
N := 1);
SET(S_BIT := #"Motor",
N := 1);
END_IF;

Finde es auch deutlich schöner!
Wie wäre es mit einem Zweizeiler:
Code:
Motor := #OBT AND NOT #LTK;
MotorVor := #LTK AND NOT #OBT;
 
Für alle mit der selben Frage, ich hab das jetzt so realisiert. Finde es auch deutlich schöner!
Code:
IF #OBT THEN
    RESET(S_BIT := #Motor,
          N := 1);
    SET(S_BIT := #"Motor VOr",
        N := 1);
END_IF;
IF #LTK THEN
    RESET(S_BIT := #"Motor VOr",
          N := 1);
    SET(S_BIT := #"Motor",
        N := 1);
END_IF;
Naja, "viel schöner" sei mal dahingestellt.
Geht auch so:

Code:
IF #OBT THEN
    #Motor := false;
    #"Motor VOr" := true;
END_IF;
IF #LTK THEN
    #"Motor VOr" := false;
    #"Motor" := true;
END_IF;
 
Ohja das ist noch besser!
Was sieht Deine Logik vor, wenn #OBT und #LTK beide FALSE sind?
Üblicherweise programmiert man SPS nicht mit solchen unübersichtlichen und oft unvollständigen IF..THEN-"Orgien", sondern eher so:
Code:
Motor := (#OBT OR Motor) AND NOT #LTK;

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Geht auch so:

Code:
IF #OBT THEN
#Motor := false;
#"Motor VOr" := true;
END_IF;
IF #LTK THEN
#"Motor VOr" := false;
#"Motor" := true;
END_IF;
Nein, geht nicht.

Wird z.B. #OBT TRUE dann wird #MotorVor auf TRUE geschaltet. Wird nun #OBT FALSE und #LTK ist auch FALSE, so bleibt #MotorVor dauerhaft auf TRUE
 
Ohja das ist noch besser!
Was ist denn an Michaels ZweiZeiler sooo viel unschöner, als an Marios AchtZeiler?
Ich verstehe nicht, warum einfache WertZuweisungen offensichtlich auf Abneigung stossen, während aufwändigere IF-Konstrukte sofort als schöner, einfacher, übersichtlicher akzeptiert und bevorzugt werden. :mad:
Ich vermute weiterhin, dass dies ein Einfluss von der HochSprachenProgrammierung sein muss. Anscheinend werden dort WertZuweisungen logischer VerknüpfungsErgebnisse so was von totgeschwiegen, als gebe es sie gar nicht?
Die Verwendung der IF-Konstrukte verleitet immer wieder dazu, dass Kombinationen aus Zuständen, die durchaus auftreten können, bei der Umsetzung als IF-Konstrukt schlichtweg vergessen werden.
 
Was sieht Deine Logik vor, wenn #OBT und #LTK beide FALSE sind?
Üblicherweise programmiert man SPS nicht mit solchen unübersichtlichen und oft unvollständigen IF..THEN-"Orgien", sondern eher so:
Code:
Motor := (#OBT OR Motor) AND NOT #LTK;

Harald
Wahnsinn! Danke dir. Hast einfach mal meine drölf Zeilen Code durch zwei ersetzt. :D Langsam wird ein Schuh draus.

IF..THEN Orgien..Made my Day

PS: Danke das du das du die Problematik, mit der ich mich als nächstes befassen musste, nämlich der, was passiert wenn beide FALSE sind direkt gelöst hast.
 
Zurück
Oben