Rüstzeitenerfassung in Abhängigkeit zu Artikelnummern

aimlezz

Member
Beiträge
6
Punkte Reaktionen
0
Zuviel Werbung?
->Hier kostenlos registrieren
Guten Tag,
wir haben hier mehrere Produktionsanlagen, welche mehrere Produkte herstellen können. Wir haben schon ein sogenanntes "Messen an der Linie" was uns Daten wie Geschwindigkeit, Abfall, Betriebszeit zu bestimmten Artikelnummern liefert. Heißt die AFK geben an einem Rechner die Artikelnummer ein und es werden aus einem DB in der SPS die entsprechenden Daten gezogen.
Nun möchten wir aber zusätzlich dazu die Rüstzeiten erfassen. Dies soll aber nicht allgemein auf addiert werden sondern soll nach Artikelnummern abgespeichert werden.
Beispiel:
Von Artikel "A" nach Artikel "B" wäre Zeit 1.
Von Artikel "A" nach Artikel "C" wäre Zeit 2.
Von Artikel "B nach Artikel "C" wäre Zeit 3.

Ich glaube, das Prinzip ist klar. Allerdings weiß ich nicht wirklich wie ich damit anfangen soll, zumal die Daten in einem DB abgelegt und ein festen Abständen exportiert werden sollen, damit man sie auswerten kann.

Gruß
aimlezz
 

Oberchefe

Well-known member
Beiträge
2.655
Punkte Reaktionen
476
Bei jedem Start mit neuer Artikelnummer folgende Daten in einem Array[0..X] OF Struct wegspeichern:
- fortlaufende "Wechselnummer" (DINT?), hochzählen bei jedem Wechsel zur Vermeidung von Doppelzählungen bei der Auswertung, kein Reset dieser Nummer
- vergangene Zeit seit letztem Wechsel (Sekunden in DINT?)
- alte Artikelnummer
- neue Artikelnummer
der Index zur indirekten Adressierung des Arrays wird bei jedem Wechsel um 1 erhöht, muss programmtechnisch verriegelt werden (bzw. das Beschreiben des Arrays wenn die Grenze erreicht wurde). Der Index sollte nach dem Export der Daten wieder auf 0 gesetzt werden
Zudem muss nach dem Wechsel die aktuelle Artikelnummer als "neue alte" Artikelnummer gespeichert werden und die Zeit neu gestartet werden
 
OP
A

aimlezz

Member
Beiträge
6
Punkte Reaktionen
0
Zuviel Werbung?
->Hier kostenlos registrieren
Hey erstmal danke für die schnelle Antwort.

Ich habe mir bis jetzt einen Datenbaustein mit ARRAY[1..300] angelegt, mit einem UDT im Hintergrund.
Dieser enthält aktuell die Daten:
Artikelnummer_alt
Artikelnummer_neu
Ruestzeit

Da das Rüsten durch die AFK ausgewählt werden muss, kann ich also per Bit die Zeitzählung starten, sobald diese den Rüstvorgang ausgewählt haben, ich weiß nur noch nicht so ganz wie ich hier nun die alte und die neue Artikelnummer unterscheiden soll.
Eventuell muss ich hier die Bedienoberfläche anpassen, damit nach einem Klick auf den Button "Rüsten" eine Abfrage für die alte sowie die neue Artikelnummer erscheint.
Zählen selbst wollte ich dann evtl über FB153 (Betriebsstundenzähler realisieren).

Ich bin aber froh wenn ich erstmal die richtigen Daten in den DB bekomme, danach muss ich mich dann um das exportieren kümmern.
 

Oberchefe

Well-known member
Beiträge
2.655
Punkte Reaktionen
476
Eventuell muss ich hier die Bedienoberfläche anpassen, damit nach einem Klick auf den Button "Rüsten" eine Abfrage für die alte sowie die neue Artikelnummer
erscheint.

Nein musst du nicht. Die Zeit kann schon mal laufen, das Rüsten ist ja erst dann beendet wenn die neue Nummer aktiv ist?

Betriebsstundenzähler nimmt man eher für eine unterbrechbare Zeit, das Rüsten wird aber eher nicht unterbrochen. Oder willst du den Bediener dazu bringen, dass er "abstempelt" bevor er einen Kaffee trinken geht und hinterher wieder "anstempelt"?
 
OP
A

aimlezz

Member
Beiträge
6
Punkte Reaktionen
0
Nein nicht direkt. Du kannst halt eine Artikelnummer eingeben und diese mit ENTER bestätigen. Ab dann ist das die neue Artikelnummer. In welchem Schritt du das machst, also ob die Anlage nun auf Rüsten oder Produktion steht, ist egal.
Schön finde ich das so auch nicht aber ich habe das ganze auch nicht erstellt, muss jetzt nur die Erweiterung umsetzen.


Die Rüstzeit wird höchstens unterbrochen wenn übers Wochenende gerüstet werden muss und man was für Montags übrig lässt. Das vernachlässige ich aber erstmal.
Dachte halt an den Betriebsstundenzähler weil er bereits vorprogrammiert ist und ich nicht mehr Ein- bzw Ausgänge brauche, als er bietet.
 
Zuletzt bearbeitet:

jensemann

Well-known member
Beiträge
254
Punkte Reaktionen
92
Zuviel Werbung?
->Hier kostenlos registrieren
Du hast ja die aktive Artikelnummer in einer Variable. Die schiebst du bei beim Start von rüsten in Artikelnummer_alt. Irgendwann während der Rüstzeit wird man ja die neue Artikelnummer eingeben müssen. Die schiebst du dann in Artikelnummer aktiv.
Bei Rüsten_Ende schreibst du halt alle Daten weg.
Du musst lediglich verhindern, dass die Artikelnummer geändert werden kann solange Rüsten nicht aktiv ist.
 

Plan_B

Well-known member
Beiträge
973
Punkte Reaktionen
271
Wenn es eh offline ausgewertet wird, geht doch auch brute force.
Einfach in fixen Zeitabständen alle relevanten Variablen wegschreiben.
Das eröffnet einer Offlineauswertung auch achträglich alle Möglichkeiten.
Ergeben sich daraus interessante Aspekte, würde ich das gezielt ausprogrammieren um es ggf. direkt zur Anzeige am HMI bringen zu können.
Oder denke ich zu simplizifiert?
 
OP
A

aimlezz

Member
Beiträge
6
Punkte Reaktionen
0
Zuviel Werbung?
->Hier kostenlos registrieren
Also ich habe mir das heute nochmal angeschaut.
Ohne PA-Nummer und ohne Artikelnummer, kann sowieso nicht auf Rüsten geschaltet werden. Das wusste ich so vorher nicht.
Heißt für mich, wenn die "neue" Artikelnummer eingegeben wird, wird die zur "Art_Nummer_aktuell" (die Variable ist im entsprechenden Instanz-DB bereits vorhanden). Ich sorge nun dafür das die Nummer die dort vorher stand, in "Art_Nummer_alt" verschoben wird. Die Variable dafür habe ich bereits angelegt.

Das eigentliche Zählen der Rüstzeit, wird dann durch den "Flankenmerker Rüsten" gestartet. Ist der Rüstvorgang beendet, also der "Flankenmerker Rüsten" wieder 0, möchte ich einmalig den Transfer der Daten in einen DB anstoßen und sobald das erfolgt ist, die gezählte Zeit zurück setzen.

Hoffe so sollte es einigermaßen passen
 

Heinileini

Well-known member
Beiträge
5.656
Punkte Reaktionen
1.280
Das eigentliche Zählen der Rüstzeit, wird dann durch den "Flankenmerker Rüsten" gestartet. Ist der Rüstvorgang beendet, also der "Flankenmerker Rüsten" wieder 0, möchte ich einmalig den Transfer der Daten in einen DB anstoßen und sobald das erfolgt ist, die gezählte Zeit zurück setzen.
Du sprichst von 1 "FlankenMerker" und der unterschiedlichen Auswertung sowohl der positiven als auch der negativen Flanke.
Wenn Du beide Flanken desselben Signals auswerten möchtest, empfehle ich, die FlankenAuswertung "zu Fuss" zu programmieren.
Wenn Du die "vorgefertigten" FlankenErkennungen benutzt, musst Du die doppelte Anzahl an "FlankenMerkern" dafür belegen.

PS:
Sollst Du eigentlich die RüstZeit für jeden RüstVorgang separat "archivieren" oder sollst Du "vergleichbare" RüstVorgänge (bei gleichen von Artikel X nach Artikel Y) zusammenfassen zu einem DruchschnittsWert?
Wenn letzteres, könntest Du die RüstZeiten aufsummieren und müsstest zusätzlich die Anzahl der entsprechenden RüstVorgänge aufsummieren.

Die Pausen in den RüstZeiten, z.B. durch (lange oder "sehr lange") Wochenenden würde ich nicht so gerne grundsätzlich ignorieren wollen.
Z.B. in den (zwar) seltenen Fällen, wenn sich 'Feiertag am Donnerstag' + "Brückentag" + 'Feiertag am Montag' aufsummiert.
 
Zuletzt bearbeitet:

Blockmove

Supermoderator und User des Jahres 2019
Teammitglied
Beiträge
10.374
Punkte Reaktionen
3.022
Die Pausen in den RüstZeiten, z.B. durch (lange oder "sehr lange") Wochenenden würde ich nicht so gerne grundsätzlich ignorieren wollen.
Z.B. in den (zwar) seltenen Fällen, wenn sich 'Feiertag am Donnerstag' + "Brückentag" + 'Feiertag am Montag' aufsummiert.

Unterbrechungen / Pausen im Rüstprozess machen dir nahezu jede Auswertung kaputt. Erfahrungsgemäß kannst du dann die erstellten Reports in die Tonne treten. Üblicherweise hat man im Hintergrund irgendwelche Arbeitszeitmodelle oder wenigstens irgendwelche Buttons für Arbeitsbeginn, Pause, Arbeitsende.
 
OP
A

aimlezz

Member
Beiträge
6
Punkte Reaktionen
0
Zuviel Werbung?
->Hier kostenlos registrieren
PS:
Sollst Du eigentlich die RüstZeit für jeden RüstVorgang separat "archivieren" oder sollst Du "vergleichbare" RüstVorgänge (bei gleichen von Artikel X nach Artikel Y) zusammenfassen zu einem DruchschnittsWert?
Wenn letzteres, könntest Du die RüstZeiten aufsummieren und müsstest zusätzlich die Anzahl der entsprechenden RüstVorgänge aufsummieren.
Jeder Rüstvorgang soll einzeln abgespeichert werden.

Die Pausen in den RüstZeiten, z.B. durch (lange oder "sehr lange") Wochenenden würde ich nicht so gerne grundsätzlich ignorieren wollen.
Z.B. in den (zwar) seltenen Fällen, wenn sich 'Feiertag am Donnerstag' + "Brückentag" + 'Feiertag am Montag' aufsummiert.
Ich möchte das ganze ja auch nur erstmal ignorieren, meist wird an einem Stück gerüstet, sodass dieses "Problem" später angegangen werden kann.


Der Flankenmerker ist so lange gesetzt, wie der Rüstvorgang stattfindet. Das Signal wollte ich zum aktivieren der Zeitzählung nutzen, sprich ist der Flankenmerker "1" so wird gezählt, ist er "0" so wird halt nicht gezählt. So wie ich mir das gedacht hatte brauche ich da eigentlich gar keine Flankenauswertung mehr vornehmen.
 
OP
A

aimlezz

Member
Beiträge
6
Punkte Reaktionen
0
Kurzes generelles Update wie "weit" ich bin:

Ich habe die entsprechenden Variablen im FB angelegt in denen die Daten erstmal abgelegt werden (Instanz-DB's).
Ich habe DB's erstellt in welche die Daten am Ende des Rüstvorgangs gespeichert werden sollen.
Da man den Rüstvorgang wohl immer starten kann sobald die Artikelnummer nicht "0" ist, habe ich das HMI dahingehend angepasst, das beim Druck auf Rüsten nicht nur die geplante Rüstzeit abgefragt wird, sondern ebenfalls die alte und neue Artikelnummer.
Variablen in HMI angelegt sodass die Daten auch im richtigen DB landen.

Als nächstes muss ich mir überlegen wie genau ich zählen lasse. Evtl Sekunden hoch zählen bei 60 den nächsten Zähler um 1 hoch setzen usw. Wobei man auch FB4 dafür nutzen könnte oder?

Dann muss ich mir überlegen wie ich beim Beenden des Rüstvorgangs, die Daten vom Instanz-DB in den "endgültigen" DB verschiebe.
Erst wenn das passiert ist (kann man das irgendwie abfragen?), soll der Zähler zurück gesetzt werden. Alternativ wird dieser über ein erneutes Starten des Rüstvorgangs zurück gesetzt.

Ich hab nur immer das Gefühl das ich zu kompliziert denke und so nicht zur Lösung komme, deshalb schon mal ein großes Danke an alle.
Letzlich seh ich nur oft den Wald vor lauter Bäumen nicht, dafür fehlt mir noch etwas die Routine.
 
Zuletzt bearbeitet:

SPS-freak1

Well-known member
Beiträge
388
Punkte Reaktionen
48
Hi,

Was spricht denn dagegen als Zeit einfach eine Uhrzeit zu nehmen? Sprich mit der positiven Flanke deines Rüstvorgangs die aktuelle Uhrzeit speichern und beim Beenden diese speichern. Dann kannst du doch ganz einfach die Differenz berechnen und hast deine Rüstzeit. Du hast uns zwar noch nicht verraten auf welcher SPS das ganze laufen soll, aber normal hat doch jede Steuerung eine Systemzeit.

Grüße
 

jensemann

Well-known member
Beiträge
254
Punkte Reaktionen
92
Zuviel Werbung?
->Hier kostenlos registrieren
Dann muss ich mir überlegen wie ich beim Beenden des Rüstvorgangs, die Daten vom Instanz-DB in den "endgültigen" DB verschiebe.
Erst wenn das passiert ist (kann man das irgendwie abfragen?), soll der Zähler zurück gesetzt werden. Alternativ wird dieser über ein erneutes Starten des Rüstvorgangs zurück gesetzt.

Ich hab nur immer das Gefühl das ich zu kompliziert denke und so nicht zur Lösung komme, deshalb schon mal ein großes Danke an alle.
Letzlich seh ich nur oft den Wald vor lauter Bäumen nicht, dafür fehlt mir noch etwas die Routine.
Da du ja eine Variable "Rüsten" hast, kannst du deren fallende Flanke abfragen und die Daten verschieben. Mit dieser fallenden Flanke setzt du dir als Erstes einen Merker "Daten kopieren", den setzt du am Schluß des Kopiervorgangs zurück und kannst ihn somit nach Belieben abfragen.
Sollte der Kopiervorgang in einem einzigen Zyklus abgeschlossen sein, wird es schwierig, das zu beobachten :)
 

Heinileini

Well-known member
Beiträge
5.656
Punkte Reaktionen
1.280
Was spricht denn dagegen als Zeit einfach eine Uhrzeit zu nehmen? Sprich mit der positiven Flanke deines Rüstvorgangs die aktuelle Uhrzeit speichern und beim Beenden diese speichern. Dann kannst du doch ganz einfach die Differenz berechnen und hast deine Rüstzeit.
Vorsicht! Das gilt nur, wenn Beginn und Beendung des RüstVorgangs am selben Tag passieren!
 

Blockmove

Supermoderator und User des Jahres 2019
Teammitglied
Beiträge
10.374
Punkte Reaktionen
3.022
Hi,

Was spricht denn dagegen als Zeit einfach eine Uhrzeit zu nehmen? Sprich mit der positiven Flanke deines Rüstvorgangs die aktuelle Uhrzeit speichern und beim Beenden diese speichern. Dann kannst du doch ganz einfach die Differenz berechnen und hast deine Rüstzeit. Du hast uns zwar noch nicht verraten auf welcher SPS das ganze laufen soll, aber normal hat doch jede Steuerung eine Systemzeit.

Grüße
Da spricht nichts dagegen. Allerdings nicht einfach die Uhrzeit, sondern Datum und Uhrzeit (Datentyp date_and_time).
Macht es bei tagesübergreifenden Rüstungen einfacher.
Persönlich löse ich sowas immer lieber Variablen, die ich im Sekundentakt hochzähle.
Damit ist man deutlich flexibler, wenn z.B. Rüstungen aufgrund von Wochenende oder Störungen unterbrochen werden.
In so einem Fall kann ich das Hochzählen solange stoppen bis es weitergeht.
 
Oben