Hochregallager: First first out in SCL

mays

Level-1
Beiträge
3
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hochregallager: First in first out in SCL

Hallo zusammen,

ich soll für mein Abschlußprojekt ein Hochregallager programmieren. Eigentlich ist es ein Lägerchen. Es hat vier Etagen mit jeweils 4 Ablageplätzen. Nun möchte ich die eingelagerten Teile dem Datum nach wieder auslagern. Hierzu habe ich einen DB 51 angelegt.
Code:
Platz    ARRAY[1..16]            
    STRUCT            
     Gutteil    BOOL    FALSE        // ggf Auswahlkriterium für Gut/schlechtteil
Schlechtteil    BOOL    FALSE        //   
      Belegt    BOOL    FALSE        // Platz frei oder belegt. 
    Chipwert    WORD    W#16#0       // Chipwert. soll auf einen RFID Chip kopiert werdenn    
     Lager_D    DATE_AND_TIME    DT#90-1-1-0:0:0.000  // Das Datum / Uhrzeit worum es geht.      
    END_STRUCT
Das ganze soll in SCL geschrieben sein. Das eigentliche bedienender diversen Ansteuerungen ist schon realisiert. Lediglich das ausfindigmachen des ältesten bzw. ggf auch des jüngsten Teils ist interresant. Achso, hier noch die Pflichtangaben S7 V5.4 315 2DP SCL Ich hoffe ihr könnt mir helfen. Vielen Danke vorab
 
Zuletzt bearbeitet:
Lediglich das ausfindigmachen des ältesten bzw. ggf auch des jüngsten Teils ist interresant.

Hallo,
wäre das dann auch die Frage ? Also quasi : "wie mache ich das ?".
Wenn ja, dann wäre das Folgende dein Weg : Zerlegen des Date_and_Time-Strings in seine Einzel-Bestandteile (wie der genau aufgebaut ist kannst du in der Step7-Hilfe ganz gut nachlesen. Zum Zerlegen gibt es entweder FC's von Siemens oder aber die 2. Möglichkeit - du legst dir auf den DT eine AT-Sicht mit den beschriebenen Einzel-Bestandteilen, die du dann "nur noch" verrechnen mußt.

Kanst du damit etwas anfangen ? Wenn ja, dann können wir dann ggf. an der Stelle weitermachen ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Zum Vergleichen des Datentyps DATE_AND_TIME gibt es in der Siemens Standard-Bibliothek auch entsprechende fertige Funktionen.
Im Ordner IEC-Function-Blocks gibt es dazu die Funktionen "GT_DT", "LE_DT", "EQ_DT", "LT_DT" und "NE_DT". Damit sollte es recht einfach möglich sein in deinem Array den ältesten/neuesten Eintrag zu suchen.

Bei einer Array-Große von nur 16 Elementen kann man dieses noch in jedem Zyklus durchsuchen. Bei größeren Arrays würde es sich anbieten das Array bei jedem neuen Eintrag nach Datum aufsteigend/absteigend sortiert zu halten.
 
Hi,

wird immer 'erst eingelagert' und dann 'ausgelagert'?

Dann würde doch ein einfacher FiFo, bzw. Ringspeicher ausreichen.

Bei einem chaotischen Lager sieht das natürlich anders aus...

Gruss Cliff
 
Hi,

wird immer 'erst eingelagert' und dann 'ausgelagert'?

Dann würde doch ein einfacher FiFo, bzw. Ringspeicher ausreichen.

Bei einem chaotischen Lager sieht das natürlich anders aus...

Gruss Cliff

Nein, es wird nicht abwechselnd gelagert. Das kann durchaus unterschiedlich ablaufen. Also chaotisch.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das kannst du doch trotzdem mit einem Ringpuffer machen...

anderen Falls kannst du natürlich das Lager wunderbar in einem 2-Dim. Array abbilden. Als Zeitstempel kannst einen kompletten Date-Time nehmen, nur ein SysTick oder einfach einen Integer den du bei jeder Einlagerung um 1 inkrementierst. Anschliessend kannst das Array durchsuchen.
 
Hallo Zusammen,

die Hinweise sind bestimmt alle sehr gut. Die Sache ist nur, ich bin ein Neuling in dem Gebiet und habe Recht wenig Ahnung davon was ihr mir erzählt. Wenn es euch also nicht zu viele Umstände macht wäre es toll wenn ihr mir etwas konkreter helfen könnt.

Trotzdem vielen Dank für eure bisherige Hilfe.
 
... Die Sache ist nur, ich bin ein Neuling in dem Gebiet und habe Recht wenig Ahnung davon was ihr mir erzählt. Wenn es euch also nicht zu viele Umstände macht wäre es toll wenn ihr mir etwas konkreter helfen könnt ...

Was hast du denn an den Vorschlägen konkret nicht verstanden ?

Wenn du deine Liste sortieren möchtest, dann gäbe es da z.B. den Algorithmus "Bubblesort". Wenn du "nur" einen bestimmten Eintrag finden möchtest, dann geht eine einfache Suche in einer Schleife (FOR ... TO).
Wenn du Werte vergleichen möchtest, dann geht das am Besten mit solchen, die auch direkt vergleichbar sind (für die SPS). Da ist der zusammengestzen DT-String nicht unbedingt geeignet. Deshalb also den Bestandteil da heraus-extrahieren, den du brauchst. Das "wie" wurde ja schon genannt.

Also ...?

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Zusammen,

die Hinweise sind bestimmt alle sehr gut. Die Sache ist nur, ich bin ein Neuling in dem Gebiet und habe Recht wenig Ahnung davon was ihr mir erzählt. Wenn es euch also nicht zu viele Umstände macht wäre es toll wenn ihr mir etwas konkreter helfen könnt.

Hier mal ein Programmbeispiel welches den ältesten Eintrag in deinem Array finden würde:
Code:
VAR_TEMP
    i : INT;  
    index_aeltester : INT;
    dt_aeltester : DATE_AND_TIME;
END_VAR

    index_aeltester := 1;
    dt_aeltester := Platz[1].Lager_D;

    FOR i := 2 TO 16 DO
        IF (LT_DT(DT1 := Platz[i].Lager_D, DT2 := dt_aeltester)) THEN
            index_aeltester := i;
            dt_aeltester := Platz[i].Lager_D;
        END_IF;
    END_FOR;
 
Zurück
Oben