# Rüstzeitenerfassung in Abhängigkeit zu Artikelnummern



## aimlezz (21 November 2022)

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 (22 November 2022)

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


----------



## aimlezz (22 November 2022)

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 (22 November 2022)

> 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"?


----------



## aimlezz (22 November 2022)

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.


----------



## jensemann (22 November 2022)

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 (22 November 2022)

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?


----------



## Oberchefe (22 November 2022)

> Oder denke ich zu simplizifiert?



Je nach gewünschter Genauigkeit ergibt sich in dem Fall die "Abtastrate" wodurch sich eine vergleichsweise große Menge Daten ergeben kann.


----------



## aimlezz (23 November 2022)

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 (23 November 2022)

aimlezz schrieb:


> 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.


----------



## Blockmove (23 November 2022)

Heinileini schrieb:


> 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.


----------



## aimlezz (24 November 2022)

Heinileini schrieb:


> 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.



Heinileini schrieb:


> 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.


----------



## aimlezz (24 November 2022)

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.


----------



## SPS-freak1 (24 November 2022)

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 (24 November 2022)

aimlezz schrieb:


> 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 (24 November 2022)

SPS-freak1 schrieb:


> 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 (24 November 2022)

SPS-freak1 schrieb:


> 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.


----------



## aimlezz (6 Dezember 2022)

@Blockmove so in etwa habe ich mir das auch gefacht. Ich würde ihn einfach in Sekunden zählen lassen, wenn er bei 60 ankommt fängt er von vorne an und setzt den nächsten Zähler um 1 hoch und so weiter.
Unterbrechen sollte an der Stelle dann auch nicht mehr das Problem sein, man kann ja einmal anhalten ohne zu kopieren und resetten und einmal mit Reset der Zähler und verschieben der erfassten Daten. 

Habe die DB's soweit auch schon fertig, jetzt fehlen mir halt noch die eigentlich arbeitetenden Bausteine. Leider hatte ich die letzten 2 Wochen wenig bis gar keine Zeit daran weiter zu arbeiten, weswegen ich auch hier erstmal nichts mehr geschrieben hatte.
Diese oder nächste Woche sieht das etwas anders aus.


----------

