Step 7 SFC21 mit SCL, den zu löschenden DB Variabel gestalten

balkanaz

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

ich möchte mit einem SFC21 Datenbausteine löschen. Dabei will ich den zu löschenden DB Variabel gestalten.

Ist das Möglich? Wenn ja, kann mir jemand einen Tipp dazu geben?

Code:
FUNCTION_BLOCK FB130


VAR_TEMP
   Nullbyte                     :BYTE;
   retval                       :INT;
   DB_Nummer                    :INT;   //DB Nummer des zu löschenden WT´s
END_VAR

VAR_Input
   Erste_DB_Nummer              :INT;
   WT_Nr                        :INT;
   WT_loeschen                  :BOOL;
   Alle_WTs_loeschen            :BOOL;
END_VAR

    
    Nullbyte    :=0;
    
    DB_Nummer:=Erste_DB_Nummer + WT_Nr - 1;
    
    
    IF WT_loeschen THEN
        retval := FILL(BVAL := Nullbyte, BLK := p#DB[DB_Nummer].dbx0.0 BYTE 156);
    END_IF
    
    
END_FUNCTION_BLOCK

Vielen Dank im Voraus
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi das hat super geklappt.
Ich habe ein anderes Problem.
Da ich gerne alles in einer SCL Quelle zusammenfassen möchte, würde ich auch gerne folgendes statt in AWL in SCL abfragen:

Code:
    L     30
b001: T     #loop2

      AUF   DB [#DBNR]

      U(  
      L     DBB   10
      L     0
      <>I  
      )    
      =     #Teil_vorh

// Anweisung folgt noch


// erhöhe DB Nummer

      L     #DBNO
      L     1
      +I  
      T     #DBNO

      L     #loop2
      LOOP  b001

      SPA   b003                        //Schleife Fertig

b003: NOP   0
      BEA

Ich möchte gerne von 30 DB´s den Byte 10 in einer Schleife abfragen, weiß da aber nicht genau wie ich vorgehen soll.
So habe ich es bisher versucht:

Code:
 PointerArea: STRUCT  //ANY Struktur anlegen          
        SyntaxID:       BYTE;
        Datentyp:       BYTE;
        Laenge:         WORD;
        DB_Nummer:      WORD;
        Byte_Pointer:   DWORD;
    END_STRUCT;
        ZielDB AT PointerArea: ANY;


        FOR k:= DB_Start_Nr TO DB_Start_Nr + 29 BY 1 DO
    DBNO:= INT_TO_WORD(k);
   
    PointerArea.SyntaxID:= 16#10;  //Vorbelegen der Quell-ANY-Pointer Variablen
    PointerArea.Datentyp:= 16#2;  //Assign values for source pointer
    PointerArea.Laenge:= 16#01;
    PointerArea.DB_Nummer:= DBNO;
    PointerArea.Byte_Pointer:= dw#16#84000050; // Hier soll DBX10.0

IF  ZielDB <> 0 THEN
     j:= k- DB_Start_Nr + 1;
     Umlauf.WT_belegt[j]:=TRUE;
END_IF;
END_FOR;

Die IF Abfrage scheint so nicht zu funktionieren. Ist mein Code überhaupt soweit im Ansatz richtig?
 
Zuletzt bearbeitet:
Hallo,
willst du uns nicht mal unbürokratisch verraten welche SPS Du womit programmierst? Vielleicht kannst Du PEEK verwenden?

Dein SCL-Code sieht aber eher wie Step7 classic aus und daher S7-300/400?

Da müsstest Du so formulieren:
Code:
Ergebnisbyte := WORD_TO_BLOCK_DB(DBNO).DB[Byteadresse]; //so laut Hilfe zu SCL "Indizierter Zugriff auf Datenbausteine"

Ergebnisbyte := WORD_TO_BLOCK_DB(DBNO).DBB[Byteadresse]; //so geht es vermutlich auch

Harald
 
Hallo,
willst du uns nicht mal unbürokratisch verraten welche SPS Du womit programmierst? Vielleicht kannst Du PEEK verwenden?

Dein SCL-Code sieht aber eher wie Step7 classic aus und daher S7-300/400?

Da müsstest Du so formulieren:
Code:
Ergebnisbyte := WORD_TO_BLOCK_DB(DBNO).DB[Byteadresse]; //so laut Hilfe zu SCL "Indizierter Zugriff auf Datenbausteine"

Ergebnisbyte := WORD_TO_BLOCK_DB(DBNO).DBB[Byteadresse]; //so geht es vermutlich auch

Harald

Richtig, ist ne S7-300
Ich bin und bleibe wohl immer ein blutiger Anfänger...
Vielen Dank Harald (y)
 
Zurück
Oben