TIA Schrittkette

sps31

Level-1
Beiträge
109
Reaktionspunkte
3
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute,
ich sitzte grade vor einem Problem und zwar wollte ich eine Schrittkette Programmieren um eine Pumpe zu steuern, kurz zu Funktion.

Sobald auf Automatik gestellt soll eine Pumpe in einem Medium von oben anfangen abzupumpen.
Die Pumpe soll zuerst ein eine Stellung außerhalb des Wassers fahren und dann wider runter bis der Schwimmerschalter schaltet damit sie im Wasser ist.

anschliessend soll sie abpumpen bis ihr das Medium nicht mehr gefällt daher kommt auch der bool ausgang eines hysterese Timers Überschreitungszeit_Q.

wenn dies der Fall ist soll die Pumpe die Strecke "verfahrweg" nach unten verfahren und anschliessend wider Pumpen bis das Medium nicht ok ist.

Das ganze geht so lange bis sie in der Unteren endlage ist. Danach soll sie wider bei Schritt 1 einsteigen und nach ganz oben fahren um wider neu ins medium einzutauchen.

Ich habe das Problem das die Anlage zwar auf schritt 1 anfährt aber der Merker zB gar nicht gesetzt ist und die anlage somit auch nicht in Schritt 2 wechselt usw.


Hier ein auszug aus meinem Programm.

// Zyklusfahrt



IF "StoerungPumpe" OR "StoerungHubwerk" OR "StoerungGlobal" OR NOT "DREH_Auto_KRAN" THEN
"Zyklusmerker" := FALSE;

ELSE
"Zyklusmerker" := TRUE;
END_IF;




IF NOT "Zyklusmerker" THEN
"m_schritt1" := FALSE;
"m_schritt2" := FALSE;
"m_schritt3" := FALSE;
"m_schritt4" := FALSE;
"Motor_hochauto" := FALSE;
"Motor_runterauto" := FALSE;
"Pumpe_einauto" := FALSE;

END_IF;


IF "Zyklusmerker" AND "Flanke_Auto" AND NOT "Oberste Endlage" THEN
"m_schritt1" := TRUE;

END_IF;




IF "Zyklusmerker" AND "Wartungsstellung" AND "m_schritt1" THEN
"m_schritt2" := TRUE;


END_IF;




IF "Zyklusmerker" AND "Ruhezeit_Q" AND "m_schritt2" THEN
"m_schritt3" := TRUE;
END_IF;


IF "m_schritt3" AND "Ueberschreitungszeit_Q" THEN

"m_schritt4" := TRUE;
END_IF;


IF "m_schritt4" AND "Verfahrweg_Q" AND "Unterste Endlage" THEN

"m_schritt1" := TRUE;


END_IF;


IF "m_schritt4" AND "Verfahrweg_Q" AND NOT "Unterste Endlage" THEN

"m_schritt3" := TRUE;

END_IF;


// Ausgabe






IF "m_schritt1" THEN
"Motor_hochauto" := TRUE;
"m_schritt4" := FALSE;
END_IF;


IF "m_schritt2" AND NOT "Pumpe_schwimmer" THEN
"Motor_hochauto" := FALSE;
"Motor_runterauto" := TRUE;
ELSE
"Motor_runterauto" := FALSE;
"m_schritt1" := FALSE;
END_IF;




IF "m_schritt3" THEN
"Pumpe_einauto" := TRUE;
"m_schritt2" := FALSE;
"m_schritt4" := FALSE;

"MR_Start" := "scale_Drehgeber";
"MR_Ziel" := "MR_Start" + "Verfahrweg";

END_IF;

IF "m_schritt4" AND "scale_Drehgeber" <= "MR_Ziel" THEN
"Pumpe_einauto" := FALSE;
"Motor_runterauto" := TRUE;
"m_schritt3" := FALSE;
END_IF;

IF "scale_Drehgeber" > "MR_Ziel" THEN
"Motor_runterauto" := FALSE;
END_IF;
 
Zuletzt bearbeitet:
Hallo sps31

dein Zyklusmerker wird aus einem if-then-else gebildet.

das kann man übrigens kürzer so schreiben
"Zyklusmerker" := NOT( "StoerungPumpe" OR "StoerungHubwerk" OR "StoerungGlobal" OR NOT "DREH_Auto_KRAN" )


und dann setzt es alle Schritte false.

Wenn der Name Zyklusmerker einen Sinn haben soll, dann doch vermutlich den, dass du möchtest, das für einen Zyklus in Deiner Schrittkette was passiert und dann für viele Zyklen gewartet wird.

Während des Wartens machst du aber wieder alles platt.


Aber mal was anderes? Warum tutst du dir das an. Graph ist im TIA-Portal vorhanden -- kost' nix mehr extra!
Wenn ich eine Schrittkette brauch, dann nehme ich die dafür vorgesehene Sprachen und quäl mich nicht mit SCL rum.
SCL ist gut für's Rechnen, KOP/FUP ist gut für Logic, aber für Zustandsautomaten gibt es Graph.



'n schön' Tach auch
HB
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Aber mal was anderes? Warum tutst du dir das an. Graph ist im TIA-Portal vorhanden -- kost' nix mehr extra!
Wenn ich eine Schrittkette brauch, dann nehme ich die dafür vorgesehene Sprachen und quäl mich nicht mit SCL rum.
SCL ist gut für's Rechnen, KOP/FUP ist gut für Logic, aber für Zustandsautomaten gibt es Graph.



'n schön' Tach auch
HB

Wenn er mal nicht ne 1200-er hat, denn für eine 1500-er ist die Aufgabe vlt. nicht umfangreich genug?
 
Hier mal eine einfache Möglichkeit für eine Schrittkette in ST/SCL.
Das ist nur bei mir schnell aus einem Baustein herauskopiert, zeigt aber vlt. das Prinzip.

Code:
    //Start Kommunikationsinitialisierung
    CASE StepCounter OF
        //Die Kommunikation wird zuerst auf den DB mit den Moduldaten
        //gelegt. Aus diesem DB holt sich der FB die ID des Moduls im Master
        //Mit dieser ID kann dann der Kommunikations-DB berechnet werden,
        //der für den Datenaustausch zwischen Master und Modul genutzt wird.
        0   :   IF NOT Get_Busy AND NOT PUT_Busy THEN
                    LocalDB := Def_DBnr;
                    RemoteDB := Def_DBnr;
                    Stepcounter := Stepcounter + 10;
                END_IF;
                
        10  :    Stepcounter := Stepcounter + 10;
                                                           
        //Kommunikation starten
        //Warten, dass über Get-Busy Daten angefordert werden
        20  :   Enable := True;
                IF Get_Busy THEN
                    Stepcounter := Stepcounter + 10;
                END_IF;
                
         //Warten, dass Get-Busy signalisiert, dass Daten empfangen wurden
        30  :   IF NOT Get_Busy THEN
                    Stepcounter := Stepcounter + 10;
                END_IF;
        //Warten, dass über Get-Busy Daten angefordert werden
        //nur zur Sicherheit 2.Zyklus Datenanforderung laufen lassen 
        40  :   IF Get_Busy THEN
                    Stepcounter := Stepcounter + 10;
                END_IF;


        //Daten empfangen und Offset des Moduls bestimmen
        50  :   IF NOT Get_Busy AND NOT Get_Error AND NOT PUT_Error THEN
                    
                    //Ermitteln, der ID über die eigne IP (nur End-Quadrupel)
                    //IP und ID sind im DB mit den Modulfeninitionen im Master hinterlegt
                    FOR I := 1 TO 32 DO
                        IF Def_ModulStruct[I].IP.IP_4 = Last_IP_Nr THEN
                            IF Def_ModulStruct[I].ID <> 0 then 
                                Offset_Modul := Def_ModulStruct[I].ID;
                                Offset_Found := True;
                                EXIT;
                            END_IF;
                        END_IF;
                        ;                       
                    END_FOR;
                    Enable := False; //Kommunikation ausschalten  
                    IF Offset_Found AND NOT Enable AND NOT Get_Busy THEN
                        Stepcounter := Stepcounter + 10;
                    END_IF;
                    //Wenn kein Offset in der Tabelle gefunden wurde zurück zu Schritt 0 und 
                    //Signalisierung nach außen
                    IF NOT Offset_Found THEN
                        Stepcounter := 0;
                    END_IF;          
                END_IF;


        60  :    Stepcounter := Stepcounter + 10;
                                 
        //Remote DB des Moduls berechnen 
        //Umschalten des der DB für PUT und GET auf das Modul    
        70  :   LocalDB := Local_DBnr;  
                RemoteDB := Remote_Start_DBnr_Modul + Offset_Modul - 1;
                Enable := True;   //Kommunikation einschalten 
                IF Get_Busy THEN
                    Stepcounter := Stepcounter + 10;
                END_IF;
        //Das wars              
        80  :   
            ;
    ELSE:
        // Anweisungen_ELSE
        ;
    END_CASE;
 
Zurück
Oben