Step 7 SCL: indirekte adressierung

Sickone4

Level-2
Beiträge
68
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute

ich stehe vor folgendem Problem:

ich habe zwei datenbausteine in welchen jede menge werte stehen, nach bestimmten strukturen.
diese enthalten wiederzum werte etc und die will ich prüfen... standard also.

mein problem besteht darin, dass ich nicht weiß, wie ich die adressierung anständig hinbekomme.

Code:
IO_AppPos : array[1..52] of INT
      
FOR i:=1 TO 52 DO

    IF i = [COLOR=#800080]"DB_Apps"[/COLOR].App[COLOR=#ff0000]01[/COLOR].AppOrigPos THEN       
        IO_AppPos[i] := "DB_Apps".App[COLOR=#ff0000]01[/COLOR].AppNr;     
    END_IF;
            
    IF i = [COLOR=#800080]"DB_Apps"[/COLOR].App02.AppOrigPos THEN       
        IO_AppPos[i] := "DB_Apps".App[COLOR=#ff0000]02[/COLOR].AppNr;     
    END_IF;

END_FOR;

FOR i:=1 TO 52 DO

    IF [COLOR=#800080]"DB_AnlKonfig"[/COLOR].Apps.App[COLOR=#ff0000]01[/COLOR] = true THEN
                
        [COLOR=#800080]"DB_Apps"[/COLOR].App[COLOR=#ff0000]01[/COLOR].AppVorhanden := [COLOR=#000000]true[/COLOR];        
    ELSE        
        [COLOR=#800080]"DB_Apps"[/COLOR].App[COLOR=#ff0000]01[/COLOR].AppVorhanden := [COLOR=#000000]false[/COLOR];
            
    END_IF;

END_FOR;

beide schleifen habe ich abgekürzt auf zwei einträge. da stehen aktuell 52 drin, was mir aber zu viel und zu umständlich ist!
prinzipiell geht es um die indizes die ich ro markiert habe. was ich möchte ist -> z.B. "DB_Apps".App[x].AppOrigPos. kann ich das irgendwie realisieren, ohne fehler :D

gruß sven
 
Hallo,
das geht deshalb nicht, weil der DB_Apps kein Array beinhaltet sondern die App01 bis App52 als einzeln definierte Strukturen.
Du müßtest den DB also umdefinieren.
Andere Alternative wäre : du nimmst den DB selbst als IN_OUT-Parameter für deinen Baustein und legst darauf eine AT-Sicht, die ihn als Array1..52] of struct interpretiert.

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Variablennamen kann man sich in SCL nicht zusammenbasteln, weil das compilierte Programm kennt die Variablennamen nicht.

Man kann aber Elemente von Arrays indiziert ansprechen, z.B. "DB_Apps".App.AppOrigPos
Dazu mußt Du "einfach nur" die Deklarationen Deiner Strukturen so ändern, daß überall da wo Du indiziert zugreifen willst auch ein Array ist. Daß also statt App01.x, App02.x ... App ein ARRAY OF STRUCT oder ARRAY OF BOOL oder ARRAY OF ... ist.

Harald
 
Hallo,
Es gibt auch die Konvertierungsfunktion "Word_to_Block_DB()".
Mit dieser lassen sich auch Datenblöcke ohne Array in SCL mit einer For Schleife über indirekte Adressierung bearbeiten.
 
Danke für die Antworten hat super geholfen. (Umgestellt auf Arrays im DB)

Die word_to_block_db Funktion war in diesem fall nicht nutzbar!
 
Zurück
Oben