TIA SCL Programmierungs Hilfe

JollySkillerHD

Level-1
Beiträge
4
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen, da wir zwecks der Corona Kriese Homeoffice betreiben müssen hat uns unser Lehrer einen Auftrag gegeben ein SCL Programm zu schreiben.
Angabe:
(*
Wenn ein Startbefehl gegeben wird ... "Start_fahre_zu_Position"
soll zur jeweiligen Soll_Position
gefahren werden ..."Soll_Pos_Hor"
und "Soll_Pos_Vert".
Jenachdem wo man sich gerade befindet ... "Ist_Pos_Vert"
und "Ist_Pos_Hor"
muss abgefragt werden, welcher Motor einzuschalten ist?


"Motor_Vert_oben"
"Motor_Vert_unten"
"Motor_Hor_re"
"Motor_Hor_li"

Wenn alle Soll_Pos = Ist_Pos , dann soll die "Fertig" Meldung kommen.
( alle Motoren sind dann natürlich auch wieder aus )
*)

Jedoch habe ich noch nie mit SCL programmiert und er meinte er wäre ähnlich (ist es auch) jedoch stoße ich jetzt schon auf meine Grenzen!
Ich hoffe jemand kann mir dabei unter die Arme greifen :cool:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ist der Ansatz soweit richtig?

Code:
FUNCTION_BLOCK "HL_Fahre_In_Position"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
   VAR_INPUT 
      Soll_Pos_Vert : Bool;
      Soll_Pos_Hor : Bool;
      Ist_Pos_Vert : Bool;
      Ist_Pos_Hor : Bool;
      Start_fahre_zu_Position : Bool;
      Endschlater_Hor_li : Bool;
      Endschalter_Hor_re : Bool;
      Endschalter_Ver_oben : Bool;
      Endschalter_Ver_unten : Bool;
   END_VAR


   VAR_OUTPUT 
      Motor_Vert_oben : Bool;
      Motor_Vert_unten : Bool;
      Motor_Hor_re : Bool;
      Motor_Hor_li : Bool;
      Fertig : Bool;
   END_VAR




BEGIN
    (*
        Wenn ein Startbefehl gegeben wird   ... "Start_fahre_zu_Position"
        soll zur jeweiligen Soll_Position  
        gefahren werden                     ..."Soll_Pos_Hor"
                                               und "Soll_Pos_Vert".
        Jenachdem wo man sich gerade befindet ...  "Ist_Pos_Vert" 
                                                und "Ist_Pos_Hor"
        muss abgefragt werden, welcher Motor einzuschalten ist?
    
        "Motor_Vert_oben" 
        "Motor_Vert_unten" 
        "Motor_Hor_re"
        "Motor_Hor_li" 
        
        Wenn alle Soll_Pos   =   Ist_Pos  , dann soll die "Fertig" Meldung kommen.
        ( alle Motoren sind dann natürlich auch wieder aus )
    *)
    
    IF #Start_fahre_zu_Position = TRUE THEN
        #Soll_Pos_Hor := TRUE;
        #Soll_Pos_Vert := TRUE;
    ELSE
        #Soll_Pos_Hor := FALSE;
        #Soll_Pos_Vert := FALSE;
    END_IF;
    
    
    IF #Soll_Pos_Hor =TRUE AND #Soll_Pos_Vert=TRUE THEN
        #Motor_Hor_re := TRUE;
        #Motor_Vert_unten := TRUE;
    ELSE
        #Motor_Hor_re := FALSE;
        #Motor_Vert_unten := FALSE;
    END_IF;
    
    
    IF #Endschalter_Hor_re=TRUE AND #Endschalter_Ver_unten=TRUE THEN
        #Motor_Hor_re := FALSE;
        #Motor_Vert_unten := FALSE;
    ELSE
        #Motor_Hor_re := TRUE;
        #Motor_Vert_unten := TRUE;
    END_IF;
    
    
    IF #Soll_Pos_Hor = #Ist_Pos_Hor AND #Soll_Pos_Vert = #Ist_Pos_Vert THEN
        #Fertig := TRUE;
    ELSE
        #Fertig := FALSE;
    END_IF;
    


END_FUNCTION_BLOCK
 
Zuletzt bearbeitet:
Also ohne auf das Ganze genauer einzugehen
( werden nicht Positionsfenster benötigt, mach dir vielleicht einmal Gedanken darüber )

Für
Code:
IF #Start_fahre_zu_Position = TRUE THEN
reicht auch
Code:
IF #Start_fahre_zu_Position THEN

diese ganzen = TRUE bei BOOLs kannst du dir sparen

Code:
IF #Soll_Pos_Hor = #Ist_Pos_Hor AND #Soll_Pos_Vert = #Ist_Pos_Vert THEN
        #Fertig := TRUE;
    ELSE
        #Fertig := FALSE;
    END_IF;

Aus dem Konstrukt könnte man auch einen Einzeiler machen:
Code:
#Fertig := #Soll_Pos_Hor = #Ist_Pos_Hor AND #Soll_Pos_Vert = #Ist_Pos_Vert;
 
Aber funktionieren wird das Ganze so auch nicht. Beispiel:

Code:
IF #Endschalter_Hor_re=TRUE AND #Endschalter_Ver_unten=TRUE THEN
        #Motor_Hor_re := FALSE;
        #Motor_Vert_unten := FALSE;
    ELSE
        #Motor_Hor_re := TRUE;
        #Motor_Vert_unten := TRUE;
    END_IF;

Deine Motoren werden nur auf FALSE gesetzt, wenn beide Endschalter erreicht wurden.
Wurde z.B. Endschalter_Hor_re erreicht, der andere aber nicht, so dreht der Motor Motor_Hor_re einfach weiter



Es fehlen z.B. weitere Funktionen wie Laufzeitüberwachung.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Beispiel für "mit ohne" IF:
Code:
bGestartet := bStartSignal OR bMotLinks OR bMotRechts OR bMotUnten OR bMotOben ;
bMotLinks  := (HorSol < HorIst) AND bHorEndschalterLinks  AND bGestartet ;
bMotRechts := (HorSol > HorIst) AND bHorEndschalterRechts AND bGestartet ;
bMotUnten  := (VerSol < VerIst) AND bVerEndschalterUnten  AND bGestartet ;
bMotOben   := (VerSol > VerIst) AND bVerEndschalterOben   AND bGestartet ;
bFertig    := bHorEndschalterLinks AND bHorEndschalterRechts AND bVerEndschalterUnten AND bVerEndschalterOben AND NOT bGestartet ;
Die Endschalter verstehen sich als Freigaben, d.h. die melden TRUE solange sie nicht angefahren sind.

PS:
Habe im Code noch die Semikolons ergänzt.
Die Variablen HorSol, HorIst, VerSol und VerIst sind nicht BOOL, sondern enthalten die PositionsWerte. Je nach Bedarf INT, DINT bzw. REAL.
Die Variablen bGestartet und die diversen bMotxxx müssen ihren Inhalt bis zum folgenden Zyklus bewahren (z.B. im FB static sein).
Die Variable bFertig darf temp sein.
Ich hoffe das Beispiel ist verständlich und übersichtlich genug.
Das Verhalten, dass ggfs eine Achse weiterläuft, wenn die andere auf einen Endschalter läuft, ist zwar unüblich, aber war beabsichtigt.
Ich denke Du hast damit ein Beispiel, das sich relativ einfach noch erweitern/umbauen, also irgendwelchen "Sonderwünschen" anpassen lässt.

PPS:
Wenn man ohne die vermeidbaren IF-Abfragen auskommt, also nur WertZuweisungen, logische Verknüpfungen (AND, OR, NOT) und Vergleiche verwendet, lässt sich das ganze sehr leicht in FUP bzw. KOP darstellen. Auch in SCL finde ich es übersichtlicher, weil der Code dann kompakter ist - man sieht mehr auf einen Blick.
 
Zuletzt bearbeitet:
Mein kleines Programm schaut jetzt so aus. Danke für deine Hilfe.

Code:
IF Start_fahre_zu_Position And Soll_Pos_Vert <> Ist_Pos_Vert Or Soll_Pos_Hor <> Ist_Pos_Hor Then 
        While Soll_Pos_Vert <> Ist_Pos_Vert do
    
            IF Start_fahre_zu_Position AND Soll_Pos_Vert > Ist_Pos_Vert THEN
                Motor_Vert_oben := TRUE;
            ELSIF Start_fahre_zu_Position And Soll_Pos_Vert < Ist_Pos_Vert THEN
                Motor_Vert_unten := TRUE;
            END_IF;
    
        END_While 
    
        IF Soll_Pos_Vert = Ist_Pos_Vert THEN
            Motor_Vert_oben := FALSE;
            Motor_Vert_unten := FALSE;
        END_IF
        
        While Soll_Pos_Hor <> Soll_Pos_Vert
            IF Start_fahre_zu_Position AND Soll_Pos_Hor > Ist_Pos_Hor THEN
                Motor_Hor_re := TRUE;
            ELSIF Start_fahre_zu_Position And Soll_Pos_Hor < Ist_Pos_Hor THEN
                Motor_Hor_li := TRUE;
        END_While 

        END_IF;
    
        IF Soll_Pos_Hor = Ist_Pos_Hor THEN
            Motor_Hor_re := FALSE;
            Motor_Hor_lin := FALSE;
        END_IF        
    
    END_IF
    
    
    Fertig := Soll_Pos_Hor = Ist_Pos_Hor AND Soll_Pos_Vert = Ist_Pos_Vert;
 
Zuletzt bearbeitet:
Da wirst du vermutlich Bekanntschaft mit der Zykluszeitüberwachung machen.

Programmschleife, bis eine Position erreicht ist, wird nicht funktionieren und macht auch keinen Sinn
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@JollySkillerHD,

verwende mal für Deine Code-Auszüge hier im Forum bitte die Code-Tags [CODE]...[/CODE].
Die kannst Du (auch) mit dem Button [#] ganz rechts in der unteren Icon-Leiste erzeugen. Einfach Deinen Code markieren und auf's Icon klicken.

Dadurch wird Dein Code für alle anderen deutlich lesbarer, wie Du bei den verschiedenen Antworten sicher sehen kannst.


PS:
Wenn Du Deine bisherigen Posts da auch noch anpasst, werden sich zukünftige Suchende sicher freuen.
 
- In Deiner 2. WhileSchleife befindet sich eine If-Abfrage, deren Ende sich ausserhalb der WhileSchleife befindet. Das ist wohl in keiner ProgrammierSprache zulässig.
- Wo sind die EndSchalter geblieben?
- Sollen die Vertikal- und die Horizontal-Achse gleichzeitig fahren können? Das würde Zeit sparen.
- Soll die Vertikal-Achse gleichzeitig nach oben und nach unten fahren? Warum wird dies nicht verhindert?
- Soll die Horizontal-Achse gleichzeitig nach links und nach rechts fahren? Warum wird dies nicht verhindert?
- 'Start_fahre_zu_Position' wird nur abgefragt. Soll es auch wieder gelöscht werden, wenn die Positionierung fertig ist?
Oder ist 'Start_fahre_zu_Position' ein TasterSignal? Wenn ja, sollen die Achsen mit Loslassen der Taste gestoppt werden, obwohl sie ihre ZielPositionen noch nicht erreicht haben?
- Bedenke: Das zyklische PLC-Programm wird quasi in einer "Endlos"-Schleife ausgeführt. Warum also die Schleifen in Deinem Programm?
Code:
While PLC_in_RUN Do // Bestandteil des BetriebsSystems!!!

    // Dein Programm - hier allenfalls Schleifen, die deutlich innerhalb der ZyklusZeit fertig werden!!!

End_While; // Bestandteil des BetriebsSystems!!!
 
Zuletzt bearbeitet:
Zurück
Oben