Zwei Timer in einer Schleife - Steuerung für Pneumatik Prüfstand

Dr Peat

Level-1
Beiträge
10
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

bin gerade in meinem Hauptpraktikum und nach der Konstruktion des Prüfstandes (Möbelprüfung nach Norm) befasse ich mich jetzt mit der Steuerung dafür.


  • Der Prüfstand hat 3 Zylinder die über Magnetventile gesteuert werden (Achse 1,2 und 3)
  • Folgende Parameter will ich für den "Handbetrieb" einstellen können:
    • Ax - Auswahl der Achse
    • W - Anzahl von Wiederholungen
    • DF - Dauer der Kraftaufbringung
    • DFp - Dauer der Kraftpausen

Es gibt Prüfungen wo bis zu 10.000 exakt gleiche Wiederholungen gemacht werden müssen mit den vorher genannten Parametern.

Wie würdet ihr da vorgehen?

Ich habe mir als Konstrukt jetzt gedacht eine Schleife zu machen in der zwei Timer laufen.


For i:= 1 TO W by 1 DO

i := i + 1;
A1 := TRUE;

Timer 1 läuft

Nach abgelaufenem Timer
A1:= FALSE;


Timer 2 läuft

Nach abgelaufenem Timer
Schleife wieder von vorne

Das habe ich in der Funktionsbausteinsprache angefangen und komme gerade nicht wirklich weiter.

Die Code Bescheibung mit den Timern habe ich dafür in ein "Execute" Baustein gepackt und vor den Eingang ein UND-Glied mit Starttaster UND Auswahl der Achse

Kennt ihr eine einfachere Lösung?

Hier meine bisherige Visualisierung und Testweise für den ersten Zylinder. Zum Testen habe ich einfach Lampen genommen die erstmal zur Veranschaulichung sind.
SPS.jpg




Dazu bin ich in SPS Programmierung noch nicht sehr erfahren und hoffe ihr könnt mir helfen.



MfG
Steffen
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wie würdet ihr da vorgehen?
Zum Beispiel eine Schrittkette mit CASE-Anweisung erstellen. Übrigens, wenn Du schon ST-Code über Execute nutzt, warum schreibst Du das Programm nicht gleich ganz in ST.
Dazu bin ich in SPS Programmierung noch nicht sehr erfahren und hoffe ihr könnt mir helfen.
Bitte nicht böse sein, aber ich unterstelle einmal, dass Du grundsätzlich in der Programmierung nicht ganz fit bist. Die Art wie Du eine FOR-Schleife nutzen möchtest zeigt es hier ganz deutlich.
Übrigens startet CONTINUE die Schleife nicht neu, sondern überspringt alle weiteren Befehle in der Schleife. Außerdem musst Du Dich unbedingt mit den Besonderheiten einer SPS (Stichwort: zyklische Abarbeitung) auseinandersetzen.
 
Zuletzt bearbeitet:
Unabhängig von der Frage, warum wird i manipuliert?

Danke, gute Frage, habe jetzt gemerkt das die Schleife ja schon in der ersten Zeile definiert ist

Bitte nicht böse sein, aber ich unterstelle einmal, dass Du grundsätzlich in der Programmierung nicht ganz fit bist. Die Art wie Du eine FOR-Schleife nutzen möchtest zeigt es hier ganz deutlich.
Mit der Unterstellung hast du auf jeden Fall Recht :rolleyes:

Zum Beispiel eine Schrittkette mit CASE-Anweisung erstellen. Übrigens, wenn Du schon ST-Code über Execute nutzt, warum schreibst Du das Programm nicht gleich ganz in ST.

Okay eine Schrittkette hört sich interessant an, ich versuchs mal.
Und ganz in ST Schreiben geht nicht, eigentlich dachte ich mir das mit den Bausteinen zu vereinfachen aber dann hab ich gemerkt das ich das meiste sowieso in den Execute Baustein setzten muss.

Was genau heißt Schrittkette mit CASE-Anweisung?
Wird die CASE-Anweisung nicht bei Fällen genutzt wo mehrere Anweisungen mit derselben Bedingungsvariable angewendet? In meinem Fall gibt es doch mehrere Bedingungsvariablen und im Prinzip die selbe Anweisung oder versteh ich was falsch?

MfG
Steffen
 
Naja, was heißt das? Man realisiert eine Schrittkette mit Hilfe einer CASE-Anweisung. Es gibt eine Variable, den Schrittzähler und in jeder CASE-Anweisung wird geprüft, ob die Bedingung erfüllt ist und der Zähler entsprechend hochgezählt, wobei man da anstatt von Zahlen Enums nehmen kann/sollte um die Übersicht zu behalten. Das ganze ginge auch in AS.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wird die CASE-Anweisung nicht bei Fällen genutzt wo mehrere Anweisungen mit derselben Bedingungsvariable angewendet? In meinem Fall gibt es doch mehrere Bedingungsvariablen und im Prinzip die selbe Anweisung oder versteh ich was falsch?
Der Ablauf ist der Selbe egal welche Achse genommen wird, aber die Achse unterscheidet sich. Die einzelnen Schritte, Zylinder ausfahren, warten, wieder einfahren usw. definierst Du als einzelnen Schritte. Die Achsen kannst Du in ein Array packen und die Auswahl als Radio-Button gestalten, dann erhältst Du einen Index den Du direkt für den Zugriff auf das Array verwenden kannst und somit die passende Achse auswählen.
 
Das habe ich in der Funktionsbausteinsprache angefangen und komme gerade nicht wirklich weiter.
Habe schon überlegt, was eine Funktionsbausteinsprache sein mag ... und hab die Aufgabe mit der LOGO! in Angriff genommen.
Das hat leider nur entfernte Ähnlichkeit mit FUP, könnte aber vielleicht als Anregung dienen.
MultiVib3Axen.jpg
Anhang anzeigen MultiVib2.lsc.pdf >>>===> nach dem Herunterladen '.pdf' entfernen!

Gibt an Q1 oder Q2 oder Q3 zehn 0,5 s Impulse gefolgt von jeweils 1 s Pause aus.
Starten mit I1 oder I2 oder I3 löscht den Zähler und beginnt die ImpulsFolge. Mit I4 kann man sie vorzeitig stoppen.
Achtung! Wählt man bei laufender ImpulsFolge eine andere Achse, so wird der Zähler nicht gelöscht.
 
Wow vielen Dank für die Mühe!!
In Codesys kann ich auch mit CFC (Continuous Function Chart) arbeiten (Wenn ich das jetzt nicht mit meinem Anfänger-Halbwissen verwechsele)
Zurzeit arbeite ich daran die Steuerung nach dem Vorschlag von oliver.tonn zu realisieren, als Anregung dient mir das definitif!
MfG
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hier ein Siemens FuctionBlock in SCL Siemens Code,
Code:
FUNCTION_BLOCK "Execute"{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
   VAR_INPUT 
      Start : Bool;   // Start prufung
      Stop : Bool;   // Stop prufung
      W : UInt;   // Anzahl wiederholungen
      DF : Time;   // DruckZeit
      DFp : Time;   // PauseZeit
   END_VAR


   VAR_OUTPUT 
      Valve : Bool;   // Actor
      Busy : Bool;   // Prufung Lauft
   END_VAR


   VAR 
      DF_Timer {InstructionName := 'TON_TIME'; LibVersion := '1.0'; S7_SetPoint := 'False'} : TON_TIME;   // Timer Prufzeit
      DFp_Timer {InstructionName := 'TON_TIME'; LibVersion := '1.0'; S7_SetPoint := 'False'} : TON_TIME;   // Timer_Pause_Zeit
      Countwert : UInt;   // Counterwert Anzahl wiederholungen
      WechelBit : Bool;
      FlankStart : Bool;
      FlankStop : Bool;
   END_VAR




BEGIN
    // Start Prufung  bei Positve Flanke Start
    IF #Start AND NOT #FlankStart THEN
        #Countwert := #W;  //Counterwert setzen
        #WechelBit := FALSE; //Timers
        #Busy := TRUE;
    END_IF;
    #FlankStart := #Start;
    
    // Stop Prufung bei Positve Flanke Stop
    IF #Stop AND NOT #FlankStop THEN
        #Countwert := 0;
        #WechelBit := FALSE;
        #Busy := False;
    END_IF;
    #FlankStop := #Stop;
    
    // Timer Druck prufung
    #DF_Timer(IN :=NOT #WechelBit AND #Countwert > 0,
              PT := #DF);
    IF #DF_Timer.Q THEN
        #WechelBit := TRUE;
    END_IF;
    
    // Pause Timer Wenn Timer.Q  Counterwert -1 , wenn Counterwert<= 0 wurde Counter_0 True.
    #DFp_Timer(IN := #WechelBit,
               PT := #DFp);
    IF #DFp_Timer.Q THEN
        #WechelBit := FALSE;
        #Countwert := #Countwert - 1;
        #Busy := NOT (#Countwert <= 0);
    END_IF;
    
    // Actor on/off
    #Valve := NOT #WechelBit AND #Busy;
           
    
END_FUNCTION_BLOCK

Und hier wie diese FB für Ventil 1 und 2 aufgeruffen wurde in Main

Execute OB1.JPG
 
Zurück
Oben