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

Ergebnis 1 bis 6 von 6

Thema: SCL: DB-Bereiche umkopieren

  1. #1
    Registriert seit
    23.04.2008
    Beiträge
    44
    Danke
    11
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Forum,

    ich suche nach einer einfachen Möglichkeit aus einem F-DB eine Anzahl von Worten einzulesen und diese in ein UDT eines normalen DBs zu schreiben.
    Z.B.

    VAR_INPUT
    OFFSET : Pointer; //Zeiger auf das Startwort
    END_VAR
    VAR_OUTPUT
    ZIEL : UDTxy;
    END_VAR

    ZIEL.Word1 := OFFSET + 0
    ZIEL.Word2 := OFFSET + 1

    ...ist das möglich? Wie würde der Syntax aussehen?
    Zitieren Zitieren SCL: DB-Bereiche umkopieren  

  2. #2
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.709
    Danke
    398
    Erhielt 2.397 Danke für 1.997 Beiträge

    Standard

    Hallo d4o,
    das geht in SCL sogar sehr schön :
    Code:
    VAR_OUTPUT
        Daten        : UDT1 ;   // UDT Status Station
           a_Daten AT Daten : ARRAY [1..5] OF WORD ;
    END_VAR
    VAR_TEMP
        DB_Pointer   : INT ;
        i            : INT ;
        j            : INT ;
    END_VAR
    
    BEGIN
    FOR i := 1 TO 5 BY 1 DO
          j := (i -1) * 2 ;
          a_Daten [i] := WORD_TO_BLOCK_DB (w_DB).DW [DB_pointer + j] ;
    END_FOR ;
    END_FUNCTION
    im skizzierten Fall ist der UDT 5 Worte groß ...

    und umgekehrt geht es so ähnlich ...
    Code:
    VAR_INPUT
        Daten        : UDT1 ;   // UDT Status Station
           a_Daten AT Daten : ARRAY [1..5] OF WORD ;
    END_VAR
    
    VAR_TEMP
        DB_Pointer   : INT ;
        i            : INT ;
        j            : INT ;
    END_VAR
     
    BEGIN
    FOR i := 1 TO 5 BY 1 DO
           j := (i -1) * 2 ;
           WORD_TO_BLOCK_DB (w_DB).DW [DB_pointer + j] := a_Daten [i] ;
    END_FOR ;
    END_FUNCTION
    ich habe dir in den Beispielen die Zuweisung von w_DB (WORD) und DB_Pointer (INT) unterschlagen. Ich denke, die Lücke kannst du selber füllen ...

    Gruß
    LL

  3. #3
    Registriert seit
    23.04.2008
    Beiträge
    44
    Danke
    11
    Erhielt 0 Danke für 0 Beiträge

    Standard

    ...ja das ist verstanden.

    Ich hatte an etwas gedacht das mir das Parametrieren meiner Funktion erleichtert.

    Wenn ich in VAR_INPUT eine BLOCK_DB Variable nehme kann ich leider nicht gezielt, in dem sich öffnenden Auswahlfenster des Editors, ein Wort in einem DB auswählen sondern nur den DB selbst. Somit muss ich für den Offset des Wortes eine 2. INPUT-Variable benutzen. Ich möchte beides mit einem INPUT realisieren und aus diesem Wert den DB + Wordoffset ermitteln. Daher dachte ich es lässt sich über einen POINTER erledigen - denn wenn ich damit das Auswahlfenster öffne kann ich die DBs (mit +) öffnen und darin ein beliebiges Wort auswählen. Dann sollte in dem Pointer eigentlich soetwas wie "DBxy.DWxy" stehen. Ich habe aber keine Ahnung wie ich aus dem POINTER die DB-Nummer und den WORD-Offset generiere.

    puhh, hoffe ich konnte mich verständlich machen.

  4. #4
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.709
    Danke
    398
    Erhielt 2.397 Danke für 1.997 Beiträge

    Standard

    Zitat Zitat von dinner4one Beitrag anzeigen
    puhh, hoffe ich konnte mich verständlich machen.
    Na klar ...
    Hier heißt dein Stichwort ANY-POINTER. Hierzu gibt es ein sehr schönes Beispiel von Volker in der Rubrik FAQ. Aber zum Thema SCL habe ich da auch noch einen Code-Schnipsel ...
    Code:
    VAR_INPUT
      DB_Pointer      : ANY ;    // Zeiger auf Datenbaustein / -Adresse
    END_VAR
    
    VAR_TEMP
      DB_Ziel : word ;
      DB_Ziel_DW : INT ;
      
      xAny : STRUCT
             ID_Code   : BYTE ;
             DataTyp   : BYTE ;
             Anzahl    : WORD ;
             DB_Nr     : WORD ;
             SpeicherPtr : DWORD ;
      END_STRUCT ;
      hAny AT xAny : ANY ;
    END_VAR
    
    BEGIN
       hAny := DB_Pointer ;
       DB_Ziel := xAny.DB_Nr ;
       DB_Ziel_DW := DWORD_TO_INT(xAny.SpeicherPtr AND dw#16#00FF_FFFF) / 8 ;
    END_FUNCTION
    Kommst du damit weiter ...?

  5. #5
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.709
    Danke
    398
    Erhielt 2.397 Danke für 1.997 Beiträge

    Standard

    ... ach ja, ich vergaß ...
    die Übergabe an die Funktion erfolgt nun mit P#DB100.DBW10 (z.B.)
    oder p#DB100.DBX10.0 BYTE 20 (für einen Bereich).

    Gruß
    LL

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

    dinner4one (27.06.2008)

  7. #6
    Registriert seit
    23.04.2008
    Beiträge
    44
    Danke
    11
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    wow

    das ist es. Danke!

Ähnliche Themen

  1. TP070 ohne Projekt umkopieren
    Von kassla im Forum HMI
    Antworten: 0
    Letzter Beitrag: 14.01.2010, 21:00
  2. Remanente Bereiche S7 200
    Von JoeJo im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 05.12.2009, 22:29
  3. Remanente Bereiche S7-200
    Von schlitz im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 14.12.2007, 14:36
  4. String umkopieren
    Von Ralle im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 13.09.2007, 20:08
  5. zeit- bereiche abfragen
    Von Koala im Forum HMI
    Antworten: 0
    Letzter Beitrag: 09.09.2004, 16:04

Lesezeichen

Berechtigungen

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