Step 7 DB Aufruf in S7 SCL

SAB2002

Level-2
Beiträge
50
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo alle zusammen,
erst bitte ich um Entschuldigung für meine deutsche Sprache, da ich Ausländer bin.
Ich programmiere gerade in S7 SCL eine Funktion mit Eingang TYP-BLOCK_DB.Dazu gibt's DB mit UDT-Structure: lParamA/TYP DINT und lParamB/TYP DINT. Wie kann ich die Werte aus DB(z.b. DB111) mit UDT-Structure für weitere Bearbeitung in SCL-Code aufrufen? Ich bin komplett Newbie in SCL. Danke im Voraus.
 
Das könnte so aussehen:

Code:
VAR_IN_OUT
    ioData : UDT1;
END_VAR

BEGIN

ioData.ParamA := ioData.ParamB;

Beim Aufruf des SCL-Bausteins deklarierst Du dann den DB mit der Struktur an der Schnittstelle.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke. Aber ich brauche die Werte z.b DB111.Test[Index].lParamA und DB111.Test[Index].lParamB (Test ist ARRAY[0..45] von UDT1)über
VAR_IN
DB_Data : BLOCK_DB;
END_VAR
eingeben
 
Zuletzt bearbeitet:
Dann machste es so:
Code:
VAR_IN_OUT
    ioData : ARRAY [0..45] OF UDT1;
END_VAR

BEGIN

ioData[0].ParamA := ioData[45].ParamB;

Den Typ BLOCK_DB sollte man nur benutzen wenn es wirklich garnicht mehr anders geht.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Mit BLOCK_DB kannst du deinen DB nur noch anonym über die Adressen ansprechen, denn der Übersetzer kann ja nicht wissen welchen DB mit welcher Struktur du ihm später übergibst.

D.h. du kannst die Werte im DB nur noch fest mit:
Code:
DB_Data.DD0 := 123;   // 123 an Datendoppelwort 0 im DB schreiben
oder mit variabler Adresse mit:
Code:
Index := 100;
DB_Data.DD[Index] := 123;
ansprechen.

Du hast keine Typüberprüfung, und nachvollziehen was dort passiert kann auch keiner.
Darum würde ich BLOCK_DB nur verwenden wenn es nicht anders geht. Aber hier geht es anders, und besser.
 
OK. Dann die Frage
Wenn ich weiter in SCL-Code bearbeiten möchte z.b.Ergebniss:= DB111.Test[Index].lParamA*DB111.Test[Index].lParamB, wie sieht es aus?
Ich brauche nicht an DB schreiben, sonder v. DB lesen
 
Also dann mal komplett.

Du hast einen UDT
Code:
TYPE UDT1
    STRUCT
        lParamA : DINT;
        lParamB : DINT;
    END_STRUCT
END_TYPE
Und einen Datenbaustein DB111 in dem ein Array of UDT liegt:
Code:
DATA_BLOCK DB111
    STRUCT
        Test: ARRAY[0..45] OF UDT1;
    END_STRUCT
BEGIN
END_DATA_BLOCK

Dann willst du eine Funktion die mit Daten aus diesem UDT etwas (hoffentlich sinnvolleres) berechnet
Code:
FUNCTION FC100 : VOID

VAR_INPUT
    ioData : ARRAY [0..45] OF UDT1;
END_VAR

VAR_TEMP
    Index : INT;
    Ergebnis : DINT;
END_VAR

BEGIN
    Index := 10;
    Ergebnis := ioData[Index].lParamA * ioData[Index].lParamB;
END_FUNCTION

Wenn du diesen FC aufrufst, musst du ihm als Parameter dein Array in dem DB übergeben
Code:
FUNCTION FC1 : VOID
BEGIN
    FC100( ioData := DB111.Test );
END_FUNCTION

Wenn du dir jetzt überlegst, einen weiteren DB (z.B. 1000) mit dem gleichen Array anzulegen, musst du den Aufruf anpassen:
Code:
FC100( ioData := DB1000.Test );

Ich würde allen FCs, UDTs und DBs ein Symbol geben, und dann anstelle mit den Nummern mit dem Symbol arbeiten.
 
Danke erstmals. Quelle wird ,klar, geschützt und DB kann im verschiedenen Projekt verschiedenen Nummern haben (auch UDT). Deswegen es muß parametriert als VAR_INPUT, und nicht in SCL-Code selbst anzupassen.Also Quelle muß universell für verschiedene DB mit UDT nutzbar sein.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Alles Dir genannten Hilfen waren so gegeben, dass der Baustein nur mit lokalen Variablen arbeitet und daher bibliotheksfähig ist.
Wenn Du wie empfohlen symbolisch programmierst, spielen die absoluten Adressen von UDT / DB keine Rolle mehr.
Der Aufruf in KOP funktioniert genau wie in AWL. Schnittstelle beschalten und fertig. Genauso wie Thomas das beschrieben hat.
Am besten Du probierst erstmal damit etwas...
 
Zurück
Oben