Autor
|
Thema: auf Fördergut von Fahrzeug zugreifen (2165 mal gelesen)
|
StefanieSch Mitglied
Beiträge: 41 Registriert: 13.02.2006
|
erstellt am: 26. Jun. 2007 16:01 <-- editieren / zitieren --> Unities abgeben:
Hallo an alle! Ein Fahrzeug ist mit Fördergütern beladen. Diese kommen von unterschiedlichen Quellen und haben demnach unterschiedliche Namen (je nachdem von welcher quelle sie kommen). Als Beispiel: von Quelle 1: A_1 von Quelle 2: B_1.... Nun sollen diese Fördergüter an zwei verschiedene Lager abgegeben werden. das eine Lager erhält die Fördergüter mit der bezeichnung B_n und das zweite mit den Fördergüter A_n wie kann ich bei einem Fahrzeug auf ein bestimmtes Fördergut zugreifen? ich hoffe das meine Frage soweit vertändlich ist! Grüße und schon mal vielen dank! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 26. Jun. 2007 17:43 <-- editieren / zitieren -->
Am einfachsten wohl mit einer Schleife is ende : boolean; i : integer; f : object; do ende:=false; f:=weg.be(1); --fzg i:=1; repeat if f.be(i).name="A_n" then f.be(i).umlagern(puffer); ende:=true; else i:=i+1; end; until ende; end; s. auch hier http://ww3.cad.de/foren/ubb/Forum262/HTML/000225.shtml#000000 Der Simulator |
StefanieSch Mitglied
Beiträge: 41 Registriert: 13.02.2006
|
erstellt am: 26. Jun. 2007 17:49 <-- editieren / zitieren --> Unities abgeben:
|
Ex-Mitglied
|
erstellt am: 26. Jun. 2007 17:55 <-- editieren / zitieren -->
weg = Weg-Objekt be(1) 1. Be auf dem Weg-Objekt = Fahrzeug ------------------ Der Simulator |
StefanieSch Mitglied
Beiträge: 41 Registriert: 13.02.2006
|
erstellt am: 28. Jun. 2007 11:30 <-- editieren / zitieren --> Unities abgeben:
ein neues Problem ist aufgetreten. Kurz zu meiner Aufgabe: ich möchte ein artikelbezogenes Kommissionierlager simulieren. Ich bin soweit, das zwei AUfträge (TabelleAuftrag und TabelleAuftrag1) zusammengefasst vom Fahrzeug kommissioniert werden. Nun müssen die gesammelten Güter wieder den Aufträgen zugeordnet werden. Das stelle ich mir wie folgt vor. Ein Fahrzeug mit den gesamten Fördergütern beladen erreicht einen Sensor. Dieser aktiviert die Methode: @.anhalten; i:=@.anzahlBEs; repeat if TabelleAuftrag.finden(@.be(i).name) then @.be(i).umlagern(Versandlager); k:=TabelleAuftrag.zeigerY; TabelleAuftrag.entferneZeile(k); elseif TabelleAuftrag1.finden(@.be(i).name) then @.be(i).umlagern(Versandlager1); k:=TabelleAuftrag1.zeigerY; TabelleAuftrag1.entferneZeile(k); end; i:=i-1; until i=0; @.fahren; In TabelleAuftrag und TabelleAuftrag1 sind insgesamt alle Fördergüter, die das Fahrzeug beladen hat, aufgelistet. Die Methode soll folgendes bewirken. Beispiel: 23 Fördergüter befinden sich auf dem Fahrzeug. der Name des 23. wird ausgelesen und versucht erst in der TabelleAuftrag zu finden, sonst in der TabelleAuftrag1. Wurde das BE gefunden, wird es auf den entsprechenden Lagerbaustein umgesetzt und die Zeile aus der Tabelle gelöscht, da das Teil ja schon dem AUftrag zugeordnet wurde. Mein Problem ist jetzt, das nur ein Teil der Fördergüter umgesetzt wird und nichts aus der Tabelle gelöscht wird. Ich finde meine Fehler aber nicht!! Bitte helft mir... Grüße Steffi Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
planty Mitglied Dipl.-Ing.
Beiträge: 139 Registriert: 18.09.2006
|
erstellt am: 28. Jun. 2007 13:42 <-- editieren / zitieren --> Unities abgeben: Nur für StefanieSch
Moin, warum die Zeile eines gefundenen Auftrags nicht gelöscht wird weiss ich nicht, aber: 1. vor .finden(..) ist .setzeZeiger(x,y) immer eine gute Idee 2. bei Umlagern besser prüfen, ob das auch geklappt hat. Sonst löscht Du den Verweis in der Tabelle und das BE liegt noch auf dem Fahrzeug Ausserdem würde ich eine kopfgesteuerte Schleife vorschlagen, da Du das Umlagern bei i=0 ja nicht durchführen möchtest. ungetestet: Code:
@.anhalten; for i := 1 to @.anzahlBes loop tabelleAuftrag.setzeZeiger(1,1); tabelleAuftrag1.setzeZeiger(1,1); if TabelleAuftrag.finden(@.be(i).name) then if @.be(i).umlagern(Versandlager) then k:=TabelleAuftrag.zeigerY; TabelleAuftrag.entferneZeile(k); end; elseif TabelleAuftrag1.finden(@.be(i).name) then if @.be(i).umlagern(Versandlager1) then k:=TabelleAuftrag1.zeigerY; TabelleAuftrag1.entferneZeile(k); end; end; next; @.fahren;
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
StefanieSch Mitglied
Beiträge: 41 Registriert: 13.02.2006
|
erstellt am: 28. Jun. 2007 14:39 <-- editieren / zitieren --> Unities abgeben:
|
Ex-Mitglied
|
erstellt am: 28. Jun. 2007 16:43 <-- editieren / zitieren -->
@ planty Hast Du die "kopfgesteuerte" Schleife mal ausprobiert ?
------------------ Der Simulator |
Ex-Mitglied
|
erstellt am: 28. Jun. 2007 19:04 <-- editieren / zitieren -->
@planty Zitat:
Ausserdem würde ich eine kopfgesteuerte Schleife vorschlagen, da Du das Umlagern bei i=0 ja nicht durchführen möchtest.
Dein Vorschlag mit der "kopfgesteuerten" Schleife funktioniert so nicht - auch wenn Du so das Umlagern verhinderst, wenn bei Aufruf der Methode keine Be´s auf dem Fzg sind. Aber dann muesste das Fzg garnicht erst anhalten und die Methhode aufrufen.
Hintergrund ist folgender:
durch das Umlagern "rutschen" die nachfolgenden @.be(i)´s alle einen Indexwert runter. Vergleich es mal mit dem Löschen einer Tabellenzeile. Wenn also urspruenglich 6 Be´s (= @.anzahlbes) auf dem Fahrzeug waren, liegt das "oberste" 6.Be nach dem 1. Umlagern auf Platz 5, Be 4 auf Platz 3 usw. Ergo nach der Hälfte der Schleifendurchläufe ist Dein Schleifenindex grösser als die verbliebene Anzahl Be´s und Du greifst ins "Leere". Damit es funktioniert muss also die Schleife von @.anzahlbes herunterzählen (for i:=@.anzahlbes downto 1....) ------------------ Der Simulator
|
| Technischer Produktdesigner (m/w/d) Maschinen- und Anlagenkonstruktion | Die besten Köpfe für die unterschiedlichsten Aufgaben zu finden sowie Menschen und Technologien zu verbinden, und zwar täglich aufs Neue - dafür schätzen unsere Kunden FERCHAU. Unterstütze uns: als ambitionierte:r Mitarbeitende:r für einen unserer Kunden. Du weißt genau, was du technologisch auf dem Kasten hast? Du suchst einen Arbeitgeber, der das genau erkennt, der dein Engagement wertschätzt und ... | Anzeige ansehen | Produktdesign, Industriedesign |
|
planty Mitglied Dipl.-Ing.
Beiträge: 139 Registriert: 18.09.2006
|
erstellt am: 29. Jun. 2007 15:59 <-- editieren / zitieren --> Unities abgeben: Nur für StefanieSch
ups... da hat der Simulator natürlich (mal wieder) recht :-) bei der Tabelle hätte ich es gemerkt, da hab ich extra nochmal nachgesehen, dass der richtige Index verwendet wird. Ich wollte nur weg von der repeat schleife, die ist bei definierter Anzahl von Ereignissen einfach unübersichtlich und fehlerträchtig. Mein erster Ansatz war Code:
while @.anzahlBes > 0 loop «loop_statements» end;
aber das hilft natürlich auch nicht, weil man den Index trotzdem seperat führen muss. 'for downto' passt prima. P. [Diese Nachricht wurde von planty am 29. Jun. 2007 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |