ARRAY mit SCL durchsuchen oder evtl anders

spsguru

Level-1
Beiträge
2
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo liebe SPS Freunde,

Praktische Aufgabenstellung: Programmierung eines Hochregallagers, mit Unterschiedlichen Teilen, 0-->kein Teil, 1-->Schwarz Plasik, 2-->weiß Plastik, 3-->Metall. Lagerplatz ohne Sensor, Lagerplätze sind in einem 2 Dimensionalen Array aufgenommen.
Info: (Chaotische Lagerhaltung)

Unser Problem: Wie durchsuche ich ein Array auf den nächsten freien Lagerplatz, und wie finde ich ein bestimmtes Bauteil beim Auslagern.

Mit freundlichen Grüßen
spsguru
 
Na ...
Dafür ist doch SCL wie gemacht ...
Code:
meineReihe := 0 ;
meineSpalte := 0 ;
 
for i := 1 to Anzahl_Reihen by 1 do
   for j := 1 to Anzahl_Spalten by 1 do
      if Speicher [i,j] = 0 then 
         meineReihe := i ;
         meineSpalte := j ;
         // und was du sonst noch so tun willst
         exit ; exit ;
      end_if ;
   end_for ;
end_for ;
Gruß
Larry
 
Danke

Hallo,
Danke für die Hilfe ich habe mich dannn für eine while Schleife entschieden.


FUNCTION FC80 : BOOL
VAR_INPUT
nr_ges:INT;
Lager:ARRAY[1..5,1..3]OF INT;
END_VAR

VAR_OUTPUT
x_pos:INT;
y_pos:INT;


END_VAR



VAR_TEMP
// temporäre Variablen
x:INT;
y:INT;
gefunden:BOOL;

END_VAR



BEGIN
// Anweisungsteil

x:=2;
y:=1;
gefunden:=false;

WHILE NOT(gefunden)AND (x<6) DO

y:=1;
WHILE NOT(gefunden)AND (y<4) DO
// Vergleich von nr_ges mit einem Element von Lager

IF Lager[x,y] = nr_ges THEN
// Element gefunden
gefunden:= true;
x_pos:= x;
y_pos:= y;
ELSE
// Element nicht gefunden
y:=y+1;
END_IF;
END_WHILE;
x:=x+1;
END_WHILE;
FC80 := gefunden;
END_FUNCTION

VG spsguru
 
Larrys Lösung mit zwei for-Schleifen ist wesentlich eleganter und eigentlich auch üblicher!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich empfehle, beim Einlagern einen Zeitstempel zu setzen und beim Auslagern den Lagerplatz mit dem ältesten Teil der passenden Kriterien auszuwählen.

So stellst du sicher, dass du nicht ein Teil über Jahre im Hochregal liegen hast.
 
Na ...
Dafür ist doch SCL wie gemacht ...
Code:
meineReihe := 0 ;
meineSpalte := 0 ;
 
for i := 1 to Anzahl_Reihen by 1 do
   for j := 1 to Anzahl_Spalten by 1 do
      if Speicher [i,j] = 0 then 
         meineReihe := i ;
         meineSpalte := j ;
         // und was du sonst noch so tun willst
         exit ; exit ;
      end_if ;
   end_for ;
end_for ;
Gruß
Larry

Und das mit den 2 exits nacheinander funktioniert in Scl? Woher weiss den der compiler das er nach dem ersten exit nicht schon gleich rausspringen soll? (das ganze hier ist eine Frage, nicht das jetzt jemand meint es wäre falsch!). Ist das in Pascal dann auch so möglich?
 
@Jochen:
Bei dem Code-Beispiel handelt es sich natürlich um einen "Quick'n'dirty"-Code - also nicht getestet.
Ich muß dir gestehen, dass ich das mit den 2 Exit's hintereinander aus meinem Verständnis der Beschreibung des Befehls geschrieben habe. Ich kann das jetzt also leider nicht (so oder so) belegen. Das gleiche Problem gibt es aber mit den ineinander verschachtelten While's - wenn auch vom TE unberücksichtigt.

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Und das mit den 2 exits nacheinander funktioniert in Scl? Woher weiss den der compiler das er nach dem ersten exit nicht schon gleich rausspringen soll?
Der Compiler lässt zwar die Eingabe zu, allerdings wird das zweite Exit, wie Du auch vermutet hast, ignoriert.
 
Nur der erste Exit wird ausgeführt.
Und danach wird der erste FOR loop weiterfahren, was wohl nicht gemeint ist.
Ich wurde ein BOOL "gefunden" setzen, und damit auf beide FOR loops ausbrecken.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hier ist ein Beispiel mit zwei FCs.
"Platz_finden" und "Teil_finden".

Code:
(*-----------------------------------------------------
  -----------------------------------------------------*)
TYPE "UDT_Platz_Teil"
    STRUCT
        Platz_status : INT ; // 0-->kein Teil, 1-->Schwarz Plasik, 2-->weiß Plastik, 3-->Metall.
        Teil_serienummer : DINT ;
        Teil_Zeitstempel : TOD ;
    END_STRUCT
END_TYPE
 
(*-----------------------------------------------------
  -----------------------------------------------------*)
DATA_BLOCK "Regal_Lager"
    STRUCT
        Reihe : ARRAY[0..10] OF STRUCT
            Regal: ARRAY[0..8] OF "UDT_Platz_Teil" ;
            END_STRUCT ;
    END_STRUCT ;
BEGIN
END_DATA_BLOCK
 
(*-----------------------------------------------------
  -----------------------------------------------------*)
FUNCTION "FC_Leer_Platz_finden" : VOID
VAR_OUTPUT
    Platz_gefunden : BOOL ;
    Reihe : INT ;
    Regal : INT ;
END_VAR 
VAR_TEMP
    i , j : INT ;
END_VAR
Platz_gefunden := FALSE ;
Reihe := 0 ; 
Regal := 0 ;
FOR i:=0 TO 10 BY 1 DO
    FOR j:=0 TO 8 BY 1 DO
        IF ("Regal_lager".Reihe[i].Regal[j].Platz_status=0) THEN
            Platz_gefunden:=TRUE ;
            Reihe:=i ;
            Regal:=j ;
        END_IF ;
        IF Platz_gefunden THEN
          EXIT ;
        END_IF ;
    END_FOR ;
    IF Platz_gefunden THEN
        EXIT ;
    END_IF ;
END_FOR ;
END_FUNCTION
 
(*-----------------------------------------------------
  -----------------------------------------------------*)
FUNCTION "FC_Teil_finden" : VOID
VAR_INPUT
    SucheTeil : DINT ;
END_VAR
VAR_OUTPUT
    Teil_gefunden : BOOL ;
    Reihe : INT ;
    Regal : INT ;
END_VAR 
VAR_TEMP
    i , j : INT ;
END_VAR
Teil_gefunden := FALSE ;
Reihe := 0 ; 
Regal := 0 ;
FOR i:=0 TO 10 BY 1 DO
    FOR j:=0 TO 8 BY 1 DO
        IF ("Regal_lager".Reihe[i].Regal[j].Teil_serienummer=SucheTeil) THEN
            Teil_gefunden:=TRUE ;
            Reihe:=i ;
            Regal:=j ;
        END_IF ;
        IF Teil_gefunden THEN
          EXIT ;
        END_IF ;
    END_FOR ;
    IF Teil_gefunden THEN
        EXIT ;
    END_IF ;
END_FOR ;
END_FUNCTION

edit: Es gabe ein NOT zu viel
 
Zuletzt bearbeitet:
Zurück
Oben