TIA Rundtisch Schieben mit Bedingung

SPS'ler

Level-2
Beiträge
153
Reaktionspunkte
4
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

Ich habe folgendes Problem:

Ich habe ein Rundtisch mit 12 Einheiten, welche bei Bedarf mehrfach bearbeitet werden müssen.

Es gibt eine Bearbeitungsstation. Wenn das Werkstück an dieser ankommt, soll ein Rezept, welches aus 4 Komponenten besteht eingegeben werden:

- Länge // Real
- Bearbeitungsart_1 // Bool (immer auszuführen)
- Bearbeitungsart_2 // Bool
- Bearbeitungsart_3 // Bool

Direkt beim ersten erreichen der Bearbeitungsstation soll Bearbeitungsart_1 ausgeführt werden. Danach wird der Takt fortgesetzt, weil das Werkstück in einer Trockenstrecke kühlen muss. Wenn das Werkstück wieder bei der Bearbeitungsstation ankommt, soll geprüft werden, ob noch die Bearbeitungsart_2 durchgeführt werden muss. Falls ja, wird diese durchgeführt und es geht wieder in Trockenstrecke. Das gleiche nun für die dritte Bearbeitungsart. Falls ein Werkstück z.B. nach der 1. Bearbeitung fertig ist, kann dieses schon entnommen werden und der Platz ist wieder frei für ein anderes. Es können auch ganz unterschiedliche Werkstücke aufeinander folgen.

Mein Ansatz ist das klassische Schieberegister für die 12 Einheiten, ich finde aber keine Lösung für das überspringen (falls das Werkstück noch weiter bearbeitet werden muss) und für den Anfang von vorne, da das Schieberegister ja die ersten Werte wieder überschreibt, wenn es bei Platz 12 angelangt ist (das Werkstück kommt ja erneut an und soll nur weiter bearbeitet werden, nicht neu angelegt.). Das Werkstück benötigt ja vermutlich eine Art "Fleck" oder Kennzeichnung, wonach dann alles übersprungen wird aber trotzdem weitergeschoben wird o.ä.

Vielleicht könnt Ihr mir weiterhelfen, mein Ansatz sieht so aus:

Code:
    Input                               
    Schiebetakt    Bool   
    Rezept    Struct       
    Länge    Real   
    Bearbeitungsart_1    Bool   
    Bearbeitungsart_2    Bool       
    Bearbeitungsart_3    Bool       
                                    
    Output                               
    Parameter_Aktuell_Bearbeitung    Struct       
    Länge    Real   
    Bearbeitungsart_1    Bool       
    Bearbeitungsart_2    Bool       
    Bearbeitungsart_3    Bool       
                                                                
                                    
    Static                               
    Stationen    Array[1..12] of Struct       
    R_TRIG_Schiebetakt    R_TRIG           
    Index    Int   

    
    // Flanke Schiebetakt
#R_TRIG_Schiebetakt(CLK:=#Schiebetakt);


// Wenn Schiebetakt und Registerplatz frei und Kern in Spritzstation
IF #R_TRIG_Schiebetakt.Q
THEN
    

    // for Schleife
    FOR #Index := 12 TO 2 BY -1 DO
        
        
        // Registerplatz Platz 12 bis Platz 2 mit den Daten des vorherigen Platzes beschreiben
        #Stationen[#Index] := #Stationen[#Index - 1];
        
      
    END_FOR;
    
    // Wenn nicht Bearbeitungsart 1,2 oder 3 dann
    
    IF
        (NOT #Rezept.Bearbeitungsart_1 OR NOT #Rezept.Bearbeitungsart_2 OR NOT #Rezept.Bearbeitungsart_3)
    THEN
        // Registerplatz 1 mit aktuellen Daten beschreiben
        
        #Stationen[1] := #Rezept;
        
    END_IF;
END_IF;

// Die Parameter in die aktuelle Bearbeitung transferieren

#Parameter_Aktuell_Bearbeitung := #Stationen[1];
 
Als erstes würde ich mich vom Schieben trennen. Ich hoffe du hast irgendwo Sensorik um ein Nest irgendwo identifizieren zu können. Wenn man die Nummer eines Nests kennt, kann man alle Nachbarn berechnen.
Wenn man die Nestnummer der Eingabeststion kennt, trägt man das Rezept in ein Array[#Nestnummer_Eingabe] ein. Bei den anderen Stationen arbeitet man dann auch immer mit Array[#Nestnummer_StationX]. So ist erstmal sichergestellt, dass nix durcheinander kommt.

Wird das Werkstück bei der Eingabestation auch entnommen?
 
Als erstes würde ich mich vom Schieben trennen. Ich hoffe du hast irgendwo Sensorik um ein Nest irgendwo identifizieren zu können. Wenn man die Nummer eines Nests kennt, kann man alle Nachbarn berechnen.
Wenn man die Nestnummer der Eingabeststion kennt, trägt man das Rezept in ein Array[#Nestnummer_Eingabe] ein. Bei den anderen Stationen arbeitet man dann auch immer mit Array[#Nestnummer_StationX]. So ist erstmal sichergestellt, dass nix durcheinander kommt.

Wird das Werkstück bei der Eingabestation auch entnommen?
Nein ich habe keine Sensorik um die Station zu erkennen. Ja das Werkstück wird bei der Eingabe Station eingeladen und entnommen.
 
Dann, wie TP-INC bereits schrieb ein Register für 12 Plätze erstellen als Array.
Du schiebst nun dann nicht mehr die Arrays sondern eine Indexvariable, die am Ende angekommen, z.B. >12, dann auf 1 gesetzt wird. Somit sind alle Positionen am Tisch fest vergeben und können auch deutlich beschriftet werden, was auch leichter im Umgang mit der HMI ist.
Die Bearbeitungsschritte werden fortan nicht mehr durch rausschieben gelöscht sondern bleiben stehen, was mit der Erkennung ob bearbeitet oder nicht auch wiederrum hilft.

Komfort kommt auch mit rein, denn der Bediener muss nun nicht mehr einen Produktcode jedes Mal eingeben sondern die Erkennung Entnahme/Eingabe mittels Taste setzt nur Bearbeitungsschritte zurück und das Produkt bleibt gleich solange es nicht geändert wird, falls gewünscht.

Nimm NUR dann ein Schieberegister wenn Du wirklich bewegliche Teile hast und nicht nur weil ein Tisch mit 1,2,200 festen Positionen, die immer die gleichen sind, sich dreht. Dafür nimm einen Zeiger wie bei ner Uhr, auch wenn sich das Ziffernblatt statt des Zeigers dreht.
 
Dann, wie TP-INC bereits schrieb ein Register für 12 Plätze erstellen als Array.
Du schiebst nun dann nicht mehr die Arrays sondern eine Indexvariable, die am Ende angekommen, z.B. >12, dann auf 1 gesetzt wird. Somit sind alle Positionen am Tisch fest vergeben und können auch deutlich beschriftet werden, was auch leichter im Umgang mit der HMI ist.
Die Bearbeitungsschritte werden fortan nicht mehr durch rausschieben gelöscht sondern bleiben stehen, was mit der Erkennung ob bearbeitet oder nicht auch wiederrum hilft.

Komfort kommt auch mit rein, denn der Bediener muss nun nicht mehr einen Produktcode jedes Mal eingeben sondern die Erkennung Entnahme/Eingabe mittels Taste setzt nur Bearbeitungsschritte zurück und das Produkt bleibt gleich solange es nicht geändert wird, falls gewünscht.

Nimm NUR dann ein Schieberegister wenn Du wirklich bewegliche Teile hast und nicht nur weil ein Tisch mit 1,2,200 festen Positionen, die immer die gleichen sind, sich dreht. Dafür nimm einen Zeiger wie bei ner Uhr, auch wenn sich das Ziffernblatt statt des Zeigers dreht.
Hi, das hört sich gut an, aber kannst du mir noch einmal erläutern wie du das umsetzen würdest? Wie kann ich denn diese Schieben der Indexvariable bis >12 realisieren sodass dieser danach wieder anfängt
 
Wenn du es wirklich prozesssicher haben willst kannst du auch über ein RFID-System nachdenken. Die gibt es auch mit ATEX.
Dann brauchst überhaupt nichts schieben und hast deine Daten beim Nest und nicht nur in der Steuerung
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hab mit EX-Bereich keine Erfahrung aber RFID oder DMC lesen wird wohl auch möglich sein? Falls man das Nest nicht eindeutig über Hardware identifizieren kann, muss man eine Möglichkeit schaffen, dies manuell am HMI zu machen. Im besten Fall macht man das einmalig.

Jetzt weiß man Nest X steht an der Einlegeposition. Nach dem Takt/Schiebe-Signal weiß man Nest X+1 ist jetzt an der Einlegeposition, und Nest X steht bei der Station nach der Einlegestation.

Ist Nest 12 zur Einlegeposition, und das Taktsignal kommt, ist wieder Nest 1 bei der Einlegeposition.

Die Daten an sich werden im Array nicht bewegt. Die Nester greifen anhand der ihnen ja bekannten Nummer immer auf den richtigen Index zu.
 
Hi, das hört sich gut an, aber kannst du mir noch einmal erläutern wie du das umsetzen würdest? Wie kann ich denn diese Schieben der Indexvariable bis >12 realisieren sodass dieser danach wieder anfängt

Öhm, einfach zählen, im einfachsten Fall:
Code:
  // Index erhöhen, wenn Schiebetakt aktiv und FHM nicht gesetzt ist
  IF NOT FHM AND Schiebetakt THEN
    Index := Index+ 1;
    IF Index > 12 THEN // Drehung ist einmal rum
        Index:=1;
    END_IF;
  END_IF;

  // FHM auf Schiebetakt setzen
  FHM := Schiebetakt;

Du musst dann nur noch Index und Bearbeitungsposition/Aufgabestationen zuordnen.
Je nach Größe mache ich das gerne manuell, finde ich übersichtlicher:
Code:
CASE Index OF // Es müssen alle Indexpositionen eingestellt werden
0:
Aufgabestation.Index:=1;
Bearbeitungsstation.Index:=5;
1:
Aufgabestation.Index:=2;
Bearbeitungsstation.Index:=6;
2:
Aufgabestation.Index:=3;
Bearbeitungsstation.Index:=7;
usw.
END_CASE;

Da bei meinen Stationen immer ein FB vorhanden ist für die Abarbeitung wird das vorliegende Teil mittels INOUT über die Bausteinschnittstelle übergeben. Ich erstelle für Register immer ein UDT und das lässt sich komplett übergeben und kann auch beschrieben werden:
Code:
// Aufgabestation
INOUT_Register:=DB_Register.this[Aufgabestation];
// Bearbeitungsstation
INOUT_Register:=DB_Register.this[Bearbeitungsstation];

Hoffe das ist einigermaßen verständlich.



Leider ist es teilweise ein EX-Bereich, das erschwert das nachrüsten.
Wenn die Aufgabestation kein EX-Bereich ist dann ist es einfach. Die 4 Sensoren sind an der Stelle angebaut wo die Aufgabestation ist und die Löcher für die Indexierung haben nichts mit EX zu tun. Dann weiß man durch die 4 Sensoren die an der Aufgabestation sind wieviele Löcher belegt sind und kann im Dualzahlensystem 1,2,4,8 addieren für den Index.
Es reicht also das nur ein Teil des Tisches nicht im EX-Bereich liegt.
Erspart auf jedem Fall Fehlerbehebungen falls die Schiebung doch mal nicht sauber läuft.
Und wenn ich darüber nachdenke dann würde ich 5 Sensoren nehmen, damit ich mit einem immer eine Flanke generieren kann das eine aktuelle Position anliegt.
 
Hab mit EX-Bereich keine Erfahrung aber RFID oder DMC lesen wird wohl auch möglich sein? Falls man das Nest nicht eindeutig über Hardware identifizieren kann, muss man eine Möglichkeit schaffen, dies manuell am HMI zu machen. Im besten Fall macht man das einmalig.

Jetzt weiß man Nest X steht an der Einlegeposition. Nach dem Takt/Schiebe-Signal weiß man Nest X+1 ist jetzt an der Einlegeposition, und Nest X steht bei der Station nach der Einlegestation.

Ist Nest 12 zur Einlegeposition, und das Taktsignal kommt, ist wieder Nest 1 bei der Einlegeposition.

Die Daten an sich werden im Array nicht bewegt. Die Nester greifen anhand der ihnen ja bekannten Nummer immer auf den richtigen Index

Code:
IF R_TRIG_Schiebetakt.Q

THEN

IF (NOT Station[index].Bearbeitung_1 OR NOT Station[index].Bearbeitung_2 OR NOT Station[index].Bearbeitung_3)

// wenn die Station keine vorherigen Bearbeitungsdaten enthält weise neue zu

Station[index] := Rezeptur;
Parameter_Bearbeitung := Station[index];
index := index + 1;

ELSE

// sonst erhöhe nur den Zähler um eine Station

Parameter_Bearbeitung := Station[index];
index := index + 1
 
END_IF;
END_IF;

// Wenn der Zähler größer als 12 ist setze Ihn zurück auf 1

IF index >12
THEN
index := 1;
END_ID;

Meint ihr das so?
Würde nurnoch fehlen, wie ich nach dem bearbeiten den fertigen Schritt löschen kann:

Code:
IF R_TRIG_Bearbeitung_Ende.Q
THEN
 IF
 (Bearbeitung_1)
 THEN
 Station[index].Bearbeitung_1 := FALSE;
 ELSIF
 (Bearbeitung_2)
 THEN
 Station[index].Bearbeitung_2 := FALSE;
 ELSIF
 (Bearbeitung_3)
 THEN
 Station[index].Bearbeitung_3 := FALSE;
 END_IF;

Meint ihr das so?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi, das hört sich gut an, aber kannst du mir noch einmal erläutern wie du das umsetzen würdest? Wie kann ich denn diese Schieben der Indexvariable bis >12 realisieren sodass dieser danach wieder anfängt
Falls Du von 0 bis 11 zählen würdest, wäre
Zaehler := ( Zaehler + 1 ) MOD 12 ;
wohl die einfachste Lösung.
 
Ich habe in der Vergangenheit sehr sehr viele Rundschalttische programmiert - als Speicher-Abbild diente mir hier IMMER ein Array of UDT.
Der UDT beinhaltete dann für jeden Bearbeitungschritt ein Statusbit und ggf. weitere Informationen wie erfasste Fehler oder Messwerte.
Das Array war als Ringspeicher ausgelegt/umgesetzt - der Inhalt des letzten Platzes wurde bei einem neuen Taktimpuls dann wieder auf den ersten Platz geschrieben.
Fehl-Bearbeitungen hat es da nie gegeben - ausser wenn manuell Teile zugeführt oder entnommen worden sind.
Der Schiebespeicher wurde auch im Handbetrieb vor- oder ggf, auch zurückgeschoben.
RFID habe ich da nie benötigt - das war nur ein Thema bei Transferstrecken mit Werkstückträgern weil hier oft und gerne mal händisch eingeriffen worden ist ...
 
Ich habe in der Vergangenheit sehr sehr viele Rundschalttische programmiert - als Speicher-Abbild diente mir hier IMMER ein Array of UDT.
Der UDT beinhaltete dann für jeden Bearbeitungschritt ein Statusbit und ggf. weitere Informationen wie erfasste Fehler oder Messwerte.
Das Array war als Ringspeicher ausgelegt/umgesetzt - der Inhalt des letzten Platzes wurde bei einem neuen Taktimpuls dann wieder auf den ersten Platz geschrieben.
Fehl-Bearbeitungen hat es da nie gegeben - ausser wenn manuell Teile zugeführt oder entnommen worden sind.
Der Schiebespeicher wurde auch im Handbetrieb vor- oder ggf, auch zurückgeschoben.
RFID habe ich da nie benötigt - das war nur ein Thema bei Transferstrecken mit Werkstückträgern weil hier oft und gerne mal händisch eingeriffen worden ist ...
Hi,

Hast du vllt ein Beispiel wie genau du den Ringspeicher aufgebaut hast?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi
Ich kann da Larry Laffer vollumfänglich zustimmen. Natürlich, mit Sensoren kann man noch mehr prozesssicherheit mit sich bringen. Aber bei Rundtischen nicht zwingend nötig.
Ich handhabe das so änlich wie Larry Laffer. Anstat ein Bit setzte schreibe ich ein Zustand in Int. Sprich "0" für kein Teil, 1 "ein IO Teil eingelegt", "11" Fehler bei Station 1, "21" Fehler bei Station 2, etc. Wenn das Teil entnommen wurde, dann wieder eine 0 rein schreiben.
In deinem Fall könntest du auch zusätzlich eine Zieladresse rein schreiben. Sprich, wenn dein Nest bei Station 8 ankommt und die Zieladresse 8 hat, dann bearbeiten (ansonsten nicht) und am Ende von der Bearbeitung der Station die nächste Zieladresse rein schreiben. So hatte ich das bei Transfer Systemen gemacht.

Gruss blimaa
 
Hallo,
Schieberegister habe ich schon seit s5 Zeiten immer wieder bei Anlagen verwendet, wo Artikel transportiert und an verschiedenen Station bearbeitet werden.
Das lässt sich ja heutzutage sehr schön, einfach und sauber mittels eines Arrays of Datentype anlegen.

Beispiel (muss natürlich an Anlage / Produkt usw. angepasst werden:
1731393822672.png

Einen Fehler ins Schiebregister einzutragen, kann manchmal sehr aufwendig sein (Stationsschrittkette bleibt hängen, Fehler noch nicht eingetragen, und wird vom Bediener neu gestartet...).
Deshalb habe ich bei einer fertigen Bearbeitung an einer Station immer die Stationsnummer eingetragen (im Beispiel int2), d.h. ich wusste, welche Station als letzte erfolgreich den Artikel / WT bearbeitet hatte.
 
Hi,
Hast du vllt ein Beispiel wie genau du den Ringspeicher aufgebaut hast?
Was genau möchtest du wissen ? Einen Code für so einen Baustein habe ich gerade nicht mehr zur Hand. Wenn du aber beschreibst, was du genau eintragen willst kann man das ja schnell erstellen.
Wie so ein UDT-Inhalt aussehen könnte hat dir ja @Peter Wahlen im Beitrag #19 schon schön veranschaulicht.
Bei mir ist der komplette Schiebespeicher ein FB gewesen, der sich um alles intern gekümmert hat. Da ich den relativ universell gehalten hatte war das Array auf die max. bei uns auftretenden Tischplätze dimensioniert. Wieviele Plätze ich dann wirklich benutze war ein IN-Parameter, Genauso das Trigger-Bit für vorschieben bzw. zurückschieben. Der Aufruf dieses FB's erfolgte an jeder Station, die etwas am Speicher geändert hatte - aber nicht jede Station bewirkte dieselben Funktionen innerhalb des FB. Der Rundschalttisch steuerte nur das Schieben an. Die Stationen übergaben ihre Index-Nummer und die möglichen Zustände.
Dafür gibt es aber sicherlich sehr viele unterschiedliche Herangehensweisen. Ein paar Beispiele wurden ja schon genannt und sicher werden noch weitere folgen ...
 
Zurück
Oben