Autor
|
Thema: Lager Voll (2331 mal gelesen)
|
tommy93 Mitglied Sutdent
Beiträge: 4 Registriert: 06.03.2018
|
erstellt am: 06. Mrz. 2018 18:33 <-- editieren / zitieren --> Unities abgeben:
Hallo liebe Community, ich bereite gerade ein Projekt für mein Studium vor und möchte vertieft mit TM Plant Simulation arbeiten. Jetzt kämpfe ich mit den Methoden und komme an einem Punkt nicht weiter, wobei ich sicher bin, dass die Lösung ziemlich simpel ist. Das Ziel ist ganz leicht: Ich möchte nach einer Einzelstation auf ein Lager transportieren. Wenn dieses voll ist, soll die ES auf einen Puffer ausweichen. Mein Code lautet: if Lager1.voll=false @.umlagern(Lager1) else @.umlagern(Puffer1) end Doch immer wenn ich starte meckert das Programm bezüglich Syntaxfehler <> (in Zeile 2) und ich erkenne nicht warum bzw. was ich ändern muss. Bangsow und Co. führen in ihren Büchern teils ähnliche Beispiele doch bei mir klappt es nicht. Da ich SimTalk 2.0 verwende können es auch keine fehlenden Semikolons sein. Muss ich noch etwas deklarieren?
Danke an Alle, die sich meiner Problematik annehmen. Freue mich über jede Antwort und bin für jeden Tipp/Hinweis dankbar. Grüße Tommy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
nadin1223 Mitglied Ing.
Beiträge: 938 Registriert: 29.03.2016
|
erstellt am: 06. Mrz. 2018 19:52 <-- editieren / zitieren --> Unities abgeben: Nur für tommy93
Hallo Tommy, Code: if Lager1.voll=false then /*Kontrollstrukturen in einer Zeile!! schreiben und "then" fehlte*/ @.umlagern(Lager1)else @.umlagern(Puffer1) end
vG Nadin ------------------ „Die einfachste Art an korrekte Informationen zu gelangen ist, etwas Falsches in ein Forum zu posten und auf die Korrektur zu warten.“ Matthew Austern Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tommy93 Mitglied Sutdent
Beiträge: 4 Registriert: 06.03.2018
|
erstellt am: 07. Mrz. 2018 15:46 <-- editieren / zitieren --> Unities abgeben:
Hallo Nadin, erstmal herzlichen Dank, es hat geklappt. Mir war nicht bewussst, dass der Befehl gleich in die erste Zeil nach dem IF muss. Jetzt klappts. Da du dich offenbar gut auskennst würde ich dir direkt noch eine Frage stellen, vll hast du eine Idee. Ich möchte nach einer vordefinierten Tabelle (kann ich bereits erstellen) BEs in einer Einzelstation verarbeiten (Anzahl und Zeiptunkt sind festgelegt). Die BEs sollen aber nicht aus einer Quelle sondern aus einem bestimmten Lager (z.B. lager1) entnommen werden. Zu Beginn wollte ich mit den KANBAN-Bausteinen arbeiten und den RequestBefehl benutzen, komme aber nicht weiter. Denkst du, es gibt etwas Leichteres? Gruß Tommy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
nadin1223 Mitglied Ing.
Beiträge: 938 Registriert: 29.03.2016
|
erstellt am: 07. Mrz. 2018 22:43 <-- editieren / zitieren --> Unities abgeben: Nur für tommy93
Hallo Tommy, das Grundprinzip einer möglichen Auslagerungssteuerung für Lager hatte mal BANGSOW hier und hier abgebildet. vG Nadin ------------------ „Die einfachste Art an korrekte Informationen zu gelangen ist, etwas Falsches in ein Forum zu posten und auf die Korrektur zu warten.“ Matthew Austern Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
nadin1223 Mitglied Ing.
Beiträge: 938 Registriert: 29.03.2016
|
erstellt am: 10. Mrz. 2018 15:23 <-- editieren / zitieren --> Unities abgeben: Nur für tommy93
Hallo Tommy, INFO: Forenbeiträge sind immer bessern, da so auch Andere die Möglichkeit bekommen, bei gleichen Problemen eine Lösung zu finden. Es gibt viele Möglichkeiten ein Lager abzubilden. Mein Liebling ist immer noch der Pufferbaustein . ZU Frage Englisch in Plant Simulation: naja alles vorliebe. Plant Simulation ist sehr freundlich zu User, da umfangreiche Hilfe und Attribute in englisch und deutsch angeboten werden. ZU Frage Abbildung: Beispielsweise "[...] nach definierten Zeitpunkten [...]" heißt Generator verwenden. ------- Habe mal das Beispiel von BANGSOW Training-ID: 510 einwenig kommentiert.. DIeses Beispiel beschreibt folgende Situation: 1 Lager verwaltet drei BE-Arten. Die nachfolgende Station "SingleProc" nimmt in der festgelegten Sequenz (diese ist in Tabelle "CycleTable" hinterlegt) jeden Takt (das ist die hinterlegte Zeit im Generator) das erforderliche BE aus dem Lager raus. Wenn BE nicht im Lager zu dem Prüfzeitpnkt (Taktbeginn) vorrätig, bleibt die Station leer. Die BE, die im Lager sind, werden in Tabelle "Stock" gespeichert, sodass die Suche nach dem BE, welches in dieser Sequenz erforderlich ist, über diese Tabelle abgebildet ist. Es geht auch direkt im Lager nach dem BE zu suchen. Die Tabelle ist FIFO-Prinzip. Zu Beginn der Simulation wird der Inhalt in Tabelle "Stock" gelöscht, da Lager leer ist. Auch der Cursor in "CycleTable" wird auf 1 gesetzt, damit startet die Simulation immer mit gleichen erforderlichen BE für "SingleProc". Code:
/****METHODE take_in********/ /* n.r. wird aufgerufen von Weg "L1" als Ausgangssteuerung BUG. Da als BUG aufruf ist @.move erforderlich */ is x:integer; y:integer; partName:string; do waituntil warehouse.full=false prio 1; --n.r.--> warte bis warenhause (Lager) leer --look for free place warehouse.getFreePlace(x,y); --n.r. --> dass speichert die Koordinaten eines freien, nicht mit BE belegten Platzes in x und y partName:=@.name; --n.r. --> merke den Namen des BE in partName (ist lokale Variable) @.move(warehouse.pe(x,y)); --n.r. lagere das BE auf den zuvor gemerkten Platz um --register stock.writeRow(1,stock.yDim+1, partName,x,y); --n.r. --> schreibe in Tabelle "stock" welcher BE auf welchen Platz liegt end;
Code:
/****METHODE take_out****/ /* n.r. wird aufgerufen von dem Generator */ is x:integer; y:integer; part:string; found:boolean; do --look for the next partName in the cycleTable part:=cycleTable[1,cycleTable.position]; --n.r. --> leist den Name des BE´s aus, welcher als nächstes auf der Einzelstation bearbeitet werden soll --look for the part in the stock of the warehouse stock.setCursor(1,1); --n.r. --> setzt den Zeiger im Lager auf 1,1. Ab dieser Position wird gesucht. Steht der zeiger beispielsweise auf 10,1 und der Eintrag ist auf 1,1, wird dieser nicht gefunden found:=stock.find(part); --n.r. --> sucht den Namen des BEs, welches als nächstes aufgelegt werden soll in der Tabelle "stock" und spechert das Suchergebnis (true: gefunden OR false : nicht gefunden) if found then --n.r. --> wenn es den Namen gefunden hat -- read coords from stock --n.r. --> nach dem Suchen, wenn gefunden ist der Zeiger (cursor) auf das Ergebniss gesetzt. x:=stock["X",stock.cursorY]; --n.r.--> holle PositionX von dem gefundenen BE y:=stock["Y",stock.cursorY]; --n.r.--> holle PositionY von dem gefundenen BE --delete row in the stock-table stock.cutRow(stock.cursorY); --n.r.--> Schneide die Zeile aus der Tabelle raus. Damit wird das BE aus der Tabelle entfernt -- increase position in cycle --n.r. --> setze Position in "cycleTable" eins hoch, aber nur dann, wenn nicht der letzte Eintrag. Wenn letzter Eintrag, dann setze auf 1 if cycleTable.position = cycleTable.YDim then cycleTable.position:=1; else cycleTable.position:=cycleTable.position+1; end; --take part put from warehouse warehouse.pe(x,y).cont.move(SingleProc); --n.r.--> dies ist zum Umlagern des gefundenen BEs aus dem Lager auf die Station dar. end; end;
vG Nadin ------------------ „Die einfachste Art an korrekte Informationen zu gelangen ist, etwas Falsches in ein Forum zu posten und auf die Korrektur zu warten.“ Matthew Austern [Diese Nachricht wurde von nadin1223 am 10. Mrz. 2018 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tommy93 Mitglied Sutdent
Beiträge: 4 Registriert: 06.03.2018
|
erstellt am: 20. Mrz. 2018 18:27 <-- editieren / zitieren --> Unities abgeben:
Hi Nadin, vielen vielen Dank für die ausführliche Erklärung. Die hat mir sehr geholfen zu durchschauen wie alles zusammenhängt. Deine Beschreibungen bringen eine Menge Licht ins Dunkel. Um mein individuelles Modell zu erstellen muss ich noch etwas rumdoktern aber aufbauend auf deiner Erklärung sollte das möglich sein. Wirklich sehr freundlich von dir! Bei meinen Basteleien kommt es jedoch immer wieder vor, dass der Befehl "getFreePlace" bzw. "holeFreienPlatz" nicht zu finden ist. Gibt es da einen anderen Befehl bzw. einen Ordner, wo man alle Befehle einsehen kann, die mit einem Lager in Zusammenhang stehen? Muss ihm ja sagen, dass er eben einen freien Platz mit den jeweiligen Koordinaten speichern soll. Grüße Tommy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
nadin1223 Mitglied Ing.
Beiträge: 938 Registriert: 29.03.2016
|
erstellt am: 21. Mrz. 2018 05:00 <-- editieren / zitieren --> Unities abgeben: Nur für tommy93
Hallo Tommy, Zitat: Bei meinen Basteleien kommt es jedoch immer wieder vor, dass der Befehl "getFreePlace" bzw. "holeFreienPlatz" nicht zu finden ist.
ja dies ist richtig bis einschließlich Version13.0. In Version 14.0 ist dies ein Standardbefehl. Dieser Befehl ist nicht Bestandteil von Lager. BANGSOW hat es programmiert. (In Klassenbibliothek das Lager auswählen und Reiter "Benutzerdefiniert" auswählen. Dort stehen zwei Methoden. Eine davon ist die "getFreePlace". In Klassenbibliothek deshalb, weil alle im Netzwerk eingefügten Methoden diese Eigenschaft, des in Klassenbibliothek hinterlegten Bausteins, erben. Der Text ist dann ausgegraut.) Prinzipiell gilt, wenn der Befehl nicht von der Plant Simulation Hilfe gefunden wird, ist es kein Standardbefehl...naja es Scheint, dass 14.0 "hofeFreienPlatz" noch nicht in Hilfe drinne hat. Alle Attribute eines Bausteins und BEs kannst du sehen mit: Rechstklick aufs Baustein und "Attribute und Methoden anzeigen..." auswählen. Sobald du also ein neues Modell erstellt hast und nicht die Vorlage aus diesem Beispiel nahmst oder in V13 arbeitest, konntest du diesen Befehl nicht finden. So sieht in Plant Simulation Customizing von Bausteinen aus. Würde gerne auf den gewollten Lerneffekt schieben. Habe aber nur beim Kommentieren dies übersehen . Also Nachtrag --> Methode getFreePlace im Lager. Diese ermittelt den nächstfolgenden freien Platz im Lager
Code: (byRef x,y:integer):boolean -- n.r.--> bekommt x,y als Integer übergeben und gibt true oder false zurück. Für SimTalk2 unter Hilfe-->"Eine Methode programmieren" nachschauen, wie diese Zeile zu schreiben ist is i:integer; k:integer; do if self.~.full then --n.r. --> wenn Lager.voll return false; -- n.r. --> beende diese Methode und gib false zurück else for i := 1 to self.~.xDim loop --n.r. --> gehe die xDim dieses Lagers durch for k := 1 to self.~.yDim loop --n.r. --> gehe die yDim dieses Lagers durch if self.~.pe(i,k).empty then -- n.r. --> wenn Platz[i,k] leer --save coords into parameters -- n.r.--> Speichere in die übergebenen Variablen. Da diese auch der anderen Methode zugänglich sind, können diese in anderer Methode abgefragt werden. x:=i; y:=k; return true; --n.r. --> beende diese Methode und gib true zurück end; next; next; end; end;
vG Nadin ------------------ „Die einfachste Art an korrekte Informationen zu gelangen ist, etwas Falsches in ein Forum zu posten und auf die Korrektur zu warten.“ Matthew Austern [Diese Nachricht wurde von nadin1223 am 21. Mrz. 2018 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tommy93 Mitglied Sutdent
Beiträge: 4 Registriert: 06.03.2018
|
erstellt am: 22. Mrz. 2018 11:36 <-- editieren / zitieren --> Unities abgeben:
Hi Nadin, dein Beitrag hat mal wieder geholfen. Selbst wäre ich da nicht drauf gekommen. Naja; leichter ist es wohl, wenn ich gleich 14.0 hernehme. Aber diese Lösung passt auch. Mittlerweile klappt auch die Vernetzung mit anderen Lagern, die andere Teile produzieren. Stehen diese Teile in der CycleTable sucht er in allen Lagern und findet schlussendlich die nötigen Teile. Mit Ausprobieren kommt man auch weit :-) (Aber es dauert ewig ) Abschließend frage ich mich, ob man in der CycleTable auch Anzahl und Datum des Zugriffs nutzen kann . Momentan erkennt er nur den Namen und holt das betreffende BE über den Generator raus. Spannend wäre es, wenn er zu einer gewissen Zeit (datetime) eine vorbestimmte Anzahl dieser Teile rausholt. Hab mal die gewollten Daten in die CycleTable eingegeben aber da meckert das Programm...(wohl auch zurecht :-)) Mir fehlt das Wissen dem Generator beizubringen, dass neben Name eben auch Zeit und Anzahl wichtig sind. Werd mal weiter basteln..... Grüße Tommy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|