Autor
|
Thema: Kommissionierung Hochregallager (7607 mal gelesen)
|
CSRO Mitglied
Beiträge: 25 Registriert: 07.09.2011
|
erstellt am: 18. Okt. 2011 12:56 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich habe ein Problem und hoffe dass mir jemand hier weiter helfen kann. Im Rahmen meiner Diplomarbeit muss ich mit der Studentenversion Tecnomatrix Plant Simulation 9 ein Hochregallager simulieren und finde einfach keinen Ansatz. Wichtig ist hierbei nur die Auslagerung, die Einlagerung kann zunächst unberücksichtigt bleiben. Die auszulagernden Teile sind also immer vorhanden. Das Lager besteht aus ABC-Gassen und die Auslagerung soll nach der Streifenstrategie erfolgen, wobei eine Auslagerung mit verschiedenen Streifenzahlen verglichen werden soll. Zu Beginn genügt es lediglich eine Gasse zu betrachten. Leider fehlt mir der Ansatz. Muss ich zunächst eine Inventarliste der Gasse erstellen und jedem Regalfach einen Artikel zuordnen? Wie generiere ich meine Auslagerungsaufträge? Je Auftrage sollen 3-5 Regalfächer angefahren werden mit jeweils 1-3 Entnahmen pro Fach. Wie starte ich meine Auslagerungsaufträge? Bisher besteht mein Modell lediglich aus einer ABC-Gasse, einer Senke und dem WarehouseManager ABC. Ich hoffe ihr könnt mir weiter helfen. Viele Grüße 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: 28. Okt. 2011 21:30 <-- editieren / zitieren --> Unities abgeben: Nur für CSRO
Was soll Ziel der Simulation sein? Das Shop-Modul ist nicht der richtige Ansatz. Das Shop-Modul dient der Darstellung von Werkstattfertigungen. Wenn das Ziel der Simulation die Ermittlung/Optimierung der Auslagerungszeiten (Auslastung der Regalbediengeräte) ist, dann müssen Sie die Regalbediengeräte simulieren. Dazu benötigen Sie je einen Wegbaustein und zwei Fahrzeuge. Ein Fahrzeug fährt auf dem Weg und bewegt sich entlang (innerhalb) der Lagergasse und das zweite Fahrzeug bewegt sich auf dem ersten Fahrzeug (längenorientierte Ladefläche)"vertikal". Weg und längenorientiertes Fahrzeug werden jeweils mit Sensoren analog der Lagerfächer ausgestattet (und können so zu bestimmten x,y Koordinaten "fahren"). Das HRL kann mit einzelnen Lagerbausteinen simuliert werden. Zur reinen Simulation der Regalbediengeräte können Sie die Lagerbereiche auch mit Hilfe von Tabellen simulieren (wenn Sie keine Materialbewegung im Lager brauchen). Jede Tabelle repräsentiert dann einen Lagerbereich (Gasse, x,y - Koordinate der Lagerfächer und Belegung). Sie brauchen auf alle Fälle eine Lagerbelegung (ABC-Verteilung ??)und ein Auslagerprogramm. Das Auslagerungsprogramm sollte für alle Simulationsläufe gleich sein, damit Sie Ihre unterschiedlichen Streifenstrategien vergleichen können. Wenn ein Auslagerauftrag anliegt, ermitteln Sie die Koordinaten, ordnen diese nach Ihrer Auslagerungsstrategie und fahren mit dem Regalbediengerät die einzelnen Koordinaten ab. Die notwendige Zeit lässt sich stoppen. Alles in allem nicht allzu schwierig mit Plant Simulation zu realisieren, allerdings definitiv kein Anfängerthema (vor allem wenn Sie die Auslagerungsstrategien programmieren müssen).
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CSRO Mitglied
Beiträge: 25 Registriert: 07.09.2011
|
erstellt am: 31. Okt. 2011 10:59 <-- editieren / zitieren --> Unities abgeben:
Vielen Dank für die Hilfe, so werde ich das Ganze mal versuchen. Ziel der Simulation soll sein zu ermitteln welche Einflussgrößen es auf die Effizienz von Wegstrategien gibt. Dafür wird bespielsweise die Gassenlänge, die ABC Verteilung oder die Anzahl der Fachanfahrten verändert und dann mit verschiedenen Streifenzahlen abgefahren. Bewegungen innerhalb des Lagers sind uninteressant. Die o.g. Versuche sollen zunächst nur innerhalb einer Gasse stattfinden. Später soll auch ein HRL mit mehreren Gassen betrachtet werden, wobei da dann andere Einlussgrößen untersucht werden sollen.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CSRO Mitglied
Beiträge: 25 Registriert: 07.09.2011
|
erstellt am: 06. Nov. 2011 11:33 <-- editieren / zitieren --> Unities abgeben:
Hallo noch mal, ich habe nun ein Modell erstellt zur Simulation des RBG, habe jedoch Schwierigkeiten den Quelltext richtig aufzurufen. Die Fahrsteuerungen für das untere Fahrzeug(horizontale Bewegungen) und für das obere Fahrzeug(vertikale Bewegungen)sind analog. Die Sensoren auf der Gasse und dem unteren Fahrzeug stellen die x bzw.y-Koordinaten der Fachmitten dar. Das Problem wird im Folgenden lediglich für die horizontalen Bewegungen beschrieben, da die Problematik für die vertikalen Bewegungen analog sind. Zunächst hatte ich die Methode Fahrsteuerung_waagerecht bei jedem Sensor der Gasse hinterlegt. Das hatte zur Folge dass diese Methode bei erreichen eines Sensors jedes Mal neu gestartet wurde und somit kein Auslagerungsauftrag abgeschlossen wurde. Es gab jedoch keine Fehlermeldungen und das Fahrzeug fuhr sowohl vorwärts als auch rückwärts. Wenn ich die Methode über einen Generator aufrufen lasse bekomme ich diverse Fehlermeldungen u.a. "unbekannter Name 'rueckwaerts'" wenn man direkt über waagerecht.rueckwaerts:=false auf das Fahrzeug zugreift, oder " Ein 'VOID' kann keine Methode 'Rueckwaerts' empfangen" bei @.rueckwaerts:=false und das obwohl der Quelltext an sich nicht geändert wurde. Der Quelltext lautet wie folgt: (SensorID : integer) is x:integer; --x-Koordinate Lagerfach pf: length; --aktuelle Position des Fahrzeugs ps:length; --Position Sensor do x:=auslagerungsauftraege[2, auslagerungsauftraege.position]; --x-Koord. Auslagerungsauftrag auslesen aus Liste --aktuelle Positon mit der anzufahrenden Position vergleichen und entscheiden ob vorwärts oder rückwärts gefahren werden muss Gasse.inhaltsliste(RBG_Position_waagerecht); --Position des Fahrzeugs in Tabelle schreiben pf:=RBG_Position_waagerecht[2,1]; --Position des Fahrzeugs auslesen ps:=Sensorliste_waagerecht[2,x]; --Position des Sensors auslesen if pf<ps then --Position Fahrzeug und Sensor vergleichen @.rueckwaerts:=false; else @.rueckwaerts:=true; end; --Anhalten wenn Zielsensor erreicht if SensorID=x then @.pausieren(5); --5Sekunden warten -->"Pickzeit" end; if auslagerungsauftraege.position=auslagerungsauftraege.yDim then auslagerungsauftraege.position:=1; else auslagerungsauftraege.position:=auslagerungsauftraege.position+1; --eine Zeile weiter gehen in Auslagerungsliste end; end; Bisher ist eine Auslagerung noch nicht berücksichtigt.
Warum bekomme ich Fehlermeldungen beim Aufrufen der Methode Fahrsteuerung über einen Generator? Über Hinweise wäre ich sehr dankbar. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CSRO Mitglied
Beiträge: 25 Registriert: 07.09.2011
|
erstellt am: 07. Nov. 2011 16:00 <-- editieren / zitieren --> Unities abgeben:
Das Problem mit der Aktivierung der Methode habe ich nun in den Griff bekommen. Es bleibt jedoch das Problem dass ich immer die Fehlermeldung "Unbekannter Name rueckwaerts" bekomme wenn ich mit waagerecht.rueckwaerts:=false bzw. waagerecht.rueckwaerts:=true die Fahrrichtung des Fahrzeugs "waagerecht" bestimmen möchte. Benutzerdefinierte Attribute sind keine definiert. 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: 07. Nov. 2011 19:09 <-- editieren / zitieren --> Unities abgeben: Nur für CSRO
Ab Version 10 werden einige Befehle wieder mit Umlaut geschrieben: @.rückwärts:=true/false Am einfachsten wäre es, das RBG "dumm" zu lassen. Das RBG wird adressiert (x,y) und beide Fahrzeuge werden in der richtigen Richtung gestartet. Wenn beide Fahrzeuge angehalten haben (waituntil waagerecht.angehalten and senkrecht angehalten prio 1 , vergeht die Ladezeit und das Fahrzeug wird über eine externe Steuerung neu adressiert, die Richtung festgelegt und wieder gestartet. Auf diese Weise hätten Sie eine zentrale Methode zur Erzeugung Ihrer Auslagerungsstrategie. Sie müssten dafür nur bei der Erzeugung der Fahrzeuge Verweise auf die Fahrzeuge in globlae Variablen schreiben (Baustein Variable --> Hilfe). waagerecht:=.bes.fahrzeug.erzeugen(xxx) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CSRO Mitglied
Beiträge: 25 Registriert: 07.09.2011
|
erstellt am: 09. Nov. 2011 10:17 <-- editieren / zitieren --> Unities abgeben:
Da ich mit Version 9 arbeite trifft das Schreiben mit Umlauten leider nicht zu. Je weiter ich hier dran arbeite desto wildere Fehlermeldungen bekomme ich. Ich habe die Anweisungen mittlerweile schon auf mehrere Methoden verteilt und die lokalen Variablen in globale umgeändert.Leider bekomm ich das Modell (mit angepasster Endung) auch nicht hochgeladen so dass man sich das mal ansehen könnte. Gibts da noch einen weiteren Trick den man beachten muss? 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: 09. Nov. 2011 21:57 <-- editieren / zitieren --> Unities abgeben: Nur für CSRO
Wenn Sie die Methode über einen Generator aufrufen, dann ist das @ nicht gesetzt (void). @ können Sie nur verwenden, wenn Sie die Methode über einen Sensor aufrufen lassen (@ ist dann das aufrufende BE). Wenn Sie in einer Methode, die Sie über einen Generator aufrufen wollen, auf die BEs zugreifen wollen, dann müssen Sie Verweise auf die Fahrzeuge in globalen Variablen speichern (Rückgabewert bei der Erzeugung). In der Sensorsteuerung ist es normal, dass die bei jedem Sensor aufgerufen wird. Sie müssen dem Fahrzeug ein Ziel mitgeben (z.b: benutzerdef. Attribut zielSensor:integer) und dann als erstes abfragen, ob Sie am Zielsensor angekommen sind:
Code:
(SensorID:integer) is do if sensorID=@.zielSensor then @.angehalten:=true; -- usw. end;
end;
Das bei beiden Fahrzeugen. Wenn beide Fahrzeuge stehen --> laden --> neu adressieren --> richtung festlegen --> starten Das können Sie mit einer übergeordneten Steuerung machen. [Diese Nachricht wurde von Bon Simul am 09. Nov. 2011 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CSRO Mitglied
Beiträge: 25 Registriert: 07.09.2011
|
erstellt am: 10. Nov. 2011 21:03 <-- editieren / zitieren --> Unities abgeben:
|
CSRO Mitglied
Beiträge: 25 Registriert: 07.09.2011
|
erstellt am: 16. Nov. 2011 14:50 <-- editieren / zitieren --> Unities abgeben:
Hallo noch mal, ich hänge leider schon wieder fest. Die horizontalen Bewegungen klappen sehr gut. Die Schwierigkeit ist beide Fahrzeuge gleichzeitig fahren zu lassen. Das Bild zeigt einen Screenshot des Modells. Im Wesentlichen sind die 3 Methoden HoleAuftrag, Fahren und Erreicht von Bedeutung. HoleAuftrag_x: is do if auslagerungsauftraege[1, auslagerungsauftraege.position]=Auftragsnummer then --solange die gleiche Auftragsnummer x:=auslagerungsauftraege[2,auslagerungsauftraege.position]; --x-Kooridinate Auslagerungsauftrag auslesen Fahren_X; --Methode 'Fahren_X' starten else --wenn neue Auftragsnummer x:=0; --setze die globalen Variablen gleich null um keine Sensorsteuerung auszulösen xPositionSensor:=0; xPositionFahrzeug:=0; @.rueckwaerts:=true; --fahre Rückwärts bis zu Basisstation um "abzuladen und neue Auftragsliste zu holen" zu simulieren end; end; Wenn der Auftrag aus der Auslagerungstabelle ausgelesen ist erfolgt die Bestimmung der Fahrtrichtung mit der Methode Fahren_X:
is do Weg.inhaltsliste(RBG_Position_x); --schreibt die Position des Fahrzeugs "waagerecht" auf dem Weg -- in Metern in die Tabelle RBG_Position_x xPositionFahrzeug:=RBG_Position_x[3,1]; --Auslesen der Fahrzeugposition auf dem Weg aus der Tabelle und -- setzt den Wert gleich der globalen Variable "xPositionFahrzeug" xPositionSensor:=Sensorliste[2,x]; -- Liest die Position des "Sensors X" in Metern auf dem Weg aus und setzt den --Wert gleich der globalen Variable "xPositionSensor" -- Vergleichen von Position des Fahrzeugs und des Sensors in Metern auf dem Weg und entscheiden ob Fahrzeug vorwärts oder --rückwärts fährt if xPositionFahrzeug < xPositionSensor then @.rueckwaerts:=false; else @.rueckwaerts:=true; end; end;
Das Fahrzeug fährt so lange bis es den Zielsensor mit der SensorID=X gefunden hat. Die Steuerung xErreicht ist folgende:
(SensorID : integer) is do --Wenn die x-Koordinate des Regalfachs erreicht ist wird der Pick simuliert und in der Auslagerungsliste wird eine Zeile tiefer --gegangen if SensorID=x then @.pausieren(5); --Simulation des Picks (5Sek.) Picks:=Picks+1; --Zählt die Picks auslagerungsauftraege.position:=auslagerungsauftraege.position+1; HoleAuftragX; --neuen Auslagerungsauftrag aus der Liste auslesen durch Aufrufen der Methode HoleAuftragX else @.angehalten:=false; end; end; Wenn alle Positionen einer Auftragsnr abgearbeitet sind fährt das Fahrzeug zur Basisstation um "abzuladen und den neuen Auftrag entgegen zu nehmen". Danach fährt es wieder in den Lagerbereich im den neuen Auftrag abzuarbeiten.
Bis hier her klappt das auch sehr gut. Das Problem ist die Berücksichtigung der vertikalen Komponente. Die Steuerung dafür ist analog zu der Steuerung der horizontalen Komponente. Die horizontalen und vertikalen Bewegungen sollen eigentlich zeitgleich ausgeführt werden, ich weiß jedoch nicht wie ich sie passend aufrufen kann. Auch das Aufrufen nacheinander funktioniert irgendwie nicht. Ich habe versucht zuerst das horizontale Fahrzeug zur x-Koordinate fahren zu lassen und es dort stehen zu lassen bis das vertikale Fahrzeug bei der y-Koordinate angekommen ist. Konktret habe ich versucht das durch den Aufruf der Methode "HoleAuftragY" bei erreichen des Sensors X zu realisieren, das vertikale Fahrzeug hat sich jedoch nicht bewegt. Für Hinweise zur Lösung des Problems wäre ich sehr dankbar.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CSRO Mitglied
Beiträge: 25 Registriert: 07.09.2011
|
erstellt am: 16. Nov. 2011 14:51 <-- editieren / zitieren --> Unities abgeben:
|
Bon Simul Mitglied Simulant
Beiträge: 1250 Registriert: 08.08.2011 Plant Simulation 10.1, 11 ff Professional
|
erstellt am: 16. Nov. 2011 22:12 <-- editieren / zitieren --> Unities abgeben: Nur für CSRO
|
CSRO Mitglied
Beiträge: 25 Registriert: 07.09.2011
|
erstellt am: 17. Nov. 2011 18:11 <-- editieren / zitieren --> Unities abgeben:
|
CSRO Mitglied
Beiträge: 25 Registriert: 07.09.2011
|
erstellt am: 21. Nov. 2011 15:31 <-- editieren / zitieren --> Unities abgeben:
Leider tauchen schon wieder Probleme auf. In Anlehnung an das Beispiel gibt es nun nur noch eine Sensorsteuerung bei der abgefragt wird welches Fahrzeug sie ausgelöst hat. If @.name="horizontal" then usw. elseif @.name="vertikal" then usw. end; Diese Steuerung wurde auch als Sensorsteuerung bei den Sensoren des Wegs und der Sensoren des unteren Fahrzeugs "Horizontal" hinterlegt. Nun taucht jedoch die Fehlermeldung auf "Die Sensorsteuerung des Objekts ist nicht vorhanden" (Fehlermeldung vgl. Abbildung). Dabei ist die Steuerung vorhanden. Dass die Fehlermeldung durch einen geänderten Namen der Methode ausgelöst wird ist ausgeschlossen. Alle Einstellungen der Sensoren wurden bei den Objekten in der Klassenbibliothek vorgenommen. Was hat die Fehlermeldung zu bedeuten? 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. Nov. 2011 16:39 <-- editieren / zitieren --> Unities abgeben: Nur für CSRO
Beim Anhängen der Steuerung an die Sensoren scheint ein Fehler passiert zu sein. Die Tilde (~) vor dem Punkt der Methodenadresse ist falsch. Am Besten immer ein Häckchen bei absolut beim Zuordnen machen. Die absolute Adresse muss immer mit einem Punkt beginnen. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CSRO Mitglied
Beiträge: 25 Registriert: 07.09.2011
|
erstellt am: 21. Nov. 2011 17:57 <-- editieren / zitieren --> Unities abgeben:
|
CSRO Mitglied
Beiträge: 25 Registriert: 07.09.2011
|
erstellt am: 23. Nov. 2011 18:28 <-- editieren / zitieren --> Unities abgeben:
Es gibt leider schon wieder ein Problem. Nachdem die Sensorsteuerung die beiden Fahrzeuge an der x und y Kooridnate des ersten Regalfachs zum stehen gebracht hat warten beide Fahrzeuge 5 Sekunden (Simulation eines Picks). Danach fährt das obere Fahrzeug aber nicht wieder los, wodurch die ganze Simulation abgebrochen wird. Der Text der Sensorsteuerung ist folgender: (SensorID:integer) is do --Steuerung für Horizontal if @.name="horizontal" then if SensorID=x then @.pausieren; xFertig:=true; else @.angehalten:=false; end; --Steuerung für Vertikal elseif @.name="vertikal" then if SensorID=y then @.pausieren; yFertig:=true; else @.angehalten:=false; end; end; --Wenn beide Fahrzeuge an der richtigen Koordinaten stehen warten und zum nächsten Regalfach fahren if (xFertig=true and yFertig=true) then wait 5; --dann 5 Sekunden warten Picks:=Picks+1; --Zählen der Picks .BEs.vertikal:1.entpausieren; .BEs.horizontal:1.entpausieren; xFertig:=false; --zurücksetzen der Variablen yFertig:=false; auslagerungsauftraege.position:=auslagerungsauftraege.position+1; --Weiter in Auslagerungsliste --nun wird erneut ein Auslagerungsauftrag aus der Liste ausgelesen und die Fahrrichtung bestimmt if auslagerungsauftraege[1, auslagerungsauftraege.position]=Auftragsnummer then --solange die gleiche Auftragsnummer x:=auslagerungsauftraege[2,auslagerungsauftraege.position]; --x-Kooridinate Auslagerungsauftrag auslesen y:=auslagerungsauftraege[3,auslagerungsauftraege.position]; --y-Kooridinate Auslagerungsauftrag auslesen Weg.inhaltsliste(RBG_Position_x); --Position "Horizontal" auf Weg in Liste schreiben .BEs.horizontal:1.inhaltsliste(RBG_Position_y); --Position "Vertikal" auf "Horizontal" in Liste schreiben xPositionFahrzeug:=RBG_Position_X[3,1]; -- Fahrzeusposition aus Liste lesen und in globale Variable setzen yPositionFahrzeug:=RBG_Position_Y[3,1]; -- Fahrzeusposition aus Liste lesen und in globale Variable setzen xPositionSensor:=Sensorliste_X[2,x]; --Sensorposition aus Liste lesen und in globale Variable setzen yPositionSensor:=Sensorliste_Y[2,y]; --Sensorposition aus Liste lesen und in globale Variable setzen --vergleicht Fahrzeugposition und Sensorposition und entscheidet über Fahrtrichtung if xPositionFahrzeug < xPositionSensor then .BEs.horizontal.rueckwaerts:=false; else .BEs.horizontal.rueckwaerts:=true; end; if yPositionFahrzeug < yPositionSensor then .BEs.vertikal.rueckwaerts:=false; else .BEs.vertikal.rueckwaerts:=true; end; else --wenn neue Auftragsnummer x:=0; --setze die globalen Variablen gleich null um keine Sensorsteuerung auszulösen xPositionSensor:=0; xPositionFahrzeug:=0; @.rueckwaerts:=true; --fahre Rückwärts bis zu Basisstation um "abzuladen und neue Auftragsliste zu holen" zu simulieren end; end; end; Warum fährt das obere Fahrzeug "vertikal" nach dem ersten Stop nicht wieder los? Muss das Fahrzeug auf einem Fahrzeug anders angesprochen werden als das Fahrzeug auf einem Weg? Es liegt auch nicht daran dass das nächste Fach die selbe y-Koordinate hätte und man den Fall Fahrzeugposition=Sensorposition zu berücksichtigen hätte.
Gruß 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. Nov. 2011 12:53 <-- editieren / zitieren --> Unities abgeben: Nur für CSRO
Ich würde nicht mit pausieren arbeiten. Einfach mit angehalten:=true anhalten und nach wait(5) wieder mit angehalten:=false wieder starten. Und das Verwenden der BE-Kalssen ist auch keine gute Idee (.BEs.vertikal.rückwärts:=true) Sprechen Sie die Fahrzeuge lieber mit weg.inhalt und weg.inhalt.inhalt an. Sonst haben Sie Probleme, wenn Sie die nächste Gasse anlegen (die sich dann unabhängig bewegen muss). Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CSRO Mitglied
Beiträge: 25 Registriert: 07.09.2011
|
erstellt am: 24. Nov. 2011 22:20 <-- editieren / zitieren --> Unities abgeben:
|
CSRO Mitglied
Beiträge: 25 Registriert: 07.09.2011
|
erstellt am: 02. Dez. 2011 22:52 <-- editieren / zitieren --> Unities abgeben:
Das Modell läuft, dank der Hilfe! Vielen Dank noch mal an dieser Stelle. Nun möchte ich zur Auswertung zum einen die Spielzeit, also die benötigte Zeit zur Abarbeitung eines Kommissionierauftrags, und die gefahrene Strecke ermitteln. Für die Spielzeit habe ich einen Sensor bei der Basisstation gesetzt. Zu Beginn eines neuen Auftrags soll dieser ausgelöst werden und die Zeit des Ereignisverwalters in eine Tabelle schreiben. Auf dem Weg zurück zur Basis soll er wieder ausgelöst werden und die Zeit des Ereignisverwalters soll wieder in eine weitere Spalte der Tabelle. In der dritten Spalte soll durch Subtraktion beider Werte die Spielzeit ermittelt werden. Der Quelltext ist folgender: is do if @.rueckwaerts=false then --Wenn ein neuer Auftrag beginnt .Modelle.Netzwerk.Spielzeiten[1,Spielzeiten.Position]:=Auftragsnummer; --schreibe Auftragsnr. in Tabelle Spielzeiten .Modelle.Netzwerk.Spielzeiten[2,Spielzeiten.Position]:=.Modelle.Netzwerk.Ereignisverwalter.Zeit; --schreibe Anfangszeit in Tabelle Spielzeiten elseif @.rueckwaerts=true then --wenn der Auftrag zu ende ist .Modelle.Netzwerk.Spielzeiten[3,Spielzeiten.Position]:=.Modelle.Netzwerk.Ereignisverwalter.Zeit; --schreibe Endzeit in Tabelle Spielzeiten[4,Spielzeiten.Position]:=Spielzeiten[3,Spielzeiten.Position]-Spielzeiten[2.Spielzeiten.Position]; --schreibt Spielzeit in Tabelle Spielzeiten.Position:=Spielzeiten.Position+1; end; end; Als Fehlermeldung erscheint
Fehler in Methode '.Modelle.Netzwerk.Spielzeiten_aufschreiben' in Zeile '12': Falscher Datentyp für '.Modelle.Netzwerk.Spielzeiten': 'time' übergeben, string erwartet Die Tabelle ist in den Spalten in die die Zeiten geschrieben werden sollen als Time formatiert. Wo ist der Fehler? Ist da etwas falsch angesprochen? 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: 03. Dez. 2011 13:17 <-- editieren / zitieren --> Unities abgeben: Nur für CSRO
Nach Ihrer Methode haben Sie 4 Spalten. Wenn Sie die Auftragsnummer in den Zeilenindex (in der Tabelle Format - Zeilenindex aktiv) schreiben wollen, dann muss Ihr Index mit 0 beginnen. Sonst muss die 4. Spalte den Datentyp time haben. Die Variante mit 3 Spalten könnte so aussehen.
Code:
is do if @.rueckwaerts=false then --Wenn ein neuer Auftrag beginnt .Modelle.Netzwerk.Spielzeiten[1,Spielzeiten.Position]:=Auftragsnummer; --schreibe Auftragsnr. in Tabelle Spielzeiten .Modelle.Netzwerk.Spielzeiten[2,Spielzeiten.Position]:=.Modelle.Netzwerk.Ereignisverwalter.Zeit; --schreibe Anfangszeit in Tabelle Spielzeiten elseif @.rueckwaerts=true then --wenn der Auftrag zu ende ist --schreibe Endzeit in Tabelle Spielzeiten[3,Spielzeiten.Position]:=.Modelle.Netzwerk.Ereignisverwalter.Zeit-Spielzeiten[2,Spielzeiten.Position]; --schreibt Spielzeit in Tabelle Spielzeiten.Position:=Spielzeiten.Position+1; end; end;
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CSRO Mitglied
Beiträge: 25 Registriert: 07.09.2011
|
erstellt am: 04. Dez. 2011 10:36 <-- editieren / zitieren --> Unities abgeben:
Es funktioniert leider immer noch nicht. Ich habe eine Liste mit 4 Spalten. Der Datentyp der ersten Spalte (Auftragsnummer) ist "integer", der Datentyp der anderen drei Spalten ist "time". Ich bekomme zwei Fehlermeldungen: is do if @.rueckwaerts=false then --Wenn ein neuer Auftrag beginnt
.Modelle.Netzwerk.Spielzeiten[1,Spielzeiten.Position]:=Auftragsnummer; --schreibe Auftragsnr. in Tabelle Spielzeiten 1. Fehlermeldung: Fehler in Methode '.Modelle.Netzwerk.Spielzeiten_aufschreiben' in Zeile '7': Falscher Datentyp für '.Modelle.Netzwerk.Spielzeiten': 'integer' übergeben, string erwartet
.Modelle.Netzwerk.Spielzeiten[2,Spielzeiten.Position]:=.Modelle.Netzwerk.Ereignisverwalter.Zeit; --schreibe Anfangszeit in Tabelle Spielzeiten
elseif @.rueckwaerts=true then --wenn der Auftrag zu ende ist --schreibe Endzeit in Tabelle .Modelle.Netzwerk.Spielzeiten[3,Spielzeiten.Position]:=.Modelle.Netzwerk.Ereignisverwalter.Zeit; 2. Fehlermeldung: Fehler in Methode '.Modelle.Netzwerk.Spielzeiten_aufschreiben' in Zeile '12': Falscher Datentyp für '.Modelle.Netzwerk.Spielzeiten': 'time' übergeben, string erwartet. --Berechnung der Spielzeit Spielzeiten[4,Spielzeiten.Position]:=.Modelle.Netzwerk.Ereignisverwalter.Zeit-Spielzeiten[2,Spielzeiten.Position]; --schreibt Spielzeit in Tabelle Spielzeiten.Position:=Spielzeiten.Position+1;
end; end; Warum wird der Datentyp "string" erwartet? Wenn ich die Formate der Spalten auf "String" ändere (was zwar keinen Sinn macht), bleibt die Fehlermeldung.
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: 04. Dez. 2011 17:38 <-- editieren / zitieren --> Unities abgeben: Nur für CSRO
Die Fehlermeldung kommt eindeutig von der Tabelle. Wo ändern Sie die Formate der Tabelle? Sie müssen die Formate in der Tabelle im Netzwerk ändern und dafür zunächst die Vererbung ausschalten. Das klingt für mich nach einem Vererbungsproblem (Sie ändern die Klasse, die Vererbung für das Objekt ist ausgeschalten, deshalb hat es keine Auswirkung auf das Objekt). Sonst einfach die Tabelle löschen, eine neue Tabelle einfügen und dort die Formate einstellen (vielleicht hilft es). Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CSRO Mitglied
Beiträge: 25 Registriert: 07.09.2011
|
erstellt am: 05. Dez. 2011 08:37 <-- editieren / zitieren --> Unities abgeben:
Leider klappt es immer noch nicht. Ich habe die Tabelle im Netzwerk geöffnet, unter "Format" den Hacken bei "Format erben" entfernt, und dann die jeweiligen Spalten markiert und über die rechte Maustaste "Format" die entsprechenden Datentypen ausgewählt. So hat das sonst auch funktioniert. In der Klassenbibiliothek habe ich diesbezüglich nichts geändert. Auch das Löschen der Tabelle und neu erstellen bringt keine Veränderung. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CSRO Mitglied
Beiträge: 25 Registriert: 07.09.2011
|
erstellt am: 05. Dez. 2011 10:14 <-- editieren / zitieren --> Unities abgeben:
Nun funktioniert es! Woran es lag ist mir jedoch nicht richtig klar. Ich habe lediglich den Spaltenindex der Tabelle deaktiviert und anschließend wieder neu aktiviert, ohne sonstige Änderungen. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CSRO Mitglied
Beiträge: 25 Registriert: 07.09.2011
|
erstellt am: 25. Jan. 2012 12:42 <-- editieren / zitieren --> Unities abgeben:
Hallo noch mal, ich bin nun dabei ein Lager mit mehreren Gassen zu erstellen. Da ich mir die Möglichkeit offen halten muss mehrere Stapler gleichzeitig fahren zu lassen muss ich alle Methoden allgemein formulieren auch wenn z.Z. nur ein Stapler fährt. Der Stapler ist durch zwei aufeinander gestapelte Fahrzeuge dargestellt. Die Koordinaten der Regalfächer sind durch Sensoren auf dem Weg (x-Koordinaten) und auf dem unteren Fahrzeug (y-Koordinaten) dargestellt. Hat ein Fahrzeug seine Zielkoordinate erreicht hält es an und eine globale Variabel xErreicht bzw. yErreicht wird auf true gesetzt. Sind beide Fahrzeuge auf der richtigen Position (xErreicht:=true und yErreicht:=true) wird die Entnahme durch wait(15) simuliert. Da die Fahrzeuge danach weiter fahren sollen muss für beide Fahrzeuge angehalten:=false gesetzt werden. Das will ich erreichen durch Gasse1.inhalt.angehalten:=false; --unteres Fahrzeug (x-Richung) Gasse1.inhalt.inhalt.angehalten:=false; --oberes Fahrzeug (y-Richtung) da das im aktuellen Falle den zweispurigen Weg mit dem Namen Gasse1 betrifft. Die richtige Gasse wird durch eine if-Abfrage der aktuellen Gasse realisiert. Leider kommt die Fehlermeldung "Unbekannter Name Inhalt" und ich kann sie nicht zuorden. Wenn ich der Gasse ein benutzerdefiniertes Attribut "Inhalt" mit Datentyp Object hinzufüge kommt die Fehlermeldung "Ein 'Void'kann keine Methode 'Angehalten' empfangen". Auch die Angabe des absoluten Pfads bringt nicht. Hat jemand eine Idee wo der Fehler liegt?
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CSRO Mitglied
Beiträge: 25 Registriert: 07.09.2011
|
erstellt am: 25. Jan. 2012 19:21 <-- editieren / zitieren --> Unities abgeben:
|
CSRO Mitglied
Beiträge: 25 Registriert: 07.09.2011
|
erstellt am: 26. Jan. 2012 09:47 <-- editieren / zitieren --> Unities abgeben:
Hallo noch einmal, um die Quelltexte in jeder Gasse gleichermaßen nutzen zu können muss ich die Methoden allgemein formulieren. Während innerhalb einer Gasse noch folgende Abfrage funktioniert: weg.inhalt.angehalten:=true muss ich bei mehreren Gassen die Formulierung allgemeiner halten. Meine Gassen heißen Gasse1, Gasse2, Gasse3, etc. Darüberhinaus habe ich eine globale Variable "Gasse" eingeführt, die die Nr. der aktuellen Gasse in der sich das FZ befindet beinhaltet. Um nicht alles über if Gasse=1 then Gasse1.inhalt.angehalten:=true; elseif Gasse2= then Gasse2.inhalt.angehalten:=true; usw. end; zu regeln stellte ich mir etwas vor wie zb: "Gasse"+str_to_string(Gasse).inhalt.angehalten:=true; so dass die aktuelle Gasse automatisch eingesetzt wird. Ich könnte das auch über lauter if...elseif Abfragen einrichten, aber da diese Fallunterscheidungen an vielen Stellen benötigt werden wird das Ganze sonst sehr unübersichtlich. Geht so etwas überhaupt? 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: 30. Jan. 2012 08:51 <-- editieren / zitieren --> Unities abgeben: Nur für CSRO
Für die "zusammengbauten" Verweise müssten Sie die Funktion str_to_obj verwenden, das würde dann wie folgt aussehen: Code:
str_to_obj("Gasse"+num_to_str(Gasse)).inhalt.angehalten:=true;
Wenn Ihnen das zu sperrig ist, dann können Sie eine Tabelle (Datentyp object) mit Objektverweisen anlegen und dann die Gassennummer als Zeilen- oder Spaltennummern verwenden, z.B.
Code:
gassen[1,Gasse].inhalt.angehalten:=true;
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CSRO Mitglied
Beiträge: 25 Registriert: 07.09.2011
|
erstellt am: 30. Jan. 2012 08:58 <-- editieren / zitieren --> Unities abgeben:
|
CSRO Mitglied
Beiträge: 25 Registriert: 07.09.2011
|
erstellt am: 07. Feb. 2012 10:32 <-- editieren / zitieren --> Unities abgeben:
Hallo, irgendetwas stimmt mit dem Programm nicht. Ich erstelle gerade ein neues Modell. Mein Stapler (zwei aufeinander gstapelte Fahrzeuge) soll auf einem zweispurigen Weg "Basisstation" erzeugt werde. Also lautet die Init-Methode: is do --Fahrzeuge erzeugen .BEs.Horizontal.erzeugen(Basisstation,6.5); .BEs.Vertikal.erzeugen(Basisstation.A.inhalt,1.4); Basisstation.A.inhalt.inhalt.angehalten:=true; end;
Das funktioniert auch in einem anderen Modell. In diesem Fall wird jedoch nur das untere Fahrzeug "Horizontal" erzeugt. Warum? Das untere Fahrzeug "Horizontal" wird auf Spur A erzeugt und im Debugger sehe ich auch dass "Basisstation.A.inhalt" als Fahrzeug "horizontal" belegt ist.
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: 09. Feb. 2012 06:17 <-- editieren / zitieren --> Unities abgeben: Nur für CSRO
|
CSRO Mitglied
Beiträge: 25 Registriert: 07.09.2011
|
erstellt am: 24. Feb. 2012 11:41 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich habe mir unbeabsichtigt eine Endlos-Schleife eingebaut und weiß nicht genau warum das Abbruch-Kriterium nicht erreicht wird. Bevor der Stapler (zwei gestapelte Fahrzeuge) die Gasse verlässt muss die Fahrerkabine (das obere der beiden Fahrzeuge)"abgelassen" werden. D.h., das obere Fahrzeug sollt rückwärts fahren bis es mit dem Heck auf Position "0m" und mit dem Bug auf "1.5m" steht. Ich habe versucht das mit Hilfe einer repeat-until Schleife zu realisieren. Das untere Fahrzeug soll so lange anhalten bis das obere Fahrzeug auf der richtigen Position steht. Der Code ist folgender: repeat --Prüfung der Position der Fahrerkabine (Vertikal) und warten bis Kabine unten ist if str_to_obj("Gasse"+to_str(alteGassennr)).A.leer=false then --auf welcher Spur befindet sich das Fahrzeug str_to_obj("Gasse"+to_str(alteGassennr)).A.inhalt.inhaltsliste(RBG_Position_y); --Schreibt die Position von "Vertikal" in Tabelle str_to_obj("Gasse"+to_str(alteGassennr)).A.inhalt.angehalten:=true; --"Horizontal" hält an str_to_obj("Gasse"+to_str(alteGassennr)).A.inhalt.inhalt.angehalten:=false; --"Vertikal" fährt runter str_to_obj("Gasse"+to_str(alteGassennr)).A.inhalt.inhalt.rueckwaerts:=true; else str_to_obj("Gasse"+to_str(alteGassennr)).B.inhalt.inhaltsliste(RBG_Position_y); str_to_obj("Gasse"+to_str(alteGassennr)).B.inhalt.angehalten:=true; str_to_obj("Gasse"+to_str(alteGassennr)).B.inhalt.inhalt.angehalten:=false; --"Vertikal" fährt runter str_to_obj("Gasse"+to_str(alteGassennr)).B.inhalt.inhalt.rueckwaerts:=true; end; yPositionFahrzeug:=RBG_Position_Y[3,1]; until yPositionFahrzeug=1.5; --Vergleichen der aktuellen Position der Kabine mit der gewünschten Position Leider verändert das Fahrzeug "Vertikal" welches die Fahrerkabine darstellt die Position nicht. Dadurch wird das Abbruchkriterium natürlich nie errreicht. Warum fährt das obere Fahrzeug nicht weiter rückwärts?
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CSRO Mitglied
Beiträge: 25 Registriert: 07.09.2011
|
erstellt am: 24. Feb. 2012 13:29 <-- editieren / zitieren --> Unities abgeben:
Ich habe das Problem jetzt umgangen indem ich das obere Fahrzeug auf die Position 1.5m (Bug)umlagere. @.inhalt.umlagern(@,1.5); Damit die Zeit stimmt habe ich den Befehl wait eingeführt und lasse die Zeit einfach durch Weg/Geschwindigkeit berechnen. Kann mir trotzdem jemand sagen warum das mit dem repeat-until Befehl nicht funktioniert? Liegt das daran dass dem Fahrzeug keine Zeit bleibt zu fahren und bevor der rueckwaerts:=true Befehl umgesetzt werden kann schon wieder in den Anfang der Repeat Schleife gewechselt 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. Feb. 2012 16:52 <-- editieren / zitieren --> Unities abgeben: Nur für CSRO
Während Plant Simulation die Schleife durchführt, bleibt die Simulationszeit stehen (das Fahrzeug fährt nicht weiter). Deshalb erreichen Sie die Abbruchbedingung nicht. Wenn Sie die Schleife mit wait immer ein kleines Stück pausieren, dann hat das Fahrzeug eine Chance, sich zu bewegen. Wenn Sie auf einen Wert einer globalen Variable warten, können Sie auch waituntil verwenden und brauchen so keine "Endlosschleife". Ansonsten sollten Sie bei Positionen nicht mit "=" vergleichen, sonstern mit >= oder <=,falls Sie 0 m oder 1,5m nicht ganz genau erreichen (sondern nur 1,49999999999). Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CSRO Mitglied
Beiträge: 25 Registriert: 07.09.2011
|
erstellt am: 24. Feb. 2012 23:46 <-- editieren / zitieren --> Unities abgeben:
|