Autor
|
Thema: Umlagern (1081 mal gelesen)
|
sven732 Mitglied Student
Beiträge: 13 Registriert: 24.02.2007
|
erstellt am: 18. Aug. 2007 13:56 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich möchte über eine Methode eine bestimmte Anzahl von Bes aus dem Lager in eine Senke umlagern und zwar begonnen vom ersten belegten Lagerplatz bis zum letzten Lagerplatz. Wie kann ich dies machen?
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Kepheus Mitglied Student
Beiträge: 22 Registriert: 13.03.2007 IBM ThinkPad R51e Intel Celeron M 1,5 GHz 512 MB Ram<P>Windows XP SP2<P>Plant Simulation 7.6
|
erstellt am: 20. Aug. 2007 07:55 <-- editieren / zitieren --> Unities abgeben: Nur für sven732
|
LaBonita Mitglied Dipl.-Math.
Beiträge: 151 Registriert: 26.07.2007 eM-Plant 7.5 bis 8.1 VB Java C#
|
erstellt am: 20. Aug. 2007 11:44 <-- editieren / zitieren --> Unities abgeben: Nur für sven732
Hallo sven732, ich vemute Du möchtest auf den Inhalt eines Lageres zugreifen. Da ein Lager keine fest vorgegebene Verweil- oder Bearbeitungszeit hat, sind hier alle Teile immer nach dem FIFO prinzip zu erreichen. Du kannst dann auf unterschiedliche Arten auf die BEs zugreifen. Indem Du
Code: for i := 1 to current.Lager.numMU loop current.Lager.cont.move(ziel); next;
kannst Du immer auf das Element zugreifen, dass nach dem FIFO Prinzip als nächstes umgelagert werden soll. Etwas schwieriger wird es, wenn Du platzbezogen zugreifen willst, weil Du dann prüfen musst, ob der Platz auf belegt ist. PlantSimulation hat da eine etwas lustige Art der Zuordnung. Wir hatten das Problem demletzt auch und ein Kollege hatte es dann folgendermaßen gelöst:
Code: for i := 1 to current.Lager.xDim loop for j := 1 to current.Lager.yDim loop if current.Lager[i,j].occupied then current.Lager[i,j].move(ziel); end; next; next;
Hilfe zum direkten Zugriff findest Du in der PlantSimulation Hilfe. Nur die Lustige Belegung des Lagers ist nirgends beschrieben. Also einfach geht es mit "cont" und wenn Du bestimmte Eigenschaften brauchst, dann musst Du halt zirkulieren und prüfen, ob da überhaupt etwas liegt.Viel Erfolg!!! Gruß, LaBonita Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
sven732 Mitglied Student
Beiträge: 13 Registriert: 24.02.2007
|
erstellt am: 20. Aug. 2007 19:04 <-- editieren / zitieren --> Unities abgeben:
Hallo, es hat funktioniert. Ich kann jetzt eine bestimmte Anzahl von Bes umlagern. Allerdings funktioniert die Umlagerstrategie Fifo nur bedingt. Wenn ich 20 Lagerplätze zur Verfügung habe, diese belegt sind und ich 5 Bes umlagern lasse, dann werden die Lagerplätze 1 - 5 umgelagert. D.h. die neu ankommenden Bes werden wieder auf die Lagerplätze 1 - 5 gelegt und beim nächsten Umlagern auch umgelagert. Die restlichen 15 Bes bleiben im Lager. Man stelle sich sowas bei Obst vor. Das Lager würde nur so vor sich hinfaulen. Wie kann ich es lösen, dass ein richtiges Fifo ausgeführt wird. D.h. dass zuerst Lagerplatz 1 - 5 dann 6 - 10, 11 - 15, usw. umgelagert werden. Ist es auch möglich, dass, sofern die Lagerplätze 1 - 5 frei geworden sind, die anderen Bes im Lager einfach um diese 5 Plätze nach vorne rücken und neu ankommende bes die hinteren Lagerplätze 15 - 20 belegen? Gruss Sven732
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
LaBonita Mitglied Dipl.-Math.
Beiträge: 151 Registriert: 26.07.2007 eM-Plant 7.5 bis 8.1 VB Java C#
|
erstellt am: 20. Aug. 2007 19:39 <-- editieren / zitieren --> Unities abgeben: Nur für sven732
Hallo sven732, ich liebe es, wenn PlantSimulation nicht das macht, was man eigentlich erwarten würde. Alos FIFO ist nicht immer FIFO. Anyway - habe meine Idee mal ausprobiert und es tut. Jedes Element hat einen Eintrittszeitpunkt. Jetzt muss Du halt durch alle Elemente durchgehen und Dir immer das Element suchen, das den frühesten Eintrittszeitpunkt hat. Als Beispiel der folgende Code: Code: is local i, j, k, indI, indJ: integer; eTime, minETime: time; do minETime := 1000000000; for k := 1 to 5 loop for i := 1 to current.Store.xDim loop for j := 1 to current.Store.yDim loop if current.Store[i, j].occupied then eTime := current.Store[i, j].cont.entryTime; if minETime = 1000000000 then indI := i; indJ := j; minETime := eTime; elseif eTime < minETime then indI := i; indJ := j; minETime := eTime; end; end; next; next; current.Store[indI, indJ].move(current.Store1); minETime := 1000000000; next; end;
Hierbei werden immer die am längsten gelagerten 5 Elemente aus dem lager geholt und in ein anderes Lager verlegt. Vielleicht kannst Du es anpassen und dann verwenden. Gruß, LaBonita Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 20. Aug. 2007 20:23 <-- editieren / zitieren -->
@ LaBonita @ sven732 na na na Leute, bleibt mal bei der Realität! @ LaBonita Zitat:
for i := 1 to current.Lager.xDim loop for j := 1 to current.Lager.yDim loop if current.Lager[i,j].occupied then current.Lager[i,j].move(ziel); end; next; next;
for j := 1 to current.Lager.yDim loop for i := 1 to current.Lager.xDim loop if current.Lager[i,j].occupied then print current.Lager[i,j].inhalt; end; next; next; ist dasselbe wie: for i:=1 to lager.anzahlbes loop print i, chr(9), lager.be(i); next; ohne "belegt"-Überprüfung und ohne Überprüfung A L L E R Lagerplätze ,oder ????? @ sven732 @ LaBonita Wenn es FIFO sein soll, dann nehmt doch einfach einen Pufferbaustein. Warum hierbei umständlich mit dem Lagerbaustein hantieren ???? ------------------ Stephan Römberg
[Diese Nachricht wurde von COMAU am 20. Aug. 2007 editiert.] |
LaBonita Mitglied Dipl.-Math.
Beiträge: 151 Registriert: 26.07.2007 eM-Plant 7.5 bis 8.1 VB Java C#
|
erstellt am: 21. Aug. 2007 10:28 <-- editieren / zitieren --> Unities abgeben: Nur für sven732
Hallo Stephan, zunächst mal - da kann man vielleicht auch den Platzpuffer für verwenden, wenn man die Bearbeitungszeit auf 0 setzt und er ansonsten keine ungewollten Eigenschaften mitbringt - dafür kenne ich das Problem nicht gut genug. Zu Deiner Anmerkung mit: Zitat: ist dasselbe wie:for i:=1 to lager.anzahlbes loop print i, chr(9), lager.be(i); next;
würde ich jedoch gerne bemerken, dass der Grundgedanke war die Teile in der Ankunftsreihenfolge wieder raus zu geben und nicht irgendwie raus zu bekommen. Das funktioniert mit der Methode, die Du beschrieben hast, aber leider nicht (zumindest nicht bei meinem Testmodell - mehrdimensionales Lager). Anyway - das Schöne bei PlantSimulation ist: Es gibt (fast) immer eine Lösung und 2 Lösungen unterschiedlicher Personen sind (fast) nie gleich ;-) Gruß, LaBonita Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 21. Aug. 2007 13:18 <-- editieren / zitieren -->
@LaBonita naja, das hättest Du garnicht testen brauchen, denn aus dem Zitat geht ja wohl eindeutig hervor, worauf ich for i:=1 to lager.anzahlbes loop print i, chr(9), lager.be(i); next;
bezogen habe, oder ?
Wenn nun ein mehrdimensionales Lager genutzt werden soll, dann gehts mit 2 weiteren Zeilen so:
is i:integer; tab:table[object,real]; do tab.create; for i:=1 to lager.anzahlbes loop tab[1,tab.ydim+1]:=lager.be(i); tab[2,tab.ydim]:=lager.be(i).eintrittszeit; next; tab.sortieren(2,"auf"); for i:=1 to min(5,tab.ydim) loop tab[1,i].umsetzen(ziel); next; end; ------------------ Stephan Römberg
[Diese Nachricht wurde von COMAU am 22. Aug. 2007 editiert.] |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|