Autor
|
Thema: Lagerentnahmen nach max Durchlaufzeit (1407 mal gelesen)
|
beesdauer Mitglied Student
Beiträge: 37 Registriert: 18.08.2015
|
erstellt am: 16. Sep. 2015 13:33 <-- editieren / zitieren --> Unities abgeben:
Hallo Community, ich habe ein Lager aus dem nach bestimmten Kriterien (BE-Attribut und Anzahl eines BETypes) BEs entnommen werden. Es kommt vor, dass die entsprechenden Kristerine nicht erreicht werden und bestimmte BEs im Lager verbleiben. Ich möchte nun anhand der Zeit, in der sich bestimmtes BE im System befindet, die vorgesetzten Kriterien aushebeln. Ein Beispiel: Ist eine BE länger als 10h im System, dann umlagern. Ist eine BE weniger als 10h im System, dann erfolgt die Anwendung der normalen Methode / Kriterien. Kann ich das als If Abfrage in meine normale Methode mit einbauen oder benötige ich einen Beobachter? Bin für jeden Hinweis offen, auch wie ich die bisher im System verbrachte Zeit im erfasse. Hiermit funktioniert es leider noch nicht: for i:=1 to Lager.anzahlBes loop if ereignisverwalter.abszeit-lager.be(I).erzeugt > 4:00.000 then lager.be(i).umlagern(Puffer); end; next; VG beesdauer
[Diese Nachricht wurde von beesdauer am 16. Sep. 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: 16. Sep. 2015 17:30 <-- editieren / zitieren --> Unities abgeben: Nur für beesdauer
Die Zeit müssten Sie als Sekunden angeben. Und je nach Ziel müssen Sie vielleicht etwas warten: Code:
for i:=1 to Lager.anzahlBes loop if ereignisverwalter.zeit-lager.be(I).erzeugt > 36000 then lager.be(i).umlagern(Puffer); wait(0.001); end; next;
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
beesdauer Mitglied Student
Beiträge: 37 Registriert: 18.08.2015
|
erstellt am: 17. Sep. 2015 08:51 <-- editieren / zitieren --> Unities abgeben:
Danke. Jetzt stehe ich vor dem nächsten Problem. Ich möchte nun von dem identifizerten BE ein Attribut auslesen. Den ausgelesenen Wert möchte ich nutzen, um aus dem Lager maximal 6 BEs mit dem gleichen ausgelesenen AttributWert umzulagern. Ich muss dabei aber auch sicherstellen, dass genau das anfängliche identifizierte BE auch umgelagert wird. i:integer; j:integer; n:integer; for i:=1 to Lager.anzahlBes loop if ereignisverwalter.zeit-lager.be(I).erzeugt > 36000 then --24 h Verarbeitungsfrist 82800 suchwert:=lager.be(I).Pressprogramm; @.Gewaehlt:=suchwert; for n:=1 to Lager.anzahlBes loop while j<6 loop if lager.be(n).pressprogramm=suchwert then waituntil presse5.voll=false prio 1; lager.be(n).umlagern(Presse5); 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 n:=n+1; end; end; else i:=i+1; next; erwartungsäß kam hier direkt eine Fehlermeldung zwar beim "do" der Methode. 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: 17. Sep. 2015 09:05 <-- editieren / zitieren --> Unities abgeben: Nur für beesdauer
|
beesdauer Mitglied Student
Beiträge: 37 Registriert: 18.08.2015
|
erstellt am: 17. Sep. 2015 09:20 <-- editieren / zitieren --> Unities abgeben:
|
Bon Simul Mitglied Simulant
Beiträge: 1250 Registriert: 08.08.2011 Plant Simulation 10.1, 11 ff Professional
|
erstellt am: 17. Sep. 2015 09:21 <-- editieren / zitieren --> Unities abgeben: Nur für beesdauer
|
beesdauer Mitglied Student
Beiträge: 37 Registriert: 18.08.2015
|
erstellt am: 17. Sep. 2015 09:36 <-- editieren / zitieren --> Unities abgeben:
|
Bon Simul Mitglied Simulant
Beiträge: 1250 Registriert: 08.08.2011 Plant Simulation 10.1, 11 ff Professional
|
erstellt am: 17. Sep. 2015 09:45 <-- editieren / zitieren --> Unities abgeben: Nur für beesdauer
Sie müssten mit Einrückungen arbeiten. Ihnen fehlen zwei End; und ein next;, Klicken Sie auf das grüne Häkchen, dann sollten schon Syntaxfehler anzeigen. Code:
is i:integer; j:integer; n:integer; do for i:=1 to Lager.anzahlBes loop if ereignisverwalter.zeit-lager.be(I).erzeugt > 36000 then --24 h Verarbeitungsfrist 82800 suchwert:=lager.be(I).Pressprogramm; @.Gewaehlt:=suchwert; for n:=1 to Lager.anzahlBes loop while j<6 loop if lager.be(n).pressprogramm=suchwert then waituntil presse5.voll=false prio 1; lager.be(n).umlagern(Presse5); 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 n:=n+1; end; end; next; else i:=i+1; end; next; 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: 17. Sep. 2015 10:36 <-- editieren / zitieren --> Unities abgeben:
Danke das hat schon mal geklappt. Jetzt habe ich einen anderen Fehler. Es scheint, dass die Methode versucht die Presse zu füllen. Wenn es dann kein passendes BE mehr gibt, tritt der Fehler auf. Ich habe jetzt einen "ZeitZähler" eingebaut. Dieser Zähler soll zählen, wieviele BEs mit den passenden Attributwert sich im Lager befinden. Diesen Zählerwert wollte ich dann für die while Schleife nutzen, aber das funktioniert noch nicht?! do @.erzeugeAttr("Gewaehlt","integer"); for i:=1 to Lager.anzahlBes loop if ereignisverwalter.zeit-lager.be(I).erzeugt > 36000 then --24 h Verarbeitungsfrist 82800 suchwert:=lager.be(I).Pressprogramm; for n:=1 to Lager.anzahlBes loop if lager.be(n).pressprogramm=suchwert then Zeitzähler:=Zeitzähler+1; end; next; for l:=1 to Lager.anzahlBes loop while j<Zeitzähler loop if lager.be(l).pressprogramm=suchwert then --waituntil presse5.voll=false prio 1; @.Gewaehlt:=suchwert; lager.be(l).umlagern(Presse5); 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 l:=l+1; end; end; next; else i:=i+1; end; next; Darüberhinaus wird der Suchwert nicht dem BEs als Attributwert verliehen. Woran kann das liegen? 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: 17. Sep. 2015 14:39 <-- editieren / zitieren --> Unities abgeben: Nur für beesdauer
|
beesdauer Mitglied Student
Beiträge: 37 Registriert: 18.08.2015
|
erstellt am: 17. Sep. 2015 14:56 <-- editieren / zitieren --> Unities abgeben:
Die ganze Steuerung ist quasi eine Absicherung der normalen Methode. Die normale Methode entnimmt aus dem Lager immer 6 Einheiten die einen gemeinsamen Attributwert besitzen. Nun kann es vorkommen, dass niemals bzw. sehr lange keine 6 BE gefunden und diese im Lager verbleiben. Nun möchte ich mit der Streuerung erreichen, dass die von der normalen Methode nicht berücksichtigen BEs nach überschreiten der höchstzulässigen Zeit im System trotzdem umgelagert werden. Ich umgehe damit den 6er Zwang der normalen Methode. Dabei ist wichtig, dass wenn ein BE mit höchste Dauer überschritt auch alle anderen BEs mit dem gleichen Attribut Wert umgelagert werden. Maximal jedoch 6 BEs auf einmal. Mehr als 6 sollten normalerweise jedoch nicht Vorort 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: 17. Sep. 2015 15:22 <-- editieren / zitieren --> Unities abgeben: Nur für beesdauer
ich denke, Ihre Methode ist schon zu kompliziert und Sie sollten alles in eine Auslagermethode packen. Zur besseren Strukturierung könnten Sie schrittweise vorgeben: 1. Suche es Attributwertes (für zeit oder Normalmodus) 2. Umlagerung (max. 6 mit gleichem Attributwert; einfache Schleife) Verwenden Sie so wenig verschachtelte Schleifen Wie möglich, das bremst die Simulation aus, wenn Sie etwas mehr im Lager haben. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
beesdauer Mitglied Student
Beiträge: 37 Registriert: 18.08.2015
|
erstellt am: 16. Okt. 2015 09:38 <-- editieren / zitieren --> Unities abgeben:
Guten Morgen, ich muss das Thema nochmal aufgreifen. ICh habe versucht das Problem auf anderen Wegen zu umgehen. Leider jedoch ohne Erfolg. Eine Auftreilung stelle ich mir schwierig vor. Da die Simulation immer recht kurz läuft, könnte ich mit performance Einbußen leben. Hier die komplette Methode: is i:integer; j:integer; k:integer; m:integer; n:integer; l:integer; zähler:integer; zähler1:integer; zähler2:integer; zähler3:integer; zähler4:integer; zähler5:integer; suchwert:integer; Zeitzähler:integer; do @.erzeugeAttr("Gewaehlt","integer"); for i:=1 to Lager.anzahlBes loop if ereignisverwalter.zeit-lager.be(I).erzeugt > 36000 then --24 h Verarbeitungsfrist 82800 suchwert:=lager.be(I).Pressprogramm; for n:=1 to Lager.anzahlBes loop if lager.be(n).pressprogramm=suchwert then Zeitzähler:=Zeitzähler+1; end; next; for l:=1 to Lager.anzahlBes loop while j<Zeitzähler loop if lager.be(l).pressprogramm=suchwert then --waituntil presse5.voll=false prio 1; @.Gewaehlt:=suchwert; lager.be(l).umlagern(Presse5); 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 l:=l+1; end; end; next; else i:=i+1; end; next; for i:=1 to Lager.anzahlBes loop if lager.be(I).Pressprogramm=12 then zähler:=zähler+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; elseif lager.be(I).Pressprogramm=5 then zähler4:=zähler4+1; elseif lager.be(I).Pressprogramm=6 then zähler5:=zähler5+1; elseif lager.be(I).Pressprogramm=3 then zähler1:=zähler1+1; end; next; for m:=1 to Lager.anzahlBes loop if lager.be(m).AlternPressprogramm=5 then zähler4:=zähler4+1; elseif lager.be(m).AlternPressprogramm=6 then zähler5:=zähler5+1; end; next; if zähler >= 6 and puffer.bereit and puffer.leer 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).Gewaehlt:=12; 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.leer and puffer.bereit then j:=0; i:=1; @.Gewaehlt:=3; while j<6 loop if lager.be(i).pressprogramm=3 then waituntil puffer.voll=false prio 1; lager.be(i).Gewaehlt:=3; 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.leer 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).Gewaehlt:=7; 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.leer and puffer.bereit then j:=0; i:=1; while j<6 loop if lager.be(i).pressprogramm=14 then lager.be(i).Gewaehlt:=14; 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ähler4 >= 6 and puffer.bereit and puffer.leer then j:=0; i:=1; while j<6 loop if lager.be(i).pressprogramm=5 then waituntil puffer.voll=false prio 1; lager.be(i).Gewaehlt:=5; lager.be(i).umlagern(Puffer); wait(0.001); --BEs müssen im puffer aufrücken j:=j+1; elseif lager.be(i).AlternPressprogramm=5 then waituntil puffer.voll=false prio 1; lager.be(i).Gewaehlt:=5; 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ähler5 >= 6 and puffer.bereit and puffer.leer then j:=0; i:=1; while j<6 loop if lager.be(i).pressprogramm=6 then waituntil puffer.voll=false prio 1; lager.be(i).Gewaehlt:=6; lager.be(i).umlagern(Puffer); wait(0.001); --BEs müssen im puffer aufrücken j:=j+1; elseif lager.be(i).AlternPressprogramm=6 then waituntil puffer.voll=false prio 1; lager.be(i).Gewaehlt:=6; 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;
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
beesdauer Mitglied Student
Beiträge: 37 Registriert: 18.08.2015
|
erstellt am: 16. Okt. 2015 12:56 <-- editieren / zitieren --> Unities abgeben:
Ich habe mich jetzt nochmal auf den Weg gemacht alles neu zu machen: is i:integer; j:integer; k:integer; m:integer; n:integer; l:integer; suchwert:integer; do -- m:=0 --while m<5 loop if not Lager.leer=true then for i:=1 to Lager.anzahlBes loop if ereignisverwalter.zeit - lager.be(I).erzeugt > 3600 then suchwert:=lager.be(I).Pressprogramm; lager.be(I).Gewaehlt:=suchwert; lager.be(I).umlagern(Puffer); for j:=1 to Lager.anzahlBes loop if lager.be(j).Pressprogramm=suchwert or lager.be(j).AlternPressprogramm=suchwert then lager.be(j).Gewaehlt:=suchwert; lager.be(j).umlagern(Puffer); wait(0.001); --m:=m+1; end; next; if puffer.voll=false then for k:=1 to 5 loop .BEs.Dummy.erzeugen(Puffer); wait(0.001); for l:=1 to Puffer.anzahlBes loop if puffer.be(l).name="Dummy" then puffer.be(l).Gewaehlt:=suchwert; end; next; --m:=m+1; wait(0.001); next; else Ausgang; end; end; -- end; next; --Methode1; end; end; --end; Das Modell lagert die ersten BEs um aber dann kommt dieser Fehler. Hat jemand eine Idee?
[Diese Nachricht wurde von beesdauer am 19. Okt. 2015 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |