Autor
|
Thema: Auftragsfreigabe periodisch aktivieren (1091 mal gelesen)
|
smjaprig Mitglied
Beiträge: 4 Registriert: 13.10.2015
|
erstellt am: 13. Okt. 2015 18:32 <-- editieren / zitieren --> Unities abgeben:
[URL=INTERNETADRESSEHIER][/URL]Hallo allerseits, ich habe ein Problem mit meiner Simulation für meine BA Arbeit und komme da nicht so recht weiter. Ich habe eine Werkstattproduktion in der die Quelle nur Aufträge freigibt, wenn die Bestandskonten der Station 1, 2, 3 und 4 durch die Freigabe nicht verletzt werden. Ich möchte diesen Freigabeprozess nun alle 8 Stunden, also zu jeder Schicht, durchführen. Ich denke am beste geht es mit einem Generator, aber ich hab im Moment echt keine Ahnung wie und die Zeit drängt, weswegen ich für jede Hilfe dankbar bin! Das Modell lässt sich unter diesem Linkfinden. Ein Bild habe ich ebenfalls angehangen. Für jede Hilfe wäre ich euch sehr dankbar! Schöne Grüße, Janis
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: 13. Okt. 2015 20:06 <-- editieren / zitieren --> Unities abgeben: Nur für smjaprig
ein Generator, der eine Methode im Abstand von 8 Stunden aufruft ist ein guter Ansatz. Was meinen Sie mit "wenn die Bestandskonten der Station 1, 2, 3 und 4 durch die Freigabe nicht verletzt werden"? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
smjaprig Mitglied
Beiträge: 4 Registriert: 13.10.2015
|
erstellt am: 13. Okt. 2015 20:29 <-- editieren / zitieren --> Unities abgeben:
Hallo Bon Simul, danke für deine Antwort! Jede Arbeitsstation besitzt ein Bestandskonto in welches bei Auftragsfreigabe die (gewichteten) Bearbeitungszeiten eingebucht werden und wieder ausgebucht werden, wenn der Auftrag an der Station bearbeitet wurde. Es werden immer nur so viele Aufträge freigegeben, wie durch die Bestandskonten zulässig ist. Ich habe schon einiges mit einem Generator und einer Methode versucht, bin bisher aber nicht zu dem gewünschten Erfolg gekommen. Ich habe nun zwischen der Flusssteuerung und der Quelle einen Puffer (Pool) eingefügt, welcher genügend Aufträge (Produkte) aufnehmen kann. Der Pool hat als Ausgangssteuerung die Methode "Freigabesteuerung" welche folgendermaßen aussiieht: Zitat:
: time is bearbeitungszeit1 : time; bearbeitungszeit2 : time; bearbeitungszeit3 : time; bearbeitungszeit4 : time; ES1 : object; ES2 : object; ES3 : object; ES4 : object; do ES1 := .Modelle.Netzwerk1.Station1.Station1; ES2 := .Modelle.Netzwerk1.Station2.Station2; ES3 := .Modelle.Netzwerk1.Station3.Station3; ES4 := .Modelle.Netzwerk1.Station4.Station4; bearbeitungszeit1 := Arbeitsplan[1,@.Produkt][2,ES1]; bearbeitungszeit2 := Arbeitsplan[1,@.Produkt][2,ES2]; bearbeitungszeit3 := Arbeitsplan[1,@.Produkt][2,ES3]; bearbeitungszeit4 := Arbeitsplan[1,@.Produkt][2,ES4]; if (BestandskontoStation1 + bearbeitungszeit1) <= 420 and (BestandskontoStation2 + bearbeitungszeit2) <= 420 and (BestandskontoStation3 + bearbeitungszeit3) <= 420 and (BestandskontoStation4 + bearbeitungszeit4) <= 420 then @.umlagern; BestandskontoStation1 := Bestandskontostation1 + bearbeitungszeit1; BestandskontoStation2 := Bestandskontostation2 + bearbeitungszeit2; BestandskontoStation3 := Bestandskontostation3 + bearbeitungszeit3; BestandskontoStation4 := Bestandskontostation4 + bearbeitungszeit4; end; end;
Es wird also über die if-Schleife abgefragt, ob Kapazitäten frei sind um einen Auftrag freizugeben. Für den Generator gebe ich als Abstand 8 Stunden (bzw. habe ich in meinem Modell glaube ich noch Minuten bei allen Zeiten) ein. Wie schaffe ich es denn nun, dass der Generator dem Pool sagt, dass er wieder Aufträge freigeben soll? Danke schon mal und einen schönen Abend noch, Janis (Das Bild zeigt die Simulation in dem Moment, in dem Aufträge auf den Stationen abgearbeitet werden, durch den Pool jedoch keine neuen Aufträge freigegeben werden.) 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: 14. Okt. 2015 08:45 <-- editieren / zitieren --> Unities abgeben: Nur für smjaprig
Das Problem der Ausgangssteuerung ist, dass sie nur einmal aufgerufen wird. Wenn in Ihrem Fall die Bedingung für das Umlagern nicht erfüllt ist, erfolgt kein neuer Aufruf mehr und der Materialfluss stoppt. mindestens zwei Möglichkeiten: - Waituntil statt if --> so wird irgendwann immer ein Teil umgelagert: Code:
waituntil (BestandskontoStation1 + bearbeitungszeit1) <= 420 and (BestandskontoStation2 + bearbeitungszeit2) <= 420 and (BestandskontoStation3 + bearbeitungszeit3) <= 420 and (BestandskontoStation4 + bearbeitungszeit4) <= 420 prio 1; @.umlagern;
- keine ausgangssteuerung --> Aufruf durch Generator (jede sekunde) dazu müssten Sie zusätzlich prüfen, ob der nächste Platz frei ist... Code:
if (BestandskontoStation1 + bearbeitungszeit1) <= 420 and (BestandskontoStation2 + bearbeitungszeit2) <= 420 and (BestandskontoStation3 + bearbeitungszeit3) <= 420 and (BestandskontoStation4 + bearbeitungszeit4) <= 420 and Nachfolger.leer then buffer.inhalt.umlagern(Nachfolger); BestandskontoStation1 := Bestandskontostation1 + bearbeitungszeit1; BestandskontoStation2 := Bestandskontostation2 + bearbeitungszeit2; BestandskontoStation3 := Bestandskontostation3 + bearbeitungszeit3; BestandskontoStation4 := Bestandskontostation4 + bearbeitungszeit4; end;
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
smjaprig Mitglied
Beiträge: 4 Registriert: 13.10.2015
|
erstellt am: 14. Okt. 2015 19:08 <-- editieren / zitieren --> Unities abgeben:
Nabend Bon Simul, und wieder mal vielen Dank für die Hilfe! Die zweite Möglichkeit gibt mir einen Fehler aus (void kann keine Methode empfangen, oder so). Ich denke das liegt daran, dass er in einem vorherigen Schritt die Bearbeitungszeit des Produktes überprüft und bei der Lösung allerdings keines auf der Station (also dem Generator) vorhanden ist. Die zweite Lösung funktioniert im Prinzip schonmal, allerdings bildet es nicht genau das ab, was ich brauche. Hier wird die Freigabeüberprüfung dauerhaft durchgeführt und nicht nur alle 8Stunden. Gibt es hier evt. noch eine Möglichkeit die waituntil Schleife so zu erweitern, dass er den Abgleich nur alle 8 Stunden startet? Oder gibt's es vielleicht eine Möglichkeit die Methode mittels eines Triggers alle 8 Stunden zu aktivieren? Danke! 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: 15. Okt. 2015 09:05 <-- editieren / zitieren --> Unities abgeben: Nur für smjaprig
|
smjaprig Mitglied
Beiträge: 4 Registriert: 13.10.2015
|
erstellt am: 16. Okt. 2015 23:49 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, es funktioniert nun tatsächlich irgendwie! Danke für die Hilfe. Allerdings hat sich nun zum Schluss doch noch ein neues Problem aufgetan, welches ich mir einfach nicht erklären kann. Vielleicht hat einer von euch eine Idee? Leider ist das Modell recht komplex geworden, so dass ich es hier verlinke anstatt mit Bildern zu arbeiten. Das Problem ist folgendes: Ich lasse in der Freigabesteuerung die Prozesszeiten der Aufträge in die Stationen einbuchen und beim verlassen wieder ausbuchen. Beides über je eine Methode, welche aber die selben Daten und Formeln verwenden. Nun habe ich schon einiges versucht und denke, dass es wohl Probleme mit der waituntil Anweisung + der wait Anweisung des Schichtkalenders geben könnte. Code der Freigabesteuerung (nicht hübsch, sry dafür!)
Code: : time is bearbeitungszeit1 : time; bearbeitungszeit2 : time; bearbeitungszeit3 : time; bearbeitungszeit4 : time; ES1 : object; ES2 : object; ES3 : object; ES4 : object; H1 : real; Pro : string; FT : time; FT2 : time; ST : time; ST2 : time; FT3 : time; FT4 : time; ST3 : time; ST4 : time; DD : time; EDD : time; do ES1 := .Modelle.Netzwerk1.Station1.Station1; ES2 := .Modelle.Netzwerk1.Station2.Station2; ES3 := .Modelle.Netzwerk1.Station3.Station3; ES4 := .Modelle.Netzwerk1.Station4.Station4; bearbeitungszeit1 := Arbeitsplan[1,@.Produkt][2,ES1]; bearbeitungszeit2 := Arbeitsplan[1,@.Produkt][2,ES2]; bearbeitungszeit3 := Arbeitsplan[1,@.Produkt][2,ES3]; bearbeitungszeit4 := Arbeitsplan[1,@.Produkt][2,ES4]; if @.Produkt.name = "Produkt3" then h1 := 0.33 else h1 := 0.25; end; @.EDD:=EventController.Simtime+Arbeitsplan[1,@.Produkt][1,1]+Arbeitsplan[1,@.Produkt][1,2]+Arbeitsplan[1,@.Produkt][1,3]+Arbeitsplan[1,@.Produkt][1,4] + z_uniform (1, 0, 18000); FT:= @.EDD-Arbeitsplan[1,@.Produkt][1,1]-Arbeitsplan[1,@.Produkt][1,2]-Arbeitsplan[1,@.Produkt][1,3]-Arbeitsplan[1,@.Produkt][1,4]; DD:=EDD+z_uniform(1,28800,57600); ST := FT + ((DD - EDD) * h1); FT2 := ST + Arbeitsplan[1,@.Produkt][2,1]; ST2 := FT2 + ((DD - EDD) * h1); FT3 := ST2 + Arbeitsplan[1,@.Produkt][2,2]; ST3 := FT3 + ((DD - EDD) * h1); FT4 := ST3 + Arbeitsplan[1,@.Produkt][2,3]; ST4 := FT4 + ((DD - EDD) * h1); @.FT := FT; @.FT2 := FT2; @.FT3 := FT3; @.FT4 := FT4; @.ST := ST; @.ST2 := ST2; @.ST3 := ST3; @.ST4 := ST4; @.DD := DD; waituntil (BestandskontoStation1 + bearbeitungszeit1) <= 18000 and (BestandskontoStation2 + bearbeitungszeit2) <= 18000 and (BestandskontoStation3 + bearbeitungszeit3) <= 18000 and (BestandskontoStation4 + bearbeitungszeit4) <= 18000 prio 1; @.umlagern; BestandskontoStation1 := Bestandskontostation1 + bearbeitungszeit1; BestandskontoStation2 := Bestandskontostation2 + bearbeitungszeit2; BestandskontoStation3 := Bestandskontostation3 + bearbeitungszeit3; BestandskontoStation4 := Bestandskontostation4 + bearbeitungszeit4;end;
Code der Ausbuchen Methode
Code: : time is bearbeitungszeit5 : time; bearbeitungszeit6 : time; bearbeitungszeit7 : time; bearbeitungszeit8 : time; ES5 : object; ES6 : object; ES7 : object; ES8 : object; do ES5 := .Modelle.Netzwerk1.Station1.Station1; ES6 := .Modelle.Netzwerk1.Station2.Station2; ES7 := .Modelle.Netzwerk1.Station3.Station3; ES8 := .Modelle.Netzwerk1.Station4.Station4; bearbeitungszeit5 := Arbeitsplan[1,@.Produkt][2,ES5]; bearbeitungszeit6 := Arbeitsplan[1,@.Produkt][2,ES6]; bearbeitungszeit7 := Arbeitsplan[1,@.Produkt][2,ES7]; bearbeitungszeit8 := Arbeitsplan[1,@.Produkt][2,ES8]; if ?.vg.name = "Station1" then BestandskontoStation1 := Bestandskontostation1 - bearbeitungszeit5 elseif ?.vg.name = "Station2" then BestandskontoStation2 := Bestandskontostation2 - bearbeitungszeit6; elseif ?.vg.name = "Station3" then BestandskontoStation3 := Bestandskontostation3 - bearbeitungszeit7; elseif ?.vg.name = "Station4" then BestandskontoStation4 := Bestandskontostation4 - bearbeitungszeit8; end; @.umlagern; end;
Ich bin für jede Hilfe sehr dankbar! Gruß
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|