TIA SCL E/A Daten in DB

ChrissT

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

ich hab gerade angefangen mit SCL zu programmieren. Leider finde ich nicht genug Hilfe im Netz.

Ich habe gerade folgendes Problem.
Ich habe ein Device mit dem ich über eine Art Mailbox kommunizieren kann. Lege Daten in Output und bekomme das Ergebnis in Input.
Jetzt würde ich gerne die Kommunikation in einen FB schreiben und alle Daten in den dazugehörigen DB packen. Kann mir jemand sagen wie ich die E/A Daten in den DB bekomme? Man kann das sicher mit einer Schleife oder einem SFC machen ich weiss aber nicht wie.
Habe die Daten in einer Variablentabelle benannt und könnte jetzt die Zuweisung schrittweise machen...


E-Adressen -> 256...287
A-Adressen -> 256...287

db1.mb_data_in[0] := mb_data 1
db1.mb_data_in[0] := mb_data 2
db1.mb_data_in[0] := mb_data 3


das kann es aber doch nicht sein oder?

Vielen Dank
 
Für eine S7 300/400 würde es mit einem Blockmove funktionieren. Das ist aber in SCL relativ aufwändig zusammenzusetzen, und lohnt sich darum auch nur bei einer größeren Anzahl an Daten die kopiert werden müssen.

In SCL für Step 7 ging es so, für TIA SCL musst du evtl. die Syntax etwas anpassen.
Code:
VAR_TEMP
    Any_EA : ANY;
    at_Any_EA AT Any_EA : STRUCT
        Id : BYTE;
        DataType : BYTE;
        Length : WORD;
        DbNumber : WORD;
        BytePtr : DWORD;
    END_STRUCT;    
    BlkMovRet : INT;
END_VAR

VAR
    E_Data : ARRAY [0..9] OF WORD;
    A_Data : ARRAY [0..9] OF WORD;
END_VAR

BEGIN
// Any-Pointer zum Lesen zusammenstellen
at_Any_EA.Id       := 16#10;  // Syntax ID
at_Any_EA.DataType := 16#04;  // Datentyp Word, Typ von Quelle und Ziel müssen identisch sein. Da array of word muss es 4 sein
at_Any_EA.Length   := 10;     // Anzahl vom o.g.. Datentyp
at_Any_EA.DbNumber := 0;      // Datenbaustein-Nummer bei E/A/M = Null
at_Any_EA.BytePtr  := INT_TO_WORD(256 * 8); // Speicherbereich, Startadresse z.B. E256.0, mal 8 wegen Bit Adresse
// Bereichskennung einmaskieren 16#81 = E, 16#82 = A
at_Any_EA.BytePtr  := at_Any_EA.BytePtr OR DW#16#81000000; // 16#81 = Bereichskennung E

// Daten mit Blockmove vom Eingangsbereich einlesen
BlkMovRet := BLKMOV(SRCBLK := Any_EA ,DSTBLK := E_Data);


A_Data[0] := 16#ab;
A_Data[1] := 16#cd;



// Any-Pointer zum Schreiben zusammenstellen
at_Any_EA.Id       := 16#10;
at_Any_EA.DataType := 16#04;
at_Any_EA.Length   := 10;
at_Any_EA.DbNumber := 0;
at_Any_EA.BytePtr  := INT_TO_WORD(320 * 8); // Speicherbereich, Startadresse z.B. A320.0, mal 8 wegen Bit Adresse
at_Any_EA.BytePtr  := at_Any_EA.BytePtr OR DW#16#82000000; // 16#82 = Bereichskennung A

// Daten mit Blockmove in Ausgangsbereich schreiben
BlkMovRet := BLKMOV(SRCBLK := A_Data ,DSTBLK := Any_EA);

Du kannst natürlich auch einfach mit einer For-Schleife kopieren, da erschließt sich die Funktion auch besser als bei dem Any-Pointer Gefrickel.
Code:
FOR i := 0 TO 9 DO
    E_Data[i] := EW[256 + (2 * i)];
END_FOR;
 
Zurück
Oben