TIA Priorisierung Hydraulikzylinder

Beiträge
16
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Zusammen

Ich habe folgendes Problem.
Es sollen 5 Zylinder über ein Aggregat angesteuert werden.

Die Zylinder werden bereits über das Programm angesteuert.
Dabei kommt es vor, dass oft mehrere Zylinder glechzeitig angesteuert werden.
Es soll immer nur einer fahren.

Nun soll das Programm so angepasst werden, dass jeder Zylinder eine Priorität gekommt. d.h. 1;2;3;4.....

Wenn mehrere Zylinder gleichzeitig angesteuert werden, sollen die je nach Priorität nacheinenander fahren.
Die Priorität soll auch einstellbar sein.

Hat vielleicht jemand eine Idee? Oder schon mal sowas programmiert? :confused:

Grüße Robert
 
Woher weiss man, wann ein Zylinder mit fahren fertig ist? Gibt es Rückmeldungen oder muss man sich mit Zeiten behelfen?

PS:
Ist die Reihenfolge durch die Priorisierung immer dieselbe oder muss man, wenn der Vorgang evtl. "rückwärts" abläuft, z.B. die umgekehrte Reihenfolge einhalten?
 
Zuletzt bearbeitet:
Ich würde eine Art Warteschlange programmieren. Ein Array of INT mit sovielen Feldern wie es Zylinder gibt. Möchte ein Zylinder fahren prüft dr ob die Warteschlange frei ist. Das könnte zB so aussehen das im ersten Feld eine 0 steht. Ist es frei trägt der Zylinder seine Nummer ins Feld ein, wenn nicht ins nächste freie Feld. Ist er mit seiner Bewegung fertig löscht er seine Nummer und schiebt alle Einträge um ein Feld nach vor.
 
Reihenfolge ist immer die Gleiche.
Es muss immer die Priorität eingehalten werden.

Wenn zb. Prio 3 Zylinder fährt und Zylinder mit Prio 1 einen Fahrbefehl bekommt muss 3 stehen bleiben und 1 fahren. wenn dann 1 fertig ist darf 3 wieder fahren.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Reihenfolge ist immer die Gleiche.
Es muss immer die Priorität eingehalten werden.

Wenn zb. Prio 3 Zylinder fährt und Zylinder mit Prio 1 einen Fahrbefehl bekommt muss 3 stehen bleiben und 1 fahren. wenn dann 1 fertig ist darf 3 wieder fahren.

Wenn verschiedene Prio´s zugewiesen werden, dann kann die Reihenfolge doch nicht immer die gleiche sein :confused:
Sonst würde ja eine Schrittkette reichen.
 
Sorry meinte nicht Reihenfolge sondern das die Zylinder beim Vor und Rückwärts fahren immer die gleiche Prirorität haben.

Also egal ob Vor oder Zurück, es muss immer der, mit der nähesten Priorität an 1 Vorrang haben.
 
Reihenfolge ist immer die Gleiche.
Es muss immer die Priorität eingehalten werden.

Wenn zb. Prio 3 Zylinder fährt und Zylinder mit Prio 1 einen Fahrbefehl bekommt muss 3 stehen bleiben und 1 fahren. wenn dann 1 fertig ist darf 3 wieder fahren.

Na ... finde ich so zwar komisch ... aber :
- trag da, wo jetzt die Ausgänge angesteuert werden Merker ein.
- verriegel die Zuweisung der Merker als Verschaltung mit der zugewiesenen Priorität

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Muß die Priorität/Reihenfolge änderbar sein? Eine Priorität kann sich ansonsten automatisch durch die Abarbeitungsreihenfolge im SPS-Programm einstellen. Wer zuerst kommt, bekommt die Ressourcen zuerst, und wer danach kommt, bekommt sie nur wenn alle davor abgearbeiteten Programmteile keine Ressourcen belegt haben.

Harald
 
Muß die Priorität/Reihenfolge änderbar sein? Eine Priorität kann sich ansonsten automatisch durch die Abarbeitungsreihenfolge im SPS-Programm einstellen. Wer zuerst kommt, bekommt die Ressourcen zuerst, und wer danach kommt, bekommt sie nur wenn alle davor abgearbeiteten Programmteile keine Ressourcen belegt haben.

Harald

Genauso hätte ich es auch gelöst.
Alle Zylinder entweder in Grund- oder Arbeitsstellung -> Frg. zum Ausfahren.
Prio. durch Reihefolge im Programm.
 
Was ist das denn genau was du da am Start hast ? Es hört sich ein bisschen wie eine Art Kaskade an ...
Macht es denn nicht grundsätzlich eher Sinn, anzugeben wann (also zu welchem Ereignis oder Zeitpunkt) der Zylinder aktiv werden kann/soll ?
 
Mhm, sowas ähnliches hab ich in einer Anforderung für einen Fahrwagen der an Wartepositionen die Paletten nacheinander abholen soll.
Vllt. kannst Du es an Deine Bedürfnisse anpassen, wobei ich da halt einen DB als Übergabe bei Dir nutzen würde und dort die Arrays verlinken. Im Programm sind sie dann ja auch nutzbar und es muss nicht viel umgemodelt werden.

Code:
FUNCTION_BLOCK "Abholung_Priorität"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
   VAR_INPUT 
      IN_BND_FRG : Array[1..20] of Bool;
      IN_BND_Prio : Array[1..20] of Int;
   END_VAR


   VAR_OUTPUT 
      OUT_BND_FRG : Array[1..20] of Bool;
   END_VAR


   VAR 
      high_Prio_no { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int := 1;
   END_VAR


   VAR_TEMP 
      Schleife : Int;
   END_VAR




BEGIN
    // Abarbeitung der Förderbandwartepositionen - immer die höchste Prio soll Bereitschaft melden wenn Palette anwesend
    FOR #Schleife := 1 TO 20 DO // Höchste Prio lesen, alle Ausgänge löschen
        IF #IN_BND_Prio[#high_Prio_no] < #IN_BND_Prio[#Schleife] THEN
            #high_Prio_no := #Schleife;
        END_IF;
        #OUT_BND_FRG[#Schleife] := false;
    END_FOR;
    // Höchste Prio aktivieren und Ausgang beschreiben
    #OUT_BND_FRG[#high_Prio_no] := #IN_BND_FRG[#high_Prio_no];
    
    
    
END_FUNCTION_BLOCK

edit:
Vergessen: geschaltet wird nicht über IN_BND_FRG sondern die Prio. Die Freigaben sind ein Button der allgemein die Position aktiviert/deaktiviert. Sofern eine Anforderung besteht schreibt das Band seine aktuelle Prio in IN_BND_PRIO hinein und wird dann geschaltet. Ansonsten ist das Array IN_BND_PRIO immer leer. Somit ist für meinen Zweck die schnellste Prioritätsänderung machbar gewesen.
 
Zuletzt bearbeitet:
Zurück
Oben