Autor
|
Thema: Attribut Gesamtbearbeitungszeit und Restbearbeitungszeit (2473 mal gelesen)
|
SanSandra Mitglied
Beiträge: 9 Registriert: 08.01.2014
|
erstellt am: 08. Jan. 2014 20:34 <-- editieren / zitieren --> Unities abgeben:
Hallo liebes Forum, ich möchte im Rahmen meines Studiums eine Werkstattfertigung simulieren. Für den Teilefluss möchte ich Prioritätsregeln verwenden. Nun komme ich an folgender Stelle nicht weiter: 1. möchte ich nachdem ein Teil erzeugt wurde, die gesamte Bearbeitungszeit aus dem Arbeitsplan auslesen und dem Teil als Attribut zuschreiben. 2. möchte ich an ausgewählten Stationen die gesamte Restbearbeitungszeit bis zum Auftragsende (der restlichen Bearbeitungsstatonen)dem Attribut zuschreiben. Die Teile erzeuge ich über einen Arbeitsplan mit Reihenfolgetabelle (siehe Hilfe). Über Anregungen zur Umsetzung freue ich mich sehr. [Diese Nachricht wurde von SanSandra am 08. Jan. 2014 editiert.] [Diese Nachricht wurde von SanSandra am 08. Jan. 2014 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Bon Simul Mitglied Simulant
Beiträge: 1250 Registriert: 08.08.2011 Plant Simulation 10.1, 11 ff Professional
|
erstellt am: 08. Jan. 2014 23:05 <-- editieren / zitieren --> Unities abgeben: Nur für SanSandra
Die Tabelle besitzt eine Methode sum(bereich), damit können Sie die Summe aus einer Reihe von Zellen bilden. Wenn Sie den Arbeitsplan nach der Hilfe aufgebaut haben, dann müssen Sie auf die Sub-Tabellen zugreifen. Sie können den Namen des Teils zur Adressierung innerhalb der Tabelle verwenden. Die Gesamtsumme der Bearbeitungszeiten (wenn die Bearbeitungszeiten in der zweiten Spalte der Untertabelle stehen) würde dann wie folgt aussehen:
Code:
gesamtbearbeitungszeit:= arbeitsplan[1,teil.name].sum({2,1}..{2,*});
Die Bereichsangabe (siehe Hilfe !!) beginnt für die Restbearbeitungszeit nicht in der Zeile 1 , sondern in der Zeile PositionImArbeitsplan+1 oder op+1 :
Code:
restbearbeitungszeit:= arbeitsplan[1,teil.name].sum({2,teil.positionImArbeitsplan+1}..{2,*});
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
SanSandra Mitglied
Beiträge: 9 Registriert: 08.01.2014
|
erstellt am: 09. Jan. 2014 00:06 <-- editieren / zitieren --> Unities abgeben:
Danke für Ihre Antwort. Leider kann ich den Code noch nicht wie gewünscht umsetzen. Ich glaube, ich habe den Zugriff auf die Sub-Tabellen noch nicht richtig verstanden. Folgenden Code verwende ich: --------------------- :time is teiletyp : string; Station : object; Arbeitsplan : table; do @.erzeugeattr("gesamtbearbeitungszeit","time"); teiletyp:=@.teiletyp; Station := ?; Arbeitsplan := root.Arbeitsplan["Arbeitsschritte", TeileTyp]; @.gesamtbearbeitungszeit := arbeitsplan["bearbeitungszeit",station].sum({2,1}..{2,*}); end; ----------------------- Beim ausführen der Methode erscheint die Fehlermeldung: "ein void kann keine methode name empfangen" Jetzt weiß ich nicht weiter. So gut kenne ich mich mit SimTalk noch nicht aus.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Bon Simul Mitglied Simulant
Beiträge: 1250 Registriert: 08.08.2011 Plant Simulation 10.1, 11 ff Professional
|
erstellt am: 09. Jan. 2014 10:09 <-- editieren / zitieren --> Unities abgeben: Nur für SanSandra
Zitat:
"ein void kann keine methode name empfangen"
das kommt von einer anderen Methode (aufrufende Methode?) In einer Methode, die nicht direkt durch Sensoren oder Aus-oder Eingangssteuerung aufgerufen wird, können Sie nicht auf @ und ? zugreifen, Sie müssten das Teil und die station als Übergabeparameter definieren und beim Aufruf übergeben. Das Attribut können Sie in der Klassenbibliothek anlagen, das muss nicht durch Programmierung passieren. Wenn Sie keinen Wert zurückgeben, dürfen Sie auch kein Rückgabewert definieren (:time).
Wenn root.Arbeitsplan["Arbeitsschritte", TeileTyp]; schon der Arbeitsplan ist, dann müsste die Summe so aussehen: arbeitsplan.sum({2,1}..{2,*}) das ergäbe jetzt die folgende Methode:
Code:
(station : object; teil : object) is teiletyp : string; Arbeitsplan : table; do teiletyp:=teil.teiletyp; Arbeitsplan := root.Arbeitsplan["Arbeitsschritte", TeileTyp]; teil.gesamtbearbeitungszeit := arbeitsplan.sum({2,1}..{2,*}); end;
Aufruf mit: methodenname(?,@); [Diese Nachricht wurde von Bon Simul am 09. Jan. 2014 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
SanSandra Mitglied
Beiträge: 9 Registriert: 08.01.2014
|
erstellt am: 09. Jan. 2014 10:40 <-- editieren / zitieren --> Unities abgeben:
Hallo, danke zunächst für Ihre Antwort. Leider komme ich noch nicht weiter. ich möchte die Methode in der Eingangssteuerung eines Puffers verwenden. Diese soll abfragen welches BE gerade angekommen ist und dann als Attribut die gesamte Bearbeitungszeit bis zum Auftragsende dem Teil zuordnen (Ich möchte dem Attribut die Zeit erst zu diesem Zeitpunkt mitgeben, da ich die Bearbeitungszeiten im Arbeitsplan verändere). Die Reihenfolgetabelle und den Arbeitsplan habe ich nach der Hilfe "Teile mit einem Arbeitsplan produzieren und bearbeiten" erstellt. Ich habe in der Klassenbibliothek somit nur ein BE welches dann in der Quelle zum jeweiligen Typenvertreter wird mit den Eigenschaften des Arbeitsplanes. Ich freue mich sehr wenn Sie mir weiterhelfen. Vielen Dank für die Unterstützung!
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Bon Simul Mitglied Simulant
Beiträge: 1250 Registriert: 08.08.2011 Plant Simulation 10.1, 11 ff Professional
|
erstellt am: 09. Jan. 2014 11:17 <-- editieren / zitieren --> Unities abgeben: Nur für SanSandra
wenn diese Methode die Eingangssteuerung ist, dann können Sie auf @ und ? zugreifen. Und Sie brauchen alle Bearbeitungszeiten nach der aktuellen Operation (positionImArbeitsplan, sollten Sie in jeder Maschine um eins erhöhen z.B. Ausgangssteuerung) Code:
is teiletyp : string; Arbeitsplan : table; do teiletyp:=@.teiletyp; Arbeitsplan := root.Arbeitsplan["Arbeitsschritte", TeileTyp];--gibt die Sub-tabelle zurück teil.gesamtbearbeitungszeit := arbeitsplan.sum(2,@.positionImArbeitsplan+1}..{2,*}); end;
Im forum gibt es zur Zeit einen ähnlichen Threat. [Diese Nachricht wurde von Bon Simul am 09. Jan. 2014 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
SanSandra Mitglied
Beiträge: 9 Registriert: 08.01.2014
|
erstellt am: 09. Jan. 2014 14:15 <-- editieren / zitieren --> Unities abgeben:
Der Code hat mir sehr weiter geholfen. Meine Steuerung funktioniert nun. Leider habe ich noch ein Problem beim auswerten: Ich möchte das Verhätnis der Durchlaufzeit (IST) zur Gesamtbearbeitungszeit(SOLL) auswerten. Mit einer Methode in der Eingangssteuerung der Senke werte ich die gesamte Durchlaufzeit (IST) sowie das Attribut der Gesamtbearbeitungszeit (SOLL) aus. Die Werte gebe ich in zwei globalen Variablen aus, die ich mit einer Zeitleiste auswerte. Das kuriose ist, dass Teile fehlen. Die Gesamtausbringung beträgt bspw. 5000, die Durchlaufzeit (IST) ergibt 4888 Teile und die Durchlaufzeit (SOLL) 4500 Teile. Ich habe vermutet, dass es an der Schrittweite beim Aufzeihnen liegt, aber watch sollte ja alles aufzeichnen. Oder liegt es vielleicht darin, dass das BE sich weiter bewegt während die Eingangssteuerung der Senke die MEthode ausführt? Ich bin ratlos... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Bon Simul Mitglied Simulant
Beiträge: 1250 Registriert: 08.08.2011 Plant Simulation 10.1, 11 ff Professional
|
erstellt am: 09. Jan. 2014 14:29 <-- editieren / zitieren --> Unities abgeben: Nur für SanSandra
|
SanSandra Mitglied
Beiträge: 9 Registriert: 08.01.2014
|
erstellt am: 09. Jan. 2014 15:03 <-- editieren / zitieren --> Unities abgeben:
Danke für das Angebot. Hier meine Steuerung zum Erzeugen des Attributs "dlz_soll" is teiletyp : string; Arbeitsplan : table; do @.erzeugeattr("DLZSoll","time"); teiletyp:=@.teiletyp; Arbeitsplan := root.Arbeitsplan["Arbeitsschritte", TeileTyp]; @.DLZSoll := arbeitsplan.sum({1,1}..{1,*})+0.5*arbeitsplan.sum({1,1}..{1,*}); end; Meine Eingangssteuerung in der Senke: is do dlz:=time_to_num(ereignisverwalter.zeit-@.erzeugt)/3600/24; dlz_soll:=time_to_num(@.dlzsoll)/3600/7.6; taa:=dlz-dlz_soll; end; Die Variablen in der Methode der Senke sind globale Variablen, die ich über die Zeitleiste auswerte. Dankeschön! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Bon Simul Mitglied Simulant
Beiträge: 1250 Registriert: 08.08.2011 Plant Simulation 10.1, 11 ff Professional
|
erstellt am: 09. Jan. 2014 15:37 <-- editieren / zitieren --> Unities abgeben: Nur für SanSandra
Zitat:
Die Werte gebe ich in zwei globalen Variablen aus, die ich mit einer Zeitleiste auswerte. Das kuriose ist, dass Teile fehlen. Die Gesamtausbringung beträgt bspw. 5000, die Durchlaufzeit (IST) ergibt 4888 Teile und die Durchlaufzeit (SOLL) 4500 Teile.
Ich verstehe Ihre Frage noch nicht. In Ihrer Methode berechnen Sie die Durchlaufzeiten in Tagen. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
SanSandra Mitglied
Beiträge: 9 Registriert: 08.01.2014
|
erstellt am: 09. Jan. 2014 16:56 <-- editieren / zitieren --> Unities abgeben:
Die Anzahl der Zeiten in der Zeitleiste müsste der gesamten Ausbringung entsprechen (ich vergleiche die String-Nummerierung in der Tabelle). Das ist aber leider nicht der Fall: Bei DLZ (Soll) habe ich mehr Werte als bei DLZ (IST). Ich erfasse ja mit der Methode in der Senke jede Änderung, also immer wenn ein BE eintritt. Somit müssten die Werte in der Anzahl identisch sein... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Bon Simul Mitglied Simulant
Beiträge: 1250 Registriert: 08.08.2011 Plant Simulation 10.1, 11 ff Professional
|
erstellt am: 09. Jan. 2014 17:02 <-- editieren / zitieren --> Unities abgeben: Nur für SanSandra
Wie steuern Sie die Zeitleiste (Modus watch?), an welcher Stelle ermitteln Sie die Soll-DLZ (erste Methode). Wenn Sie die Soll-DLZ an der Quelle erzeugen, dann fehlen Ihnen genau die Teile, die sich gerade in der Produktion befinden. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
SanSandra Mitglied
Beiträge: 9 Registriert: 08.01.2014
|
erstellt am: 09. Jan. 2014 17:34 <-- editieren / zitieren --> Unities abgeben:
Die Zeitleiste steuer ich im Modus watch. Die Soll-DLZ ermittel ich an der ersten Arbeitsstation. Die Abfrage, die ich auswerte, jedoch erst an der Senke (Abfrage Atrribut des BEs). Somit dürften doch nur die BEs gezählt werden, die ausgetreten sind, oder? Ich verstehe das nicht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Bon Simul Mitglied Simulant
Beiträge: 1250 Registriert: 08.08.2011 Plant Simulation 10.1, 11 ff Professional
|
erstellt am: 09. Jan. 2014 17:45 <-- editieren / zitieren --> Unities abgeben: Nur für SanSandra
Das kann an der Zeitleiste liegen. Haben Sie schon die Anzahl der Eintragungen in der Zeitleisrte mit der Statistik der Arbeitsstationen/ Senke verglichen? Der Modus watch zeichnet nur auf, wenn ein Änderung des Wertes auftritt. Wenn zwei Teile hintereinander zum Beispiel die gleiche Soll-DLZ hat, dann erfolgt keine Aufzeichnung in der Zeitleiste. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
SanSandra Mitglied
Beiträge: 9 Registriert: 08.01.2014
|
erstellt am: 10. Jan. 2014 00:01 <-- editieren / zitieren --> Unities abgeben:
|
Bon Simul Mitglied Simulant
Beiträge: 1250 Registriert: 08.08.2011 Plant Simulation 10.1, 11 ff Professional
|
erstellt am: 10. Jan. 2014 09:53 <-- editieren / zitieren --> Unities abgeben: Nur für SanSandra
Für die Anzahl der Teile gibt es einen statistischen Wert: statAnzahlEin. Wenn Sie eine Zeitleiste für alle Teile anlegen wollen, dann können Sie wie folgt vorgehen: Fügen Sie eine Tabelle in das Netzwerk ein, die ersten zwei Spalten formatieren Sie als time. Dann fügen Sie eine Zeile in die Methode mit der Berechnung der Bearbeitungszeit ein: tabelle.schreibeZeile(1,tabelle.yDim+1,ereignisverwalter.zeit, @.DLZSoll); Analog für IST. In der Init-Methode müssen Sie den Inhalt der Tabelle jeweils löschen. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |