Autor
|
Thema: Hilfe - Fehler in Methode Ablaufsteuerung?! (3382 mal gelesen)
|
LeaSophieKA Mitglied
Beiträge: 22 Registriert: 14.10.2010
|
erstellt am: 23. Nov. 2010 10:31 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, ich habe das Problem, dass meine Methode für den Ablaufplan prinzipiell richtig funktioniert, also die Schleifen so durchlaufen werden wie ich es mir vorstelle. Das Problem ist nur, dass irgendwie kein BE gefunden wird und ich immer die Fehlermeldung "Ein "Void" kann keine Methode "umlagern" empfangen" bekomme. Das bedeutet ja, dass kein aktuelles BE gefunden wird. Ich verstehe aber nicht warum das ost ist?!?! hier der Quellcode den ich verwende: is name: object; hilfezaehler: integer; NächsteStation : object; i,j,x : integer; do for i := 1 to root.lieferliste.ydim loop -- Äußere Schleife die die Lieferliste abarbeitet name := Lieferliste["BE",i]; -- die Variable "name" soll das aktuelle BE ansprechen for j:=1 to root.arbeitsplan.ydim loop --innere Schleife, die zum Einen die Lieferliste mit dem Arbeitsplan vgl if name = root.arbeitsplan["TeileTyp",j] then --und zum Anderen das aktuelle BE auf die verschiedenen Stationen umlagern soll hilfezaehler := j; for x := 1 to root.Arbeitsplan.xdim loop NächsteStation := Arbeitsplan[x,hilfezaehler]; @.umlagern(NächsteStation); -- wieso ist mein @ ein Void? next; end; next; next; end; Die Lieferliste und der Ablaufplan sind jeweils Tabellen die hinterlegt sind. Bei den Einzelstationen habe ich als "Ausgangssteuerung" die oben reinkopierte Methode angegeben.
Hat jemand eine Idee warum es nicht funktioniert? Vielen Dank vorab und Viele Grüße, Lea Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Homer Simpson Mitglied
Beiträge: 345 Registriert: 14.09.2005
|
erstellt am: 23. Nov. 2010 12:55 <-- editieren / zitieren --> Unities abgeben: Nur für LeaSophieKA
Ich glaube, hier liegen gleich mehrere Missverständnisse vor. Der Klammeraffe @ ist keine Funktion, die auf magische Weise das richtige BE findet. Du kannst dir den @ wie einen Parameter der Methode vorstellen. Er wird beim Aufruf der Methode einmal gesetzt und behält seinen Wert bei. Der @ wird aber nur gesetzt, wenn ein BE den Methodenaufruf veranlasst hat, also z. B. bei einer Ein- oder Ausgangssteuerung. Ansonsten ist @ immer 'void'. Was du hier vermutlich brauchst ist 'Station.Inhalt'. (Wenn kein BE auf der Station ist, ist Station.Inhalt übrigens auch 'void'.) Außerdem: Wenn du in einer Schleife das BE mehrfach umlagerst, dann wird das BE sofort in Nullzeit von Station zu Station springen. Damit das BE bearbeitet wird, solltest du es erst in einer Ausgangssteuerung der Station wieder umlagern. (Außerdem ist dann @ auch gleich richtig gesetzt.) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
LeaSophieKA Mitglied
Beiträge: 22 Registriert: 14.10.2010
|
erstellt am: 24. Nov. 2010 15:34 <-- editieren / zitieren --> Unities abgeben:
Hallo, danke für die Hinweise! Das ist mir prinzipiell auch irgendwie klar, aber ich verstehe nicht, warum es nicht funktioniert. Mein BE, welches an der Quelle über die Lieferliste erzeugt wird, ist eigentlich in der Variable "name" festgelegt. (Wenn ich über den Befehl "print" mir den Namen ausgeben lassen, wird auch das BE was ich erzeugen will in die Konsole geschrieben. Eigentlich dürfte doch mein @ dann kein Void mehr sein!?!?) Bei allen Stationen habe ich als Ausgangssteuerung die Methode angegeben, die ich im ersten Beitrag beschrieben habe. Aber du hast vollkommen recht - wenn ich die Simulation laufen lasse, werde einfach alle BEs direkt auf die Senke umgelagert. An welcher Stelle muss ich den ansetzten und den Inhalt der Station reinbringen? Stehe gearde echt auf dem Schlauch und bin über jeden Hinweis dankbar! Viele Grüße!
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Opa Mitglied Selbständiger Simulationsexperte
Beiträge: 62 Registriert: 16.06.2005 eM-Plant 7.6 / 8.2 Development License
|
erstellt am: 26. Nov. 2010 08:47 <-- editieren / zitieren --> Unities abgeben: Nur für LeaSophieKA
Hallo! Zitat: Original erstellt von LeaSophieKA: is name: object; hilfezaehler: integer; NächsteStation : object; i,j,x : integer; do for i := 1 to root.lieferliste.ydim loop -- Äußere Schleife die die Lieferliste abarbeitet name := Lieferliste["BE",i]; -- die Variable "name" soll das aktuelle BE ansprechen for j:=1 to root.arbeitsplan.ydim loop --innere Schleife, die zum Einen die Lieferliste mit dem Arbeitsplan vgl if name = root.arbeitsplan["TeileTyp",j] then --und zum Anderen das aktuelle BE auf die verschiedenen Stationen umlagern soll hilfezaehler := j; for x := 1 to root.Arbeitsplan.xdim loop NächsteStation := Arbeitsplan[x,hilfezaehler]; @.umlagern(NächsteStation); -- wieso ist mein @ ein Void? next; end; next; next; end;
Die Lieferliste enthält ja offensichtlich schon die BEs, d.h. die Variable name IST das BE, wie Du ja auch selbst schreibst. Also einfach statt @ name einsetzen. Gruß Opa Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
LeaSophieKA Mitglied
Beiträge: 22 Registriert: 14.10.2010
|
erstellt am: 30. Nov. 2010 11:45 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich habe meine Ablaufplanmethode jetzt noch einmal etwas verändert, weil es mit den ganze for-Schleifen etwas sehr kompliziert war (BEs werden über Lieferliste erzeugt) is folgestation: object; spalte, zeile : integer; do spalte := @.Position; --Position ist ein Attribut des jeweiligen BEs zeile := @.holeattribut("Zeile"); --Zeile ebenfalls Attribut des BEs. für Teil A ist Zeile immer 1 und TeilB 2 if @.Position = Ablaufplan.xdim then @.umlagern(root.senke) else folgestation := Ablaufplan[spalte,zeile]; @.umlagern(folgestation); @.Position := spalte+1; --spalte um eins hochzählen, um die nächste Folgestation zu ermitteln end; end; Für jede Bearbeitungsstationen habe ich für die Ausgangssteuerung die obige Methode hinterlegt. Der Ablauf funktioniert immer für die Hälfte der erzeugten BEs einwandfrei. Die restlichen 50% werden einfach von der Quelle auf die Senke umgelagert. Mir ist es absolut rätselhaft, warum das nicht für alle BEs funktioniert?!? hat irgendjemand eine Idee woran das liegen kann? Vielen Dank!! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Samson53 Mitglied Nur noch selten simulierend
Beiträge: 119 Registriert: 18.02.2010 Plant Simulation 11 Office 2013
|
erstellt am: 01. Dez. 2010 13:23 <-- editieren / zitieren --> Unities abgeben: Nur für LeaSophieKA
Hallo, if @.Position = Ablaufplan.xdim then wenn dein Ablaufplan 3 Spalten hat, werden alle BE mit Position <> 3 an die senke umgelagert. Vorschlag: Position ist Ausgangsnummer der Station (Kanten in der richtigen Reihenfolge ziehen) @.umlagern(@.Position) gibt das BE über die Kante(1,2,3) an die Nachfolgestation. Geht das? ------------------ Gruß Samson Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
LeaSophieKA Mitglied
Beiträge: 22 Registriert: 14.10.2010
|
erstellt am: 01. Dez. 2010 15:14 <-- editieren / zitieren --> Unities abgeben:
mh... wie genau meinst du das mit der Ausgangsnummer, wo muss ich die anlegen? Hab mal für jede Station ein "benutzerdefinierte Attribut" angelegt und dann durchnummeriert. aber so funktioniert es nicht. Meine Idee mit der Position war eigentlcih diese: Jedes BE hat ein "benutzerdefiniertes Attribut" namens Position, welches den Wert 1 hat. Über die Methode sollte eigentlich dann die Position für jedes BE, welches an der Quelle erzeugt wird pro Umlagerung um eins hochgezählt werden. Ich finde es so komisch, dass es für ein BE funktioniert und beim nächsten dann nicht (die bleiben auf der Quelle und springen dann direkt in die Senke) und für das nächste funktioniert es dann wieder?!?!
Grüße Lea Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Samson53 Mitglied Nur noch selten simulierend
Beiträge: 119 Registriert: 18.02.2010 Plant Simulation 11 Office 2013
|
erstellt am: 02. Dez. 2010 08:34 <-- editieren / zitieren --> Unities abgeben: Nur für LeaSophieKA
Hallo, ich meine das so, wie im Bild angedeutet. Die Ausgangssteuerung der Quelle wäre dann wie folgt: -- Zählt die Ausgänge hoch für gleichmäßige Verteilung is do source.Ausgang := source.Ausgang +1; if source.Ausgang >4 then source.Ausgang := 1; end; If source.nf(Source.Ausgang).occupied then -- Was soll passieren, wenn der NF besetzt ist else @.move(source.Ausgang); end; end; Oder habe ich noch etwas nicht beachtet? Kannst du mal ein Bild posten? ------------------ Gruß Samson Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
LeaSophieKA Mitglied
Beiträge: 22 Registriert: 14.10.2010
|
erstellt am: 02. Dez. 2010 09:38 <-- editieren / zitieren --> Unities abgeben:
Hallo, vielen Dank für deine Hilfe. Hab es jetzt mal so ähnlich probiert. Aber: immernoch das selbe Problem... ein BE funktioniert, das nächste wieder nicht und so weiter. Hab dir mal meinen Simulationsaufbau und den Ablaufplan geschickt. Wäre dir sehr dankbar, wenn du es dir anschauen würdest. Es sollen wie gesagt die beiden unterschiedlichen BEs (TeilA und TeilB) produzierten werden. Tausend Dank vorab! Grüße Lea Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Samson53 Mitglied Nur noch selten simulierend
Beiträge: 119 Registriert: 18.02.2010 Plant Simulation 11 Office 2013
|
erstellt am: 03. Dez. 2010 08:43 <-- editieren / zitieren --> Unities abgeben: Nur für LeaSophieKA
Hallo, ich glaube jetzt habe ich es: Ich habe der Quelle zwei Zähler spendiert AusgangA und AusgangB. Wenn ein Teil die Quelle verlassen will, wird je nach TeilA oder B der Zähler A oder B hochgezählt. Dann schaue ich nach, ob in der Spalte des Ablaufplans ein Ziel definiert ist. Ist das nict der Fall, setzte ich den Zähler auf Anfang. Bevor dann die eigentliche Umlagerung erfolgt, prüfe ich, ob das Ziel auch frei ist. Wenn nicht habe ich keine Lösung programmiert und der Lauf ist beendet. Außerdem setzte ich in einer Reset-Methode den AusgangA und AusgangB auf 0. Der Simtalk-Code: die Ausgangsteuerung der Quelle: is Ziel : object; do if @.Name = "TeilA" then source.AusgangA := source.AusgangA +1; Ziel := Ablaufplan[source.AusgangA,"Bes.TeilA"]; -- Wenn nichts mehr drin steht fang von vorne an if Ziel = VOID then source.AusgangA := 1; Ziel := Ablaufplan[source.AusgangA,"Bes.TeilA"] end; else source.AusgangB := source.AusgangB +1; Ziel := Ablaufplan[source.AusgangA,"Bes.TeilB"]; -- Wenn nichts mehr drin steht fang von vorne an if Ziel = VOID then source.AusgangB := 1; Ziel := Ablaufplan[source.AusgangA,"Bes.TeilB"] end; end; If Ziel.occupied then -- Was soll passieren, wenn der Ziel besetzt ist else @.move(Ziel); end; end; Methode Reset: is do Source.AusgangA :=0; Source.AusgangB :=0; end;
------------------ Gruß Samson Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
LeaSophieKA Mitglied
Beiträge: 22 Registriert: 14.10.2010
|
erstellt am: 03. Dez. 2010 09:45 <-- editieren / zitieren --> Unities abgeben:
|
LeaSophieKA Mitglied
Beiträge: 22 Registriert: 14.10.2010
|
erstellt am: 06. Dez. 2010 11:00 <-- editieren / zitieren --> Unities abgeben:
Hallo Samson, nach einigen Versuchen mit deiner Methode, bin ich wieder zu dem selben Ergebnis gekommen, wie schon mit meiner Methode... Es werden einfach nicht alle BEs richtig umgelagert. Das Problem ist, dass die Quelle ja nach und nach hochgezählt wird, dieser Zähler ist aber nicht direkt an ein BE "gekoppelt". Das Bedeutet: Teil A ist im Wertstrom auf Station 1. AUsgangA ist dann 1. Dieser wird dann hochgezählt auf 2. Das nächste TeilA wird von der Quelle erzeugt, bekommt als "Ziel" dann aber nicht Station 1 sondern Station 2, weil der Zähler AusgangA ja gerade auf 2 steht wg. dem ersten TeilA. Richtig funktionieren tut es nur, wenn ich in der Lieferliste die Position als Attribut (also in einer Untertabelle) hinterlege. Das Problem ist aber, dass ich die Lieferliste als textdatei einlesen muss (da die über eine Parameteroptimierungssoftware verändert werden soll). Wenn ich die Tabelle als Textdatei einlesen, geht die Untertabelle "verloren". Gibt es irgendein Alternative zu der "untertabelle" damit es funktioniert? Oder gibt es eine Möglichkeit die Untertabelle auch einzulesen? Vielen Dank vorab! Viele Grüße, Lea Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
LeaSophieKA Mitglied
Beiträge: 22 Registriert: 14.10.2010
|
erstellt am: 06. Dez. 2010 16:22 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich habe das Problem jetzt gelöst... Ich importiere einfach nur die Spalte mit der Anzahl in die Lieferliste und damit geht die Untertabelle nicht "verloren" und der Ablaufplan funktioniert. Manchmal ist es doch einfacher als man denkt Trotzdem danke für Eure Bemühungen! Viele Grüße, Lea Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |