Autor
|
Thema: Tabelle mit Attribute beschreiben (4527 mal gelesen)
|
Prosinecki.MM Mitglied Student
Beiträge: 23 Registriert: 15.11.2013 Plant Simulation 11.0.0
|
erstellt am: 07. Jan. 2014 16:50 <-- editieren / zitieren --> Unities abgeben:
Hallöchen, ich habe folgendes Problem: Ich lasse über Sortierer meine BEs nach den Lieferterminen anordnen. Die geordneten Teile sollten dann in einem Lager ("P_Produktionsscheiben", x-Dim=12; y-Dim=8) der Reihe nach eingeordnet werden. Die grundlegende Methode dafür mit Zählerschleife funktioniert auch. Code:
is x,y : integer; gefunden: boolean;do from y:= 1 until y=P_Produktionsscheiben.ydim+1 loop from x:=1 until x=P_Produktionsscheiben.xdim+1 loop @.umlagern(P_Produktionsscheiben.pe(x,y)); gefunden:= true; x:=x+1; end; y:=y+1; end;
Gleichzeitig würde ich gern für die umgelagerten BEs diverse Attribute in eine Tabelle schreiben lassen und darauf aufbauend Berechnungen durchführen. Also habe ich die Methode erweitert. Code:
is x,y,Periode, Los : integer; gefunden: boolean; Zeit_MS21, Zeit_MS22, Zeit_MS23, Summe: time;do from y:= 1 until y=P_Produktionsscheiben.ydim+1 loop from x:=1 until x=P_Produktionsscheiben.xdim+1 loop @.umlagern(P_Produktionsscheiben.pe(x,y)); if Tabelle.leer then Tabelle.schreibeZeile(1,Tabelle.ydim+1,P_Produktionsscheiben.pe(x,Y).inhalt.teiletyp); Tabelle.schreibeZeile(2,Tabelle.ydim,P_Produktionsscheiben.pe(x,Y).inhalt.Variante); Zeit_MS21:=root.Arbeitsplan["Arbeitsschritte",P_Produktionsscheiben.pe(x,Y).inhalt.teiletyp]["Bearbeitungszeit",2]; Zeit_MS22:=root.Arbeitsplan["Arbeitsschritte",P_Produktionsscheiben.pe(x,Y).inhalt.teiletyp]["Bearbeitungszeit",3]; Zeit_MS23:=root.Arbeitsplan["Arbeitsschritte",P_Produktionsscheiben.pe(x,Y).inhalt.teiletyp]["Bearbeitungszeit",4]; Tabelle.schreibeZeile(3,Tabelle.ydim,Zeit_MS21); Tabelle.schreibeZeile(4,Tabelle.ydim+1,Zeit_MS22); Tabelle.schreibeZeile(5,Tabelle.ydim+1,Zeit_MS23); else Tabelle.schreibeZeile(1,Tabelle.ydim-1,P_Produktionsscheiben.pe(x,Y).inhalt.teiletyp); Tabelle.schreibeZeile(2,Tabelle.ydim-1,P_Produktionsscheiben.pe(x,Y).inhalt.Variante); Zeit_MS21:=root.Arbeitsplan["Arbeitsschritte",P_Produktionsscheiben.pe(x,Y).inhalt.teiletyp]["Bearbeitungszeit",2]; Zeit_MS22:=root.Arbeitsplan["Arbeitsschritte",P_Produktionsscheiben.pe(x,Y).inhalt.teiletyp]["Bearbeitungszeit",3]; Zeit_MS23:=root.Arbeitsplan["Arbeitsschritte",P_Produktionsscheiben.pe(x,Y).inhalt.teiletyp]["Bearbeitungszeit",4]; Tabelle.schreibeZeile(3,Tabelle.ydim-1,Zeit_MS21); Tabelle.schreibeZeile(4,Tabelle.ydim,Zeit_MS22); Tabelle.schreibeZeile(5,Tabelle.ydim+1,Zeit_MS23); end; Summe:= Tabelle[3,Tabelle.ydim-2]+Tabelle[4,Tabelle.ydim-2]+Tabelle[5,Tabelle.ydim-2]; Tabelle.schreibeZeile(6,Tabelle.ydim-2,Summe); gefunden:= true; x:=x+1; end; y:=y+1; end; end;
Die innere "if"-Bedingung habe ich eingefügt, da das Schreiben der ersten drei Tabellenzeilen (bedingt durch den Versatz - siehe Tabelle.ydim) anders erfolgt als die nachfolgenden. Das Ergebnis der Tabelle ist leider wenig zufrieden stellend - siehe Dateianhang. Mein Ziel war es, für jedes umgelagerte BE eine neue Zeile mit den Attributen Teiletyp, Variante und die Bearbeitungszeiten MS21-MS23 zu beschreiben. MS stellen Taktstationen dar - diese werden in der Tabelle je um eine Zeile versetzt. Um somit über eine Zeile die gesamt bearbeitungszeit eines Taktes berechnen zu können ("Summe") - brauche ich später noch, wenn das aktuelle Problem gelöst ist. Die Methode ist als Ausgangssteuerung (Bug) des Sortierers (Vorgänger vom Lager) hinterlegt. War dies verständlich? Wo liegt mein Fehler? Ach ja, wenn man sich die Inhaltsliste des Lagers betrachtet, werden die BEs dort nicht beginnend bei x=1 und y=1 einsortiert, sondern bei x=12 und y=8 (siehe Anhang). Warum? [Diese Nachricht wurde von Prosinecki.MM am 31. Jan. 2014 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: 07. Jan. 2014 22:04 <-- editieren / zitieren --> Unities abgeben: Nur für Prosinecki.MM
erstens: sie müssten einen leeren Platz suchen, dort hin umlagern und dann die zwei Schleifen verlassen: Ihre Programmierung: Zitat:
is x,y : integer; gefunden: boolean; dofrom y:= 1 until y=P_Produktionsscheiben.ydim+1 loop from x:=1 until x=P_Produktionsscheiben.xdim+1 loop @.umlagern(P_Produktionsscheiben.pe(x,y)); gefunden:= true; x:=x+1; end; y:=y+1; end;
Vorschlag: Code:
is x,y : integer; gefunden: boolean; do from y:= 1 until y=P_Produktionsscheiben.ydim+1 loop from x:=1 until x=P_Produktionsscheiben.xdim+1 loop if P_Produktionsscheiben.pe(x,y).inhalt = void then @.umlagern(P_Produktionsscheiben.pe(x,y)); exitloop 2; end; x:=x+1; end; y:=y+1; end;
Das Eintragen in die Tabelle können Sie dann nach der Schleife vornehmen. Sie können weiter mit @ auf das Teil zugreifen. [Diese Nachricht wurde von Bon Simul am 07. Jan. 2014 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Prosinecki.MM Mitglied Student
Beiträge: 23 Registriert: 15.11.2013 Plant Simulation 11.0.0
|
erstellt am: 10. Jan. 2014 10:02 <-- editieren / zitieren --> Unities abgeben:
Super, das hat soweit funktioniert. Wann und in welchen Zusammenhang verwendet man eigentlich "void" und was bedeutet es konkret in oben stehender Methode? Ich würde gern das Umlagern der BEs ins Lager stoppen, wenn dieses voll ist. Zusätzlichen sollen dann die BEs der ersten Zeile des Lagerinhalts in einen nachfolgenden Puffer umgelagert werden. Die restlichen Teile des Lagerinhalts sollen jeweils eine Zeile (ydim) nach oben rücken (ydim-1), so dass die BEs aus dem Sortierer in die letzte Zeile (ydim=8) umgelagert werden können. Wie kann ich das in einer Methode umsetzen? Vor allem dass die BEs eine Zeile im Lager nach oben rutschen. Vielen Dank ... 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: 10. Jan. 2014 12:41 <-- editieren / zitieren --> Unities abgeben: Nur für Prosinecki.MM
void können Sie verwenden, um zu prüfen, ob eine Objektvariable gesetzt ist oder nicht. Viele Funktionen geben void zurück, wenn es kein Ergebnis gibt (wie einen Fehlerwert). Z.B. gibt die Funktion inhalt void zurück, wenn das Objekt oder der Platz leer ist. Mit der Abfrage auf void (=void), können Sie das abfangen oder testen. Das mit dem Reihenweise Nachrücken im Lager könnten Sie wie folgt regeln. wenn das Lager voll ist, sperren Sie den Eingang des Lagers (das könnten Sie über die Eingangssteuerung machen). Beim Auslagern müssten Sie, wenn die erste "Zeile" leer ist einen Umsortierungsmechanismus in Gangs setzen z.B:
Code:
for i:=1 to lager.yDim loop for k:=2 to lager.XDim loop lager.pe(i,k).inhalt.umlagern(lager(i,k-1); next; next; --eingang wieder freigeben lager.eingangGesperrt:=false;
[Diese Nachricht wurde von Bon Simul am 10. Jan. 2014 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Prosinecki.MM Mitglied Student
Beiträge: 23 Registriert: 15.11.2013 Plant Simulation 11.0.0
|
erstellt am: 12. Jan. 2014 12:29 <-- editieren / zitieren --> Unities abgeben:
Kann es sein, dass Sie i und k vertauscht haben? i entspricht doch der ydim und müsste, wenn die erste Zeile frei ist, mit 2 beginnen - k dafür mit 1. der Zugriff auf die Lagerplätze ist dann Code: lager.pe(k,i).inhalt.umlagern(lager(k,i-1)
Oder habe ich einen Denkfehler? Ich habe den Vorschlag von Ihnen angepasst und aktuell folgendenen Code: Code:
--- Prüfen, ob Produktionscheibe voll, dann keine Aufträge mehr einplanbar--if P_Produktionsscheiben.einganggesperrt = true then for i:=1 to P_Produktionsscheiben.yDim loop if i=1 then for k:=1 to P_Produktionsscheiben.XDim loop P_Produktionsscheiben.pe(k,i).inhalt.umlagern(P_Produktion) next; else for k:=1 to P_Produktionsscheiben.XDim loop P_Produktionsscheiben.pe(k,i).inhalt.umlagern(P_Produktionsscheiben[k, i-1]) next; end; next; ---eingang wieder freigeben--- P_Produktionsscheiben.eingangGesperrt:=false; else ...
Die BEs werden ohne Probleme auf den nachfolgenden Puffer "P_Produktion" umgelagert. Jedoch der Umsortiermechanismus funktioniert für die Zeile i=2 nicht richtig. Die nachfolgenden Zeilen werden wie gewünscht eine Zeile nach oben gesetzt. Für die 2. Zeile (i=2) wird das erste BEs (an Position i=2, k=1) auf die letzte Position in der ersten Zeile einsortiert (i=1, k=12). Die folgenden BEs auf Zeile 2 (k=2-12) werden auf die letzte Zeile (i=8) umgesetzt, beginnend bei k=1. Ich habe zum besseren Verständnis ein Sceenshot vom Lagerinhalt (P_Produktionsscheiben.pe()) eingefügt. Wo liegt der Fehler im Code, dass die BEs so einsortiert werden??? Der Eingang vom Lager wird auch nicht wieder freigegeben. Keine Ahnung woran das liegt. VG Madlin 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: 12. Jan. 2014 12:56 <-- editieren / zitieren --> Unities abgeben: Nur für Prosinecki.MM
zunächst Entschuldigung für den Fehler,es muss heißen: Code:
for i:=2 to lager.yDim loop for k:=1 to lager.XDim loop lager.pe(k,i).inhalt.umlagern(lager.pe(k,i-1)); next; next; --eingang wieder freigeben lager.eingangGesperrt:=false;
Ihre Zeile für das Umlagern innerhalb des Lages muss wie folgt aussehen (es fehlt pe(...)) Code:
P_Produktionsscheiben.pe(k,i).inhalt.umlagern(P_Produktionsscheiben.pe(k, i-1));
kommen Sie an der Stelle mit dem entsperren an? [Diese Nachricht wurde von Bon Simul am 12. Jan. 2014 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Prosinecki.MM Mitglied Student
Beiträge: 23 Registriert: 15.11.2013 Plant Simulation 11.0.0
|
erstellt am: 12. Jan. 2014 13:32 <-- editieren / zitieren --> Unities abgeben:
Danke für die schnelle Antowrt. Ich habe die Änderung vorgenommen. Das Ergebnis ist leider das gleiche. Es hat sich nichts geändert bei der Umsortierung des Lagers. Im Grunde müsste die for-Schleife doch durchlaufen sein, wenn alle BEs umsortiert sind. Mal davon abgesehen, dass diese nicht umsortiert werden wie gewünscht, müsste die Methode doch bis zur Aufhebung der Eingangssperre durchlaufen werden, oder? Kann ich das nachprüfen? 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: 12. Jan. 2014 16:25 <-- editieren / zitieren --> Unities abgeben: Nur für Prosinecki.MM
Sie könnten einen Haltepunkt einfügen (rechte Maustaste im Methodeneditor - Klassenhaltepunkt einfügen). das umlagern liefert einen Boolean wert zurück, den könnten Sie auch prüfen: umgelagert:=lager...umlagern...; if not umgelagert then debug; end;
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: 12. Jan. 2014 16:30 <-- editieren / zitieren --> Unities abgeben: Nur für Prosinecki.MM
noch etwas anderes: Zitat:
--- Prüfen, ob Produktionscheibe voll, dann keine Aufträge mehr einplanbar-- if P_Produktionsscheiben.einganggesperrt = true then
Wenn es die Eingangssteuerung ist, dann sollte es heißen:
Code:
if P_Produktionsscheiben.voll= true then P_Produktionsscheiben.einganggesperrt := true ; -- ...usw.
Wenn der Eingang gesperrt ist, dann wird die Eingangssteuerung nicht aufgerufen (Umlagerung wird blockiert) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Prosinecki.MM Mitglied Student
Beiträge: 23 Registriert: 15.11.2013 Plant Simulation 11.0.0
|
erstellt am: 13. Jan. 2014 10:35 <-- editieren / zitieren --> Unities abgeben:
Genauso habe ich es gemacht. Das Umlagern der ersten Zeile des Lagers auf den nachfolgenden Puffer klappt. Der Eingang wird auch für weitere BEs wieder freigegeben. Das Problem liegt wirklich nur bei der internen Umlagerung der zweiten Zeile in die erste. Das Ergebnis ist immer noch das gleiche wie auf den in der vorherigen Anwort eingefügten Screenshots. Code:
isi,k: integer; do if ?.voll then ?.einganggesperrt:= true ; for i:=1 to ?.yDim loop if i=1 then for k:=1 to ?.XDim loop ?.pe(k,i).inhalt.umlagern(P_Produktion) next; else for k:=1 to ?.XDim loop ?.pe(k,i).inhalt.umlagern(?.pe(k, i-1)) next; end; next; ---eingang wieder freigeben--- ?.eingangGesperrt:=false; end; end;
Den Klassenhaltepunkt habe ich auch gesetzt. Aber leider nicht herausbekommen, wo genau der Fehler für die falsche Umsortierung liegt. 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: 13. Jan. 2014 11:11 <-- editieren / zitieren --> Unities abgeben: Nur für Prosinecki.MM
Der gesperrte Eingang des Lagers blockiert die Umlagerung. Es ist besser den Ausgang der Vorgänger zu sperren: Code:
is i,k: integer;do if ?.voll then ?.vg.ausganggesperrt:= true ; for i:=1 to ?.yDim loop if i=1 then for k:=1 to ?.XDim loop ?.pe(k,i).inhalt.umlagern(P_Produktion) next; else for k:=1 to ?.XDim loop ?.pe(k,i).inhalt.umlagern(?.pe(k, i-1)) next; end; next; ---ausgang des vorgängers wieder freigeben--- ?.vg.ausgangGesperrt:=false; end; end;
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Prosinecki.MM Mitglied Student
Beiträge: 23 Registriert: 15.11.2013 Plant Simulation 11.0.0
|
erstellt am: 13. Jan. 2014 13:18 <-- editieren / zitieren --> Unities abgeben:
|
Bon Simul Mitglied Simulant
Beiträge: 1250 Registriert: 08.08.2011 Plant Simulation 10.1, 11 ff Professional
|
erstellt am: 13. Jan. 2014 15:29 <-- editieren / zitieren --> Unities abgeben: Nur für Prosinecki.MM
|
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|