Autor
|
Thema: Sortieren im Sortierer mittels Methoden (2678 mal gelesen)
|
Binford6100 Mitglied Student
Beiträge: 8 Registriert: 22.01.2009
|
erstellt am: 22. Jan. 2009 14:38 <-- editieren / zitieren --> Unities abgeben:
Hallo! Ich bin neu hier und möchte mich erst mal kurz vorstellen. Ich bin Student an der FH Jena und bearbeite in einer Studienarbeit eine kleine Fabriksimulation eines Kleinteilherstellers. Bei dieser Studienarbeit habe ich ein kleines aber wichtiges Problem. Ich habe als Puffer vor einer Einzelstation ein Sortierer. Dieser soll einkommende BEs nach gleichen Namen sortieren damit die Maschine nur einmal, im Bezug zum Namen des BEs rüsten muss. Ich habe versucht eine Methode zu schreiben bin aber mit dem Benutzerhandbuch kläglich gescheitert. Kennt jemand von euch vielleicht eine passende Methode zum Sortieren von BEs nach dem Attribut Name? Über Hilfe wär ich sehr erfreut. Danke im Voraus! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
pom Mitglied Dipl.-Ing. (FH)
Beiträge: 182 Registriert: 25.08.2006
|
erstellt am: 23. Jan. 2009 07:34 <-- editieren / zitieren --> Unities abgeben: Nur für Binford6100
Hallo, hast du einen "Puffer als Sortierer" oder einen Sortierer vor der Station? Bei einem Sortierer kannst du nur nach real konvertierbaren Kriterien sortieren. Beispiel: Bearbeitungszeit. Der Name ist vom Typ String und nich konvertier bzw. sortierbar. Ggf. hilft es eine Bezeichnung im Format integer zuverwenden, ein Freies Attribut! Zum Beispiel: @.Bezeichnung. Diese Bezeichnung kann in abhängigkeit des Namens gesetzt werden z.B. über die Verknüpfung mit einer Tabelle. Die Verknüpfung passiert mit Hilfe einer MEthode vor eintritt in den Sortierer. Hier ein Beispiel wie das aussehen könnte:
Code:
Methode: Is Do Tabelle.ZeigerY:=1; Tabelle.finde(@.Name) @.Bezeichnung:=Tabelle["Bezeichnung",Tabelle.ZeigerY]; end; Tabelle: Name:String | Bezeichnung:Integer Zylinder | 1 Quader | 2 Dreieck | 3
Wenn du keinen Sortierer verwendest, wird es komplizierter. Aber auch hier für gibts in Plant Sim eine Lösung.
Ersetze den Puffer durch ein Lager. Setze X-Dim = 1 und Y-Dim = 999999. Dadurch ereichst du das alle BEs, wie in einem Puffer, in einer "Reihe" gelagert werden. Ziehe eine Tabelle in die Netzwerkoberfläche. Keine weiteren Änderungen nötig. Erstelle eine Methode mit folgendem Inhalt:
Code:
(a,b:String) -- Uninteresant, Variablen die vom Trigger übermittelt werden is i:Integer; do Lager.Inhaltsliste(Tabelle); -- Kopiert den Inhalt des Lagers in eine Tabelle Tabelle.sortieren(1,"auf"); -- Sortiert die Tabelle If Tabelle[1,1] /= Void then -- Wenn ein Teil im Lager Tabelle[1,1].umlagern(Lager.Nf); -- Dann Lager das erste aus der Tabelle auf den Nachfolger um end; end;
Nun brauchst du noch einen Trigger. Dort gibts du Periodisch wiederholen an und die Periodenlänge gibt an in welchem Abstand die BEs den Puffer verlassen können. (Beispiel: 5:00, alle 5 min verlässt ein BE das Lager, falls sich ein BE im Lager befindet). Im Trigger musst du unter Aktion die Methode auswählen, die du vorher erstellt hast. Das Ganze hab ich dir als Bild angehängt. MFG Patrick
[Diese Nachricht wurde von pom am 23. Jan. 2009 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Binford6100 Mitglied Student
Beiträge: 8 Registriert: 22.01.2009
|
erstellt am: 23. Jan. 2009 10:16 <-- editieren / zitieren --> Unities abgeben:
|
Binford6100 Mitglied Student
Beiträge: 8 Registriert: 22.01.2009
|
erstellt am: 23. Jan. 2009 11:48 <-- editieren / zitieren --> Unities abgeben:
Habe die erste Variante mit den Sortierer mal ausprobiert und sie funktioniert leider nicht so ganz. Es kommt immer die Meldung das das BE im Sortierer nicht einsortiert werden kann. Das BE '.Fabrik_V.Fertigung.Sortierer4' kann auf dem Objekt '.BEs.Fördergut:23' nicht einsortiert werden.
Code Is Tabelle : table; Name : string; Bezeichnung : integer; Do Tabelle.ZeigerY:=1; Tabelle.finde(@.Name); @.Bezeichnung:=Tabelle["Bezeichnung",Tabelle.ZeigerY]; end; Und die Tabelle sieht so aus: string0 I integer1 string Name I Bezeichnung 1 Bogen I 1 2 Bogen2 I 2 3 Bogen3 I 3 Muß der Wert "Bezeichnung" vieleicht als Attribut in einer Reihenfolgeliste gesetzt werden? Die Parameter im Sortierer sind --> Sortierzeitpunkt beim Eintritt nach "Freies Attribut" @.Bezeichnung Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
pom Mitglied Dipl.-Ing. (FH)
Beiträge: 182 Registriert: 25.08.2006
|
erstellt am: 23. Jan. 2009 12:07 <-- editieren / zitieren --> Unities abgeben: Nur für Binford6100
Hallo, Das Attribut "Bezeichnung" muss im BE hinterlegt sein.
Code:
Is Do Tabelle.ZeigerY:=1; Tabelle.finde(@.Name); @.erzeugeAttr("Bezeichnung","integer"); @.Bezeichnung:=Tabelle["Bezeichnung",Tabelle.ZeigerY]; end;
Sortierer wie auf dem Bild einstellen MFG Patrick [Diese Nachricht wurde von pom am 23. Jan. 2009 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Binford6100 Mitglied Student
Beiträge: 8 Registriert: 22.01.2009
|
erstellt am: 23. Jan. 2009 13:03 <-- editieren / zitieren --> Unities abgeben:
Geht leider immer noch nicht. Ich habe beim Sortierer die Methode in die Eingangsteuerung gelegt, da er sie sonst nicht angesprochen hat. Jetzt läuft allesdurch aber die Fehlermeldung ist immernoch die selbe. Das Attribut ist immer 1. Er sucht quasi nicht in der Tabelle nach den Namen um das Attribut zu setzten. Ich hab dir mal nen Bild angehangen. Ich hoffe du erkennst was. Beste Grüße Christian Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Binford6100 Mitglied Student
Beiträge: 8 Registriert: 22.01.2009
|
erstellt am: 23. Jan. 2009 13:06 <-- editieren / zitieren --> Unities abgeben:
|
Binford6100 Mitglied Student
Beiträge: 8 Registriert: 22.01.2009
|
erstellt am: 23. Jan. 2009 13:17 <-- editieren / zitieren --> Unities abgeben:
Ich habe einen grundlegenden Fehler gemacht. Die Methode lag nicht vor den Sortierer. Sorry! Jetzt kommt die Fehlermeldung nicht mehr. Allerdings bin ich mir nicht sicher ob das mit der Vergabe der Attribute richtig funktioniert, da alle BEs bei benutzerdefinierten Attributen den Wert 1 besitzen. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
pom Mitglied Dipl.-Ing. (FH)
Beiträge: 182 Registriert: 25.08.2006
|
erstellt am: 23. Jan. 2009 13:40 <-- editieren / zitieren --> Unities abgeben: Nur für Binford6100
Hallo, die Methode sieht richtig aus. Stell sicher das die Namen in der Tabelle mit den BE-Namen = @.Name wirklich übereinstimmen. Du kannst ja mal überprüfen welche Bezeichnung ausgelesen wird. Füge dafür eine Print Anweisung ein. MFG PAtrick [Diese Nachricht wurde von pom am 23. Jan. 2009 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Binford6100 Mitglied Student
Beiträge: 8 Registriert: 22.01.2009
|
erstellt am: 23. Jan. 2009 13:46 <-- editieren / zitieren --> Unities abgeben:
Ich habe es hinbekommen. Dank dir! Mein Problem war ein aktiver Zeilenindex in der Tabelle. Damit wurde das Attribut Bezeichnung nicht richtig gesetzt. Durch das Sortieren ist mein Rüstaufwand im Jahr um 3% gesunken. Das sieht jetzt gut aus. Ich danke dir nochmal für deine Hilfe. Beste Grüße Christian Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |