Autor
|
Thema: Auträge gruppieren (2437 mal gelesen)
|
beesdauer Mitglied Student
Beiträge: 37 Registriert: 18.08.2015
|
erstellt am: 18. Aug. 2015 11:10 <-- editieren / zitieren --> Unities abgeben:
Hallo Leute, ich bin neue im Forum. Ich habe ein Problem. Ich möchte aus einem Puffer oder Lager immer 2 BE mit übereinstimmenden Attribute in die nächste Bearbeitungsstation verschieben. EIn Beispiel: BE Attribute BE1 1 BE2 1 BE3 2 BE4 2 BE5 3 Hier sollte zunächste die BE1 und BE2 zur nächsten Station und dann BE3 und BE4. B5 müsste warten Mit dem Programmieren von Methoden tue ich mich sehr schwer und bin daher über jede Hilfe dankbar. 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: 18. Aug. 2015 23:57 <-- editieren / zitieren --> Unities abgeben: Nur für beesdauer
|
beesdauer Mitglied Student
Beiträge: 37 Registriert: 18.08.2015
|
erstellt am: 19. Aug. 2015 08:21 <-- editieren / zitieren --> Unities abgeben:
Die Methode soll bei Eingang einer BE in den Puffer/Lager prüfen ob ein 6er Batch gebildet werden kann und ob eine nachgelagert Station frei ist. ALso ausgelöst bei Eingang einer BE in den Puffer oder wenn eine nachgelagerte Station wieder verfügbar ist. [Diese Nachricht wurde von beesdauer am 19. Aug. 2015 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: 19. Aug. 2015 21:29 <-- editieren / zitieren --> Unities abgeben: Nur für beesdauer
ich denke, Sie müssen das in zwei Schritten lösen: 1. schritt: Batch zählen 2. schritt: wenn Anzahl für Batch vorhanden und nachfolgende Station frei ist, umlagern Zählen könnten Sie mit Hilfe eines Zählers und einer Schleife z.B. for i:=1 to puffer.anzahlBEs loop if puffer.be(I).attribute=wert then zähler:=zähler+1; end; next; zum testen des batches: if zähler >= batchgröße and nachfolger.leer and nachfolger.bereit then --umlagern end; Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
beesdauer Mitglied Student
Beiträge: 37 Registriert: 18.08.2015
|
erstellt am: 21. Aug. 2015 13:05 <-- editieren / zitieren --> Unities abgeben:
Vielen Dank für die Hilfe. Es hat mich schon ein ganzes Stück weiter gebracht. Jetzt bastelle ich aber schon eine Weile daran weiter und leider ist mein Ziel noch nicht erreicht. Beim Batchen der Aufträge kommt es immer noch vor, dass innerhalb eines Batches verschiedene Attributausprägungen vorkommen. Der Grund ist wahrscheinlich, wenn das vorgelagerte Lager bereits gut gefüllt ist und mehrere Zähler => 6 erreicht haben, auch die BEs in den Puffer überführt werden können. Das heißt die Batch sind nicht Attributrein was eigentlich das Ziel ist. Ein weiteres Problem ist, dass die Umlagerung immer erst erfolgt, wenn BEs in das Lager eingehen. Das heißt für ein Batch mit 6 Aufträgen benötig ich 11 Lagereingänge damit der Puffer auch wirklich gefüllt wird. Ist das Lager dagegen voll wird die Methode nicht mehr aufgerufen und es geht nichts mehr. Hier die Batching Methode: is j:integer; k:integer; i:integer; m:integer; n:integer; zähler:integer; zähler1:integer; zähler2:integer; zähler3:integer; do for i:=1 to Lager.anzahlBes loop if lager.be(I).Pressprogramm=12 then zähler:=zähler+1; elseif lager.be(I).Pressprogramm=3 then zähler1:=zähler1+1; elseif lager.be(I).Pressprogramm=7 then zähler2:=zähler2+1; elseif lager.be(I).Pressprogramm=14 then zähler3:=zähler3+1; end; next; if zähler >= 6 and @.pressprogramm=12 and puffer.anzahlbes <6 and puffer.bereit then for j:=1 to 6 loop @.umlagern(Puffer); next; elseif zähler1 >= 6 and @.pressprogramm=3 and puffer.anzahlbes <6 and puffer.bereit then for k:=1 to 6 loop @.umlagern(Puffer); next; elseif zähler2 >= 6 and @.pressprogramm=7 and puffer.anzahlbes <6 and puffer.bereit then for m:=1 to 6 loop @.umlagern(Puffer); next; elseif zähler3 >= 6 and @.pressprogramm=14 and puffer.anzahlbes <6 and puffer.bereit then for n:=1 to 6 loop @.umlagern(Puffer); next; end; Ich habe schon einiges ausprobiert, bin aber noch nicht zur Lösung gekommen. Bin daher für jede Hilfe dankbar. 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: 21. Aug. 2015 19:16 <-- editieren / zitieren --> Unities abgeben: Nur für beesdauer
der erste Teil sieht schon gut aus. Beim Umlagern müssten Sie aber wieder im Puffer die Teile heraussuchen, die den richtigen Wert im Attribut haben z.B. analog zum Zählen Code:
for i:=1 to Lager.anzahlBes loop if lager.be(I).Pressprogramm=12 then zähler:=zähler+1; elseif lager.be(I).Pressprogramm=3 then zähler1:=zähler1+1; elseif lager.be(I).Pressprogramm=7 then zähler2:=zähler2+1; elseif lager.be(I).Pressprogramm=14 then zähler3:=zähler3+1; end; next; if zähler >= 6 and puffer.bereit and puffer.anzahlbes <6 then j:=0; i:=1; while j<6 loop if lager.be(i).pressprogramm=12 then lager.be(i).umlagern(Puffer); wait(0.001); --BEs müssen im puffer aufrücken j:=j+1; --BEs rücken auf --> neues BE(i) !! else --nächstes BE testen i:=i+1; end; end; elseif zähler1 >= 6 and puffer.anzahlbes <6 and puffer.bereit then ...
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
beesdauer Mitglied Student
Beiträge: 37 Registriert: 18.08.2015
|
erstellt am: 22. Aug. 2015 11:12 <-- editieren / zitieren --> Unities abgeben:
|
beesdauer Mitglied Student
Beiträge: 37 Registriert: 18.08.2015
|
erstellt am: 24. Aug. 2015 08:52 <-- editieren / zitieren --> Unities abgeben:
Hallo, es ist nun leider doch nochmal ein Problem aufgetreten. Wenn ein Zähler bspw. 8 BEs eines Preesprogramms feststellt, dann wird erst der Puffer einmal komplett gefüllt und im Anschluss wird versucht nochmal den Puffer zu füllen. Da aber dann nur noch 2 BEs im Lager sind kommt eine Fehlermeldung ('ein void kann keine Methode Pressprogramm empfangen'). Ich habe überlegt den Zähler in der while Scheifel runter zu zählen aber das hat nicht funktioniert. Es müsste also irgenwie erreicht werden, dass nach einer Umlagerung zum Puffer erst der Lagerbestand geprüft wird. Bin wieder für jeden Tipp offen. Vielen Dank [Diese Nachricht wurde von beesdauer am 24. Aug. 2015 editiert.] [Diese Nachricht wurde von beesdauer am 24. Aug. 2015 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: 24. Aug. 2015 09:08 <-- editieren / zitieren --> Unities abgeben: Nur für beesdauer
|
beesdauer Mitglied Student
Beiträge: 37 Registriert: 18.08.2015
|
erstellt am: 24. Aug. 2015 09:10 <-- editieren / zitieren --> Unities abgeben:
|
Bon Simul Mitglied Simulant
Beiträge: 1250 Registriert: 08.08.2011 Plant Simulation 10.1, 11 ff Professional
|
erstellt am: 24. Aug. 2015 09:15 <-- editieren / zitieren --> Unities abgeben: Nur für beesdauer
Sie könnten vor jedem einzelnen Teil warten, bis ein platz im Puffer leer ist, dann müsste die Stückzahl stimmen: Code:
if lager.be(i).pressprogramm=12 then waituntil puffer.voll=false prio 1; lager.be(i).umlagern(Puffer); wait(0.001); --BEs müssen im puffer aufrücken j:=j+1; --BEs rücken auf --> neues BE(i) !! else --nächstes BE testen i:=i+1; end;
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
beesdauer Mitglied Student
Beiträge: 37 Registriert: 18.08.2015
|
erstellt am: 24. Aug. 2015 09:33 <-- editieren / zitieren --> Unities abgeben:
Danke für die schnelle Antwort aber leider tritt der Fehler immer noch auf. Die Anzahl im Puffer stimmt auch. Der Puffer nimmt 6 BE auf und gibt sie dann an die nächste Station weiter. Danach wird versucht erneut den Puffer mit dem gleichen Pressprogramm zu füllen obwohl sich nur 2 BE davon im Lager befinden. Laut Fehlermeldung steht der entsprechende Zähler auf 6 obwohl er nur bis 2 hätte zählen dürfen. Kann man vielleicht ein zusätzliche Schleife einbauen die nur einmal durchläuft und nach der umlagerung von 6 Einheiten beendet wird? 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: 24. Aug. 2015 10:10 <-- editieren / zitieren --> Unities abgeben: Nur für beesdauer
|
beesdauer Mitglied Student
Beiträge: 37 Registriert: 18.08.2015
|
erstellt am: 24. Aug. 2015 11:14 <-- editieren / zitieren --> Unities abgeben:
Der Wert 8 ist nur ein Beispiel. Am konkreten Fehlerbeispiel waren 8 Be des gleichen Pressprogramms und beim Bilden der Batche im Lager. Das erste 6er Batch wurde komplett gebildet und vom Puffer an die Presse weitergeben. Direkt im Anschluss wurde versucht ein zweites Batch zu Bilden. Da es dann nicht vollständig wurde trat der Fehler auf. Laut Fehlermeldung hat der Zähler3 den Wert 6 obwohl im Lager bei Auftritt der Meldung kein BE mit dem Prssprogramm 14 enthält. Das komplett Modell kann ich leider erst am Nachmittag hochladen - es klappt über den Dienstrechner nicht. Daher ein Screenshot mit Fehlermeldung, Inhaltslisten von Puffer und Lager. Huer die vollständige Methode: is i:integer; j:integer; k:integer; zähler:integer; zähler1:integer; zähler2:integer; zähler3:integer; do for i:=1 to Lager.anzahlBes loop if lager.be(I).Pressprogramm=12 then zähler:=zähler+1; elseif lager.be(I).Pressprogramm=3 then zähler1:=zähler1+1; elseif lager.be(I).Pressprogramm=7 then zähler2:=zähler2 + 1; elseif lager.be(I).Pressprogramm=14 then zähler3:=zähler3+1; end; next; if zähler >= 6 and puffer.bereit and puffer.anzahlbes <6 then j:=0; i:=1; while j<6 loop if lager.be(i).pressprogramm=12 then waituntil puffer.voll=false prio 1; lager.be(i).umlagern(Puffer); wait(0.001); --BEs müssen im puffer aufrücken j:=j+1; --BEs rücken auf --> neues BE(i) !! else --nächstes BE testen i:=i+1; end; end; elseif zähler1 >= 6 and puffer.anzahlbes <6 and puffer.bereit then j:=0; i:=1;
while j<6 loop if lager.be(i).pressprogramm=3 then waituntil puffer.voll=false prio 1; lager.be(i).umlagern(Puffer); wait(0.001); --BEs müssen im puffer aufrücken j:=j+1; --BEs rücken auf --> neues BE(i) !! else --nächstes BE testen i:=i+1; end; end; elseif zähler2 >= 6 and puffer.anzahlbes <6 and puffer.bereit then j:=0; i:=1; while j<6 loop if lager.be(i).Pressprogramm=7 then waituntil puffer.voll=false prio 1; lager.be(i).umlagern(Puffer); wait(0.001); --BEs müssen im puffer aufrücken j:=j+1; --BEs rücken auf --> neues BE(i) !! else --nächstes BE testen i:=i+1; end; end; elseif zähler3 >= 6 and puffer.anzahlbes <6 and puffer.bereit then j:=0; i:=1; while j<6 loop if lager.be(i).pressprogramm=14 then waituntil puffer.voll=false prio 1; lager.be(i).umlagern(Puffer); wait(0.001); --BEs müssen im puffer aufrücken j:=j+1; --BEs rücken auf --> neues BE(i) !! else --nächstes BE testen i:=i+1; end; end; end; end; 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: 24. Aug. 2015 12:16 <-- editieren / zitieren --> Unities abgeben: Nur für beesdauer
Wenn Ihr puffer nur eine Kapa von 6 hat und Sie 6 BEs umlagern wollen, dann muss der Puffer jeweils leer sein, sonst funktioniert das Umlagern nicht: also anstatt puffer.anzahlbes <6 puffer.leer und es funktioniert nicht mit mehr als 6 (sonst müssten Sie die Kapa des puffers entsprechend anpassen) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
beesdauer Mitglied Student
Beiträge: 37 Registriert: 18.08.2015
|
erstellt am: 24. Aug. 2015 13:14 <-- editieren / zitieren --> Unities abgeben:
|