Anfänger braucht Hilfe mit Programmiersprache Strukturierter Text und Programmablauf

Impact84

Level-1
Beiträge
8
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen!
Ich habe nicht viel Erfahrung mit SPS Programmierung und vor mir steht folgende Aufgabe, muss ein Programm erstellen, dass die rotierende Spannzangen zwischen zwei Sensoren hin und her laufen lasst bis die eingestellte Anhahl von Windungen nicht erreicht wird, die letzte 10 Windungen sollen langsamm gedreht werden. Für Verstendlichkeit hab ich ein Bild eingefügt, wo mit 'IN' Sensoren genannt sind und mit 'OUT' Ventiele die for Bewegung vor und zurück zustandig sind . Noch mal kurz Spannzangen mussen hin und her zwischen Sensoren IN4 und IN3 bewegen so lang bis die eingestellte Windungszahl bei Zähler nicht erreicht wird IN9 zählt die Windungen, so bald Windungszahl erreicht muss die Spannzanges bis Sensor IN5 fahren, Zähler muss zuruckgesetzt und das selbe Spiel muss jezt zwischen IN5 und IN4 passieren und so insgesamt 4 mal bis Sensor IN7.
SPS Forum.jpg
Hier ist das Quellcode von mir

CTU1(CU:=IN9 ,RESET:=RES ,PV:= , Q=> , CV=>ZAELER );(*Wicklungszaeler*)
POSITION1:RS;
POSITION2:RS;

IF ZAELER<WINDUNGSZAHL1-10
THEN

POSITION1(SET:=IN3 , RESET1:=IN4 , Q1=>OUT7 );
POSITION2(SET:=IN4 , RESET1:=IN5 , Q1=>OUT6 );
ELSIF ZAELER>WINDUNGSZAHL 1-10 AND ZAEL ER<WINDUNGSZAHL1
THEN
target_velocityARS2108:=500;
target_velocityARS2305:=50;
POSITION1(SET:=IN3 , RESET1:=IN4 , Q1=>OUT7 );
POSITION2(SET:=IN4 , RESET1:=IN5 , Q1=>OUT6 );

ELSIF ZAELER=WINDUNGSZAHL1 AND IN5=FALSE
THEN
target_velocityARS2108:=500;
target_velocityARS2305:=0;
OUT6:=FALSE;
OUT7:=TRUE;
END_IF;
TP1(IN:=IN5 , PT:=T#5ms , Q=>RES , ET=> );(*Windungs Zähler auf Null setzen*)
(*
IF ZAELER<WINDUNGSZAHL2
THEN
target_velocityARS2108:=1500;
target_velocityARS2305:=100;
POSITION1(SET:=IN4 , RESET1:=IN5 , Q1=>OUT7 );(*Laufvorgang*)
POSITION2(SET:=IN5 , RESET1:=IN4 , Q1=>OUT6 );
*)

END_IF;

Es funktioniert akzeptabel, so bald ich nicht diese Teil vom Qellcode einfüge was zur Zeit als Kommentar markiert. Wenn ich diese Teil doch einfüge dann fahren die Spannzangen bis Sensor IN5 und laufen zwischen IN4 und IN5. Für mich ist das verstadlich da die Bedienung ZAELER<WINDUNGSZAHL2 erfühlt ist. Meine Frage wie kann ich mein Proramm verbessern bzw verandern um diese Ablauf zu programmieren? Oder gibts hier im Forum villeicht schon ahnliches Thema ? Denke so was oder ähnliches ist oft zu treffen. Hoffe Sie haben vestanden was ich meine :) Danke voraus !
 

Anhänge

  • SPS Forum.jpg
    SPS Forum.jpg
    24,9 KB · Aufrufe: 16
Hallo,
der "Trick" ist, dass du einen Ablauf (Schrittkette) da rein bekommen mußt.
Ist Zähler < Windungszahl1 dann ist er wahrscheinlich auch < Windungszahl2. Dafür willst du dich (so wie ich das verstanden habe) aber erst interessieren, wenn du >= Windungszahl 1 bist - du drafst diese Funktion also auch dann erst "freischalten".
Das realisierst du am Besten über eine Schrittkette - dafür gibt es auch (und gerade bei) ST schöne Beispiele (auch in der Forums-Suche), wie man das machen kann ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für den Tipp. Schrittkette hab ich mit CASE realesiert. Meine Frage war auch wie ich bie Bedienung für IF Anweisung für Übergang zwischen beide Windungsablaufe mit den Zurverfügungstellung INs und OUTs optimal formuliere.
 
Naja ... wie schon beschrieben.
Ich würde der Schrittkette einen Schritt spendieren, der zuständig ist bis Windungszahl1. Nun in den nächsten Schritt wechseln und die Windungszahl2 abfragen.

Ansonsten solltest du noch einmal etwas weiterführend beschreiben ...

Gruß
Larry
 
CTU1(CU:=IN9 ,RESET:=RES ,PV:= ,Q=>,CV=>ZAELER );

IF ZAELER<WINDUNGSZAHL1-LETZTEWINDUNGEN1
THEN SCHRITT:=1;
ELSIF ZAELER>WINDUNGSZAHL1-LETZTEWINDUNGEN1 AND ZAELER< WINDUNGSZAHL1
THEN SCHRITT:=2;

ELSIF ZAELER=WINDUNGSZAHL1 AND IN5=FALSE
THEN SCHRITT:=3;
ELSIF ZAELER<WINDUNGSZAHL1+WINDUNGSZAHL2-LETZTEWINDUNGEN2
THEN SCHRITT:=4;
ELSIF ZAELER>WINDUNGSZAHL1+WINDUNGSZAHL2-LETZTEWINDUNGEN2 AND ZAELER<WINDUNGSZAHL1+WINDUNGSZAHL2
THEN SCHRITT:=5;
END_IF

CASE SCHRITT OF

1: target_velocityARS2108:=1000;
target_velocityARS2305:=200;
POSITION1(SET:=IN3 , RESET1:=IN4 , Q1=>OUT7 );(*Laufvorgang*)
POSITION2(SET:=IN4 , RESET1:=IN3 , Q1=>OUT6 );

2:
target_velocityARS2108:=500;
target_velocityARS2305:=100;
POSITION1(SET:=IN3 , RESET1:=IN4 , Q1=>OUT7 );(*Laufvorgang*)
POSITION2(SET:=IN4 , RESET1:=IN3 , Q1=>OUT6 );

3: target_velocityARS2108:=500;
target_velocityARS2305:=0;

OUT6:=FALSE;
OUT7:=TRUE;



4: target_velocityARS2108:=500;
target_velocityARS2305:=200;
POSITION1(SET:=IN4 , RESET1:=IN5 , Q1=>OUT7 );(*Laufvorgang*)
POSITION2(SET:=IN5 , RESET1:=IN4 , Q1=>OUT6 );
5:
target_velocityARS2108:=500;
target_velocityARS2305:=100;
POSITION1(SET:=IN4 , RESET1:=IN5 , Q1=>OUT7 );(*Laufvorgang*)
POSITION2(SET:=IN5 , RESET1:=IN4 , Q1=>OUT6 );
END_CASE;

Zur Zeit sieht so aus, aber das was ich rot markiert habe finde ich umständlich . Ich wollte das nach jedem Wickelvorgang (ZAELER=WINDUNGSZAHL) Zähler über RESET auf 0 setzen für nachste Wickelvorgang z.B nach SCHRITT=3 aber dann wird naturlich nicht SCHRITT 4ausgefuhr sondern SCHRITT 1. Die Frage ist wie kann ich das war rot markiert ersetzen und nach dem rucksetzen des Zählers auf 0 die Schritte 4 und 5 trotzdem ausgeführt werden ? Vielleicht mit den Hilfsvariablen, aber wie? Danke voraus!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du machst den Teil m.E. genau falsch herum ...
Nicht der Zähler bestimmt den aktuellen Schritt sondern mit dem aktuellen Schritt muß bestimmt werden, was du mit deinem Zähler (und dem Rest der Anlage) machst.
Also z.B. :

Schritt 1 startet den Antrieb - hat der seine Windungszahlö erreich dann nach Schritt 2
usw. ...

Gruß
Larry
 
Zurück
Oben