Grimsey
Level-2
- Beiträge
- 543
- Reaktionspunkte
- 32
-> Hier kostenlos registrieren
Hallo zusammen,
ich muss innerhalb der SPS Daten aus 28 Datenbausteinen auslesen. Diese Datenbausteinen bilden ein Lager ab und beinhalten den Fachinhalt (Palettendaten 80 Byte) und einen Fachstatus (4 Byte).
Innerhalb der Datenbausteine sind 2 Arrays (X und Y) angelegt die von 1..61 (X) und 1..12 (Y) laufen. Auf Grund der daraus resultierenden Größe der DBs sind die 28 Datenbausteine in 7 4er Gruppen angelegt. Die Bausteinnummern laufen von 111...114, 121..124, 131..134 und so weiter.
Ich benötige nun an verschiedenen Stellen eine Funktion, die mir auf Grund der Koordinaten sowohl die Palettendaten als auch den Status eines Faches zurückliefert.
Es gibt aber auch Anwendungsfälle, in denen das gesamte Lager durchsucht werden muss, d.h. der Inhalt aller Fächer aller 28 Datenbausteine muss der Reihe nach angeschaut und ausgewertet werden.
Als Ausgangsvariable wird eine Fachnummer übergeben, die sich aus den Koordinaten zusammensetzt (Regal, X, Y und Z [das Lager hat 2 Fachtiefen).
Ich habe die Suchroutine nun so gestaltet, dass ich mit Hilfe von 4 FOR-Schleifen alle Datenbausteine durchlaufe, den Fachstatus auslese und anschließend die Daten auswerte. Klappt prinzipiell wirklich gut. Da Problem ist allerdings die Laufzeit der CPU. Zum Einsatz kommt in diesem Fall eine 417-4. Das Durchlaufen der Schleife mit Auslesen der Fachdaten treibt die Zykluszeit allerdings auf rund 110 ms nach oben.
Ich bin nun auf der Suche nach einer Möglichkeit, die Suchroutine zu optimieren/zu verändern.
Hat hier jemand vielleicht einen Tipp, wie man dies effektiv bewerkstelligen bzw. wo man noch etwas optimieren kann?
Hier einmal ein Auszug aus dem bisherigen Code
ich muss innerhalb der SPS Daten aus 28 Datenbausteinen auslesen. Diese Datenbausteinen bilden ein Lager ab und beinhalten den Fachinhalt (Palettendaten 80 Byte) und einen Fachstatus (4 Byte).
Innerhalb der Datenbausteine sind 2 Arrays (X und Y) angelegt die von 1..61 (X) und 1..12 (Y) laufen. Auf Grund der daraus resultierenden Größe der DBs sind die 28 Datenbausteine in 7 4er Gruppen angelegt. Die Bausteinnummern laufen von 111...114, 121..124, 131..134 und so weiter.
Ich benötige nun an verschiedenen Stellen eine Funktion, die mir auf Grund der Koordinaten sowohl die Palettendaten als auch den Status eines Faches zurückliefert.
Es gibt aber auch Anwendungsfälle, in denen das gesamte Lager durchsucht werden muss, d.h. der Inhalt aller Fächer aller 28 Datenbausteine muss der Reihe nach angeschaut und ausgewertet werden.
Als Ausgangsvariable wird eine Fachnummer übergeben, die sich aus den Koordinaten zusammensetzt (Regal, X, Y und Z [das Lager hat 2 Fachtiefen).
Ich habe die Suchroutine nun so gestaltet, dass ich mit Hilfe von 4 FOR-Schleifen alle Datenbausteine durchlaufe, den Fachstatus auslese und anschließend die Daten auswerte. Klappt prinzipiell wirklich gut. Da Problem ist allerdings die Laufzeit der CPU. Zum Einsatz kommt in diesem Fall eine 417-4. Das Durchlaufen der Schleife mit Auslesen der Fachdaten treibt die Zykluszeit allerdings auf rund 110 ms nach oben.
Ich bin nun auf der Suche nach einer Möglichkeit, die Suchroutine zu optimieren/zu verändern.
Hat hier jemand vielleicht einen Tipp, wie man dies effektiv bewerkstelligen bzw. wo man noch etwas optimieren kann?
Hier einmal ein Auszug aus dem bisherigen Code
Code:
VAR_TEMP
i: INT;
j: INT;
tX: INT;
tY: INT;
tZ: INT;
tRegal: INT;
tFachnummer: DINT;
tleer: ARRAY[1..15] OF INT;
tbelegt: ARRAY[1..15] OF INT;
tleer_gesperrt: ARRAY[1..15] OF INT;
tbelegt_gesperrt: ARRAY[1..15] OF INT;
END_VAR
VAR
tPalettenDaten: "UDT_Palette";
tFachDaten: "UDT_Facheigenschaften";
END_VAR
BEGIN
// Variablen zurücksetzen
i:=0;
FOR i:= 1 TO 15 DO
tleer[i] := 0;
tleer_gesperrt[i] := 0;
tbelegt[i] := 0;
tbelegt_gesperrt[i] := 0;
END_FOR;
tRegal:=0;
tX:=0;
tY:=0;
tZ:=0;
FOR tRegal := 1 TO 14 BY 1 DO
FOR tX := 1 TO 61 BY 1 DO
FOR tY := 1 TO 12 BY 1 DO
FOR tZ := 1 TO 2 BY 1 DO
// Fachnummer erstellen und an FC übergeben
FC_KonvertKoordinaten(iRegalnummer := tRegal
,iX := tX
,iY := tY
,iZ := tZ
,oFachnummer := tFachnummer
);
// FC gibt als Rückgabewert die PalettenDaten und den Fachstatus zurück
FC_FachAuslesen(iFachnummer := tFachnummer// IN: DINT
,iZielPalettenDaten := tPalettenDaten // IN: ANY
,iZielFachDaten := tFachDaten // IN: ANY
); // VOID
// Fachstatus auslesen und Fächer mit den verschiedenen Zuständen zählen
IF tFachDaten.Belegt = false THEN
IF tFachDaten.Gesperrt = false THEN
tleer[tRegal] := tleer[tRegal] + 1;
ELSE
tleer_gesperrt[tRegal] := tleer_gesperrt[tRegal] + 1;
END_IF;
ELSE
IF tFachDaten.Gesperrt = false THEN
tbelegt[tRegal] := tbelegt[tRegal] + 1;
ELSE
tbelegt_gesperrt[tRegal] := tbelegt_gesperrt[tRegal] + 1;
END_IF;
END_IF;
END_FOR;
END_FOR;
END_FOR;
END_FOR;