mal wieder Array + Hochregallager ;-)

sdv

Level-1
Beiträge
17
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

kann mir mal jemand sagen was ich alles falsch gemacht habe? x)
Ich möchte ein 2D-Array als DB115 anlegen. Zum Befüllen, Anfahren etc benötige ich bestimmte Werte, welche im FB15 ermittelt werden sollen. Leider habe ich noch sehr wenig Ahnung vom Programmieren in SCL. Ich dachte mir das wie folgt:

DATA_BLOCK DB115
Belegung : ARRAY [1 .. 7, 1 .. 7 ,1 .. 7, 1 .. 7] OF BOOL ;

BEGIN
END_DATA_BLOCK
FUNCTION_BLOCK fb15
VAR
END_VAR
LABEL
M1;
END_LABEL
VAR_OUTPUT
i:INT:=1;
j:INT:=1;
Zeins:INT;
Zzwei:INT;
END_VAR;
WHILE i<4 DO
j:=1;
WHILE j<8 DO

IF Belegung[i,j]=false THEN
Zzwei:=i+1;
CASE j OF
1: Zeins:=1;
2: Zeins:=2;
3: Zeins:=3;
4: Zeins:=4;
5: Zeins:=5;
6: Zeins:=6;
7: Zeins:=9;
8: Zeins:=10;
END_CASE;
GOTO M1;
END_IF;
j:=j+1;
END_WHILE;
i:=i+1;
END_WHILE;
M1: ;
END_FUNCTION_BLOCK

Vielen Dank schon mal!
 
ohne jetzt weiter drüber nachdenken zu wollen:

ARRAY [1 .. 7, 1 .. 7 ,1 .. 7, 1 .. 7] isn 4D-Array ...

[OT] in einer welt, die mit 1 beginnt möchte ich nicht existieren! [/OT]
 
Zuviel Werbung?
-> Hier kostenlos registrieren
dann heißt das wohl so:
DATA_BLOCK DB115
STRUCT
Belegung:ARRAY [1..7,1..4] OF BOOL;
END_STRUCT
BEGIN
END_DATA_BLOCK



die Abfrage
IF Belegung[i,j]=false THEN
macht mir irgendwie noch Probleme
-> Bezeichner existiert nicht
-> Array-Dimensionen überschritten
-> Ausdruck muss vom Datentyp BOOL sein
 
Zuletzt bearbeitet:
Das Übergeben des Arrays vom DB an den FB funktioniert wohl noch nicht.
Muss ich im DB das als Var_Output definieren? So in die Richtung:

DATA_BLOCK DB115

STRUCT
Belegung:ARRAY [1..7,1..4] OF BOOL;
END_STRUCT

VAR_OUTPUT
Belegung;
END_VAR;

END_DATA_BLOCK


-> Syntaxfehler
 
Zuletzt bearbeitet:
ich glaube so passt es :) jetzt nur noch Hoffen, dass das Programm auch das macht, was ich möchte :-D

DATA_BLOCK DB115
STRUCT
Belegung:ARRAY [1..7,1..4] OF BOOL;
END_STRUCT
BEGIN
END_DATA_BLOCK
FUNCTION_BLOCK fb15
VAR
END_VAR
LABEL
M1;
END_LABEL
VAR_OUTPUT
i:INT:=1;
j:INT:=1;
Zeins:INT;
Zzwei:INT;
END_VAR;
WHILE i<4 DO
j:=1;
WHILE j<8 DO

IF DB115.Belegung[i,j]=false THEN
Zzwei:=i+1;
CASE j OF
1: Zeins:=1;
2: Zeins:=2;
3: Zeins:=3;
4: Zeins:=4;
5: Zeins:=5;
6: Zeins:=6;
7: Zeins:=9;
8: Zeins:=10;
END_CASE;
GOTO M1;
END_IF;
j:=j+1;
END_WHILE;
i:=i+1;
END_WHILE;
M1: ;
END_FUNCTION_BLOCK
 
du hast ein gewaltiges grundlagenproblem!

Code:
*
DATA_BLOCK DB200
    STRUCT
        Belegung : ARRAY[0..6,0..3] OF BOOL;
    END_STRUCT
BEGIN

END_DATA_BLOCK


FUNCTION FC300 : VOID

VAR_TEMP
    i : INT;
    j : INT;

END_VAR

    IF NOT([B][COLOR="Red"]DB200[/COLOR][/B].Belegung[i,j]) THEN
        ;
    END_IF;
    
END_FUNCTION
 
:rolleyes: ich denke auch, dass das als Schleife (und mit Einrückungen) schon viel übersichtlicher aussieht und auch praktikabler ist ...

Gruß
LL
 
du hast ein gewaltiges grundlagenproblem!
ich weiß :-D habe hier war zig Bücher rumliegen, aber keines hilft mir so richtig bei der Einarbeitung. Wie habt ihr euch das Fachwissen angeeignet? Mein Prof spricht alles nur kurz an aber das reicht nicht für mein Projekt :-|

aber soweit hab ich das jetzt schon mal verstanden ^^

kann ich die Werte i und j auch einem symbolischen Zähler "Zähler 1" übergeben? Bzw. wie mache ich das?
 
die ganze Regalgeschichte funktioniert bereits schon halbwegs, allerding ist die Regalbelegung derzeit noch durch ein riesigen Graphen realisiert mit zig Abzweigungen etc.
Das treibt euch wahrscheinlich die Tränen in die Augen :rolleyes:
Darum bemühe ich mich momentan um die Optimierung meines Programmes und fand das mit einem 2D-Array ganz nett.
 
ich weiß :-D habe hier war zig Bücher rumliegen, aber keines hilft mir so richtig bei der Einarbeitung. Wie habt ihr euch das Fachwissen angeeignet? Mein Prof spricht alles nur kurz an aber das reicht nicht für mein Projekt :-|

aber soweit hab ich das jetzt schon mal verstanden ^^

kann ich die Werte i und j auch einem symbolischen Zähler "Zähler 1" übergeben? Bzw. wie mache ich das?

i und j sind ja schon Symbole, schau lieber mal nach, welche Werte die Variablen i und j in Deinem Programm annehmen, dann schaust Du noch nach, ob Dein ARRAY dafür überhaupt Felder hat. Im Zweifelsfall mal Dir das auf Papier auf. Ich weiß dass das völlig veraltet ist, aber manch einem gehen dabei Lichter auf.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das Programm funktioniert in der Simulation soweit, allerdings gehen die Werte für "Zeins" und "Zzwei" verloren, wenn ich den Cursor auf diese setze. Setze ich ihn jedoch auf End_Function gehen alle Werte verloren. Ich denke deshalb kann ich dann in einem anderen FB nicht auf diese zurückgreifen oder sehe ich das falsch?
Was muss ich ändern, damit die Werte nicht gelöscht werden?

Code:
DATA_BLOCK DB200
    STRUCT
        Belegung : ARRAY[1..4,1..7] OF BOOL:=false;  //Start ab 1 statt 0 zur Anpassung an die Lagerplatznummerierung
    END_STRUCT
BEGIN
END_DATA_BLOCK
 
FUNCTION FC300 : VOID
VAR
    i : INT;
    j : INT;
END_VAR
VAR_OUTPUT
    Zeins : INT;
    Zzwei : INT;
END_VAR
i:=1;
j:=1;
REPEAT
    IF DB200.Belegung[i,j]=true THEN
        j:=j+1;
    END_IF;
    IF j>=7 THEN
        j:=1;
        i:=i+1;
    END_IF;
UNTIL DB200.Belegung[i,j]=false
END_REPEAT;
 
  Zeins:=j;                 // bis zu diesem Zeitpunkt stimmen die Werte laut Simulation
  Zzwei:=i;
 
 END_FUNCTION               // ab diesem Schritt fehlen die Werte der Variablen
 
Hallo,
eine Function (also ein FC) "merkt" sich nichts. Das kann nur ein FB.
Wenn du die ermittelten Werte erhalten möchtest, dann müßtest du sie zu IN_OUT-Variablen machen. Damit übergibst du die verantwortung dafür an das aufrufende Programm ...

Gruß
LL
 
Zurück
Oben