Zugriff auf einen DB mit ARRAY und STRUCT

Lonne

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


ich habe ein Problem in SCL:

Ich möchte ein vorwärts und rückwärtsschieberegister erstellen.
Es soll auf einen DB zugegriffen werden, dieser besteht aus 500 Feldern, jedes Feld hat die selbe Struktur.
Ich weiß jetzt nicht wie ich den Zugriff auf den DB hinbekomme, ich möchte den DB von außen vorgeben und intern dann damit arbeiten.
Der DB hat die selbe Struktur wie die VAR Kastenfeld (Unten im Beispiel).
Ich bekomme den Zugriff nicht hin, hat einer eine Lösung.

Gruß
Thomas

FUNCTION FC209 : INT
// Bausteinparameter
VAR_INPUT
// Eingangsparameter
SR_DB : WORD;
BOX_START :INT;
BOX_TARGET : INT;
ANZ_BOX :INT;
DEL : BOOL;
VOR : BOOL;
L_NR :INT;
END_VAR

VAR_TEMP
// temporäre Variablen
ANZ : INT;
END : INT;
ANFANG : INT;
START :INT;
ZIEL : INT;
KASTENFELD : ARRAY [1..500] OF STRUCT
Date_f_p : WORD; // DATE forming/pouring
time_of_forming : WORD; // forming TIME
time_of_Pouring : WORD; // poring TIME
BITS1 : WORD; // Bits
BITS2 : WORD;
MOW : BYTE; // Modellchange
MOK : BYTE; // Modelltag A-Z 1..26
END_STRUCT;


END_VAR

// ********** Anweisungsteil *********************
ANZ := ANZ_BOX;
START := BOX_TARGET;
ZIEL := START;
// INIT



IF VOR = 1 THEN
// Wenn Vor eins gesetzt schiebe vorwärts ;

END := BOX_TARGET + ANZ;
WHILE END <> START DO
// Anweisungsteil
kastenfeld[END] := kastenfeld[END-1]; hier liegt mein Problem
END:=END-1;
;
END_WHILE;
ELSIF VOR = 0 THEN
// anderfalls schiebe rückwärts ;
ANFANG := BOX_TARGET - ANZ;
WHILE ANFANG <> ZIEL DO
// Anweisungsteil
kastenfeld[ANFANG] := kastenfeld[ANFANG-1]; hier liegt mein Problem
ANFANG:=ANFANG+1;

;
END_WHILE;
;
ELSE
// Anweisungsteil_ELSE
;
END_IF;



FC209 := 1;

END_FUNCTION
 
Kastenfeld ist aber eine Temp bei dir, das geht schief!
Für ein Temp ist das Array dann wahrscheinlich auch zu groß, das frist eine normale S7-SPS evtl. ohnehin nicht.
Was genau willst du machen?
Du könntest von außen einen DB (Block-DB) ans IN_OUT vorgeben oder eine Struct (deine Struckt in diesem DB, dann diese Struct als IN_OUT des FC definieren und von Außen anlegen). Probier mal, könnte so gehen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Ralle,

Kastenfeld ist nur als Platzhalter gedacht.
Von außen wird der DB angeschrieben, dieser hat die Struktur wie das Kastenfeld.
Weiter wird von außen die Kastennummer die Ziel Kastennummer und die Länge, also wie viele Kästen geschoben werden sollen angeschrieben. ( 4Kasten im DB, 8 Kasten im DB ist das Ziel und 10 Kästen sollen geschoben werden.
Ich möchte also mit dem DB zugriff das Kastenfeld ersetzen. So war die Planung ;-)

Gruß
Thomas
 
Kannst Du das Ziel noch einmal verständlicher formulieren?

Soll jetzt nur um 1 vor- und zurückgeschoben werden, oder sollen Blöcke vom Quellbereich in einen Zielbereich geschrieben werden.
Sind Quelle und Ziel immer im gleichen DB?
 
Hallo Tigerente,

also:
ich gebe von außen den Kasten der geschoben werden soll vor z.B. Kasten 6 im Schieberegister ( Feld 6 im Array)
dann sage ich der Ziel Kasten soll die 8 sein also Feld 8 im Array, nun hängt es von der Anlage ab, vieviele Kästen geschoben werden sollen.
Nehmen wir an 10 Stück. Dann soll folgendes passieren:
Der Kasten 16 wird auf 17 kopiert 15 auf 16 .... 8 auf 9 und 6 auf 8 kopiert, und der Kasten 6 wird inhaltlich gelöscht, somit können wir die Produktion verfolgen.
Es wird nur in einem DB geschrieben.

Gruß
Thomas
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Dann würde ich für die Struktur ein UDT anlegen. IM DB gibt es dann ein Array von dem UDT. Dann stören spätere Änderungen die Funktion des SCL-Bausteins nicht.

Etwa so: (ungeprüft)

Code:
FUNCTION Schieben:VOID
VAR_INPUT
    Vor : BOOL;
    Quellfeld : INT;
    Zielfeld : INT;
    Anzahl : INT;
END_VAR
VAR_IN_OUT
    Kastenfeld:ARRAY[1..500]OF UDT_irgendwas;
    Start : BOOL;
END_VAR
VAR_TEMP
    ii : INT;
END_VAR
BEGIN
IF Start THEN    
    IF Vor THEN
        FOR ii := Zielfeld + Anzahl TO Zielfeld BY -1 DO          
            Kastenfeld[ii+1] := Kastenfeld[ii];    
        END_FOR;
        Kastenfeld[Zielfeld] := Kastenfeld[Quellfeld];
    ELSE
        FOR ii := Zielfeld TO Zielfeld + Anzahl DO  
            Kastenfeld[ii] := Kastenfeld[ii-1];
        END_FOR;
        Kastenfeld[Zielfeld+Anzahl] := Kastenfeld[Quellfeld];
    END_IF;
    Start := FALSE;
END_IF;
END_FUNCTION

Die Grenzen sollten auch noch geprüft werden, damit es keine indirekten Zugriffe auf nicht deklarierte Bereiche gibt...
 
Beim Rückwärtsschieben war glaube ich "Müll" drin. So wäre es vmtl .korrekt:

Code:
FUNCTION Schieben:VOID
VAR_INPUT
    Vor : BOOL;
    Quellfeld : INT;
    Zielfeld : INT;
    Anzahl : INT;
END_VAR
VAR_IN_OUT
    Kastenfeld:ARRAY[1..500]OF UDT_irgendwas;
    Start : BOOL;
END_VAR
VAR_TEMP
    ii : INT;
END_VAR
BEGIN
IF Start THEN    
    IF Vor THEN
        FOR ii := Zielfeld + Anzahl TO Zielfeld BY -1 DO          
            Kastenfeld[ii+1] := Kastenfeld[ii];    
        END_FOR;
        Kastenfeld[Zielfeld] := Kastenfeld[Quellfeld];
    ELSE
        FOR ii := Zielfeld TO Zielfeld - Anzahl BY -1 DO   
            Kastenfeld[ii] := Kastenfeld[ii-1];
        END_FOR;
        Kastenfeld[Zielfeld] := Kastenfeld[Quellfeld];
    END_IF;
    Start := FALSE;
END_IF;
END_FUNCTION
 
Hallo!

Also wenn ich indirekt auf eine Struktur zugreifen möchte, gebe ich auch immer die Komponenten mit an. In deinem Fall wäre das dann:
Code:
KASTENFELD[i].Date_f_p := KASTENFELD[i-1].Date_f_p;
So habe ich es bisher immer gemacht, ob man mit :
Code:
KASTENFELD[i]
gleich alle Komponenten anspricht wäre auch mir neu und ich hab mir bisher immer die Finger wund geklopft ;).

Reden wir hier von Step7 V5.5 SCL V5.3 oder von TIA ??? Meine Aussage bezieht sich auf Step7!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
ich kapier die aufgabestellung nicht!!!!

Array[1..500] of UDT_Daten // kapiert
Start // kapiert
Quell_Daten // welches UDT_Daten verschoben werden soll kapiert
und jetzt wird es ungenau.....
Ziel //soll die Quelle auf das Ziel kopiert werden und dieses dadurch gelöscht werden?
//sollen alle bis zur quelle verschoben werden?
//sollen alle ab der Quelle nach hinten verschoben werden und die dadurch auf einen Platz über 500 kommenwürden gelöscht?

Zitat: Der Kasten 16 wird auf 17 kopiert 15 auf 16 .... 8 auf 9 und 6 auf 8 kopiert, und der Kasten 6 wird inhaltlich gelöscht, somit können wir die Produktion verfolgen.

bei einer Produktions-/Datenfassung schiebt man doch normalerweise alle daten um eins nach hinten (letzte ergebniss wird gelöscht) und das neue tritt an Position eins. kommen fünf oder zehn neue Datenpackete wird dieses eben 5/10mal gemacht.

Vieleicht ist es auch nur einfach zu spät für mich :rolleyes:.

Fanta
 
Zuletzt bearbeitet:
Zurück
Oben