Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Ergebnis 1 bis 9 von 9

Thema: Pointer in SCL ?

  1. #1
    Registriert seit
    08.01.2007
    Ort
    Dülmen
    Beiträge
    393
    Danke
    58
    Erhielt 24 Danke für 17 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    ich möchte eigentlich nur zyklisch 20 Datenwörter umlaufend füllen...

    Aber die SCL Hilfe hat mir unter "Pointer" nicht geholfen...

    Jemand einen Tipp für mich, die definierte schreibweise in SCL macht mich fertig...

    Werde mir auch die anderen Beiträger hier dazu morgen reinziehen...

    Gedacht ist folgendes:
    1. Zählpuffer = Zählpuffer + 1
    2. Transferiere Wert in DW(Zählpuffer)
    3. wenn der Zählpuffer =20 dann setze wieder auf 0
    Geändert von AndreK (17.04.2008 um 15:36 Uhr)
    Zitieren Zitieren Pointer in SCL ?  

  2. #2
    Registriert seit
    22.11.2005
    Ort
    kl.Odenwald
    Beiträge
    716
    Danke
    111
    Erhielt 85 Danke für 71 Beiträge

    Standard

    Mit Pointern kannst du in SCL nicht arbeiten.
    Aber, falls es sich um DB's handelt, mit indizierten Zugriffen, sowohl auf den DB, als auch auf die jeweilige Variable.
    Gib die Stichwöreter mal in der Suche ein, müssten ein paar Beispiel im Forum sein.
    Viel Erfolg.
    "Das Leben ist viel zu kurz, um schlecht zu essen !"
    (Johann Lafer zur SWR3 Grillparty)

  3. Folgender Benutzer sagt Danke zu kiestumpe für den nützlichen Beitrag:

    AndreK (17.04.2008)

  4. #3
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.728
    Danke
    398
    Erhielt 2.406 Danke für 2.002 Beiträge

    Standard

    Ich würde so vorgehen :
    In SCL einen FB projektieren.
    Im STAT-Bereich des FB ein ARRAY [1..20] of WORD deklarieren.
    Auf dieses ARRAY dann indiziert zugreifen.

    Beispiel :
    Code:
     
    VAR
       myARRAY : ARRAY [1..20] of WORD ;
    END_Var
     
    und im Programm :
     
    myARRAY[1] := 1000 ;
     
    oder
     
    myARRAY[i] := 2000 ;   // wobei i eine INT-Variable ist ...
    Vielleicht kommst du so schon weiter.

    Gruß
    LL

  5. Folgender Benutzer sagt Danke zu Larry Laffer für den nützlichen Beitrag:

    AndreK (17.04.2008)

  6. #4
    AndreK ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    08.01.2007
    Ort
    Dülmen
    Beiträge
    393
    Danke
    58
    Erhielt 24 Danke für 17 Beiträge

    Standard

    ... das es genau das ist was ich will
    Zitieren Zitieren Auf Anhieb würde ich sagen...  

  7. #5
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.728
    Danke
    398
    Erhielt 2.406 Danke für 2.002 Beiträge

    Standard

    Zitat Zitat von AndreK Beitrag anzeigen
    ... das es genau das ist was ich will
    Wenn nicht, dann bringt es dich aber schon mal auf die Spur und du hast einen Ansatz für Weiteres ...

  8. Folgender Benutzer sagt Danke zu Larry Laffer für den nützlichen Beitrag:

    AndreK (17.04.2008)

  9. #6
    Registriert seit
    30.03.2005
    Beiträge
    2.096
    Danke
    0
    Erhielt 673 Danke für 541 Beiträge

    Standard

    Zitat Zitat von AndreK Beitrag anzeigen
    ich möchte eigentlich nur zyklisch 20 Datenwörter umlaufend füllen...
    Hier ist noch mal ein Programmbeispiel für einen Ringpuffer mit indirekter Adressierung in S7-SCL:

    Code:
    FUNCTION_BLOCK FB100
     
    NAME    : PUFFER
    FAMILY  : SPSFORUM
    AUTHOR  : KAI
    VERSION : '1.0'
     
    VAR_INPUT
        DB_NUMMER    : INT;
        STARTADRESSE : INT;
        LAENGE       : INT;
        WERT         : INT;
        EINLESEN     : BOOL;
    END_VAR
     
    VAR
        ADRESSE       : INT;
        FLANKENMERKER : BOOL;
        HILFSMERKER   : BOOL;
    END_VAR
     
    BEGIN
     
    // Flankenauswertung positive Flanke
     
    FLANKENMERKER := EINLESEN AND NOT HILFSMERKER;
    HILFSMERKER   := EINLESEN;
     
    // Neuen Wert in Ringpuffer einlesen
     
    IF FLANKENMERKER THEN
     
        WORD_TO_BLOCK_DB(INT_TO_WORD(DB_NUMMER)).DW[ADRESSE + STARTADRESSE] := 
        INT_TO_WORD(WERT);
     
        ADRESSE := ADRESSE + 2;
     
        IF ADRESSE > ((LAENGE - 1) * 2) THEN
            ADRESSE := 0;
        END_IF;
     
    END_IF;
     
    END_FUNCTION_BLOCK
    Gruß Kai
    Angehängte Dateien Angehängte Dateien

  10. Folgende 3 Benutzer sagen Danke zu Kai für den nützlichen Beitrag:

    AndreK (27.04.2008),Fabrizion (28.09.2013),Smurf (15.04.2016)

  11. #7
    AndreK ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    08.01.2007
    Ort
    Dülmen
    Beiträge
    393
    Danke
    58
    Erhielt 24 Danke für 17 Beiträge

    Standard

    Werde ich mir auf jeden Fall mal morgen im Büro durchsehen!
    Zitieren Zitieren Ja super :-)  

  12. #8
    Registriert seit
    30.03.2005
    Beiträge
    2.096
    Danke
    0
    Erhielt 673 Danke für 541 Beiträge

    Standard

    Siehe zu dem Thema auch die Hilfe zu S7-SCL:

    Indizierter Zugriff auf Datenbausteine

    Sie haben auch die Möglichkeit, auf Datenbausteine indiziertzuzugreifen. Dies hat gegenüber der absoluten Adressierung den Vorteil, dass Sie Operanden adressieren können, deren Adresse erst zur Laufzeit feststeht. Sie können also zum Beispiel die Laufvariable einer FOR-Schleife als Adresse verwenden.

    Der indizierte Zugriff auf einen Datenbaustein geschieht ähnlich wie der absolute Zugriff. Er unterscheidet sich nur in der Angabe der Adresse.

    Anstelle der Adresse wird ein Index spezifiziert, der eine Konstante, eine Variable oder ein arithmetischer Ausdruck sein kann.

    Der indizierte Zugriff setzt sich aus der DB-Bezeichnung, dem Operandenkennzeichen (Schlüsselwort "D" und Größen-Präfix) sowie einem Basis-Ausdruck für das Indizieren zusammen.

    Die Indizierung muss den folgenden Regeln entsprechen:
    • Bei einem Zugriff, der vom Datentyp BYTE, WORD oder DWORD ist, müssen Sie genau einen Index verwenden. Der Index wird als Byteadresse interpretiert. Die Zugriffsbreite wird durch das Größen-Präfix festgelegt.
    • Bei einem Zugriff, der vom Datentyp BOOL ist, müssen Sie zwei Indizes benutzen. Der erste Index spezifiziert die Byteadresse, der zweite Index die Bitposition innerhalb des Bytes.
    • Jeder Index muss dabei ein arithmetischer Ausdruck vom Datentyp INT (0 - 32767) sein
    Beispiel:

    STATUS_1:= DB11.DW[ZAEHLER];
    STATUS_2:= DB12.DX[WNR, BITNR];
    STATUS_1:= Datenbasis1.DW[ZAEHLER];
    STATUS_2:= Datenbasis2.DX[WNR, BITNR];
    STATUS_1:= WORD_TO_BLOCK_DB(INDEX).DW[ZAEHLER];
    Gruß Kai

  13. #9
    Registriert seit
    14.01.2004
    Ort
    Hattorf
    Beiträge
    3.201
    Danke
    297
    Erhielt 311 Danke für 266 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    hallo,
    mir stellt sich die frage muss es scl sein? mit den tabellen fc's geht es einfacher.
    mfg

    dietmar

    Nichts ist so beständig wie ein Provisorium.

Ähnliche Themen

  1. Pointer?!
    Von tuneit im Forum Simatic
    Antworten: 12
    Letzter Beitrag: 23.09.2008, 09:43
  2. Pointer und Co
    Von mkd im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 31.07.2008, 14:30
  3. SCL: Pointer
    Von dinner4one im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 06.07.2008, 18:07
  4. DB und Pointer
    Von PhilippL im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 12.09.2007, 07:02
  5. VKE und Pointer im FC...
    Von halorenzen im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 23.07.2004, 13:16

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •