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

Ergebnis 1 bis 10 von 10

Thema: Auf DB mit Pointer zugreifen

  1. #1
    Registriert seit
    04.09.2008
    Beiträge
    69
    Danke
    23
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Leute,

    ich möchte Werte eines DB in einen anderen DB schreiben. Ich habe das wie folgt realisiert (Beispiel)

    L P#DBX 0.0
    LAR1
    LAR2
    AUF "Werte"
    L W [AR1,P#0.0]
    AUF "Werte2"
    T W [AR2,P#0.0]

    Kann man den Pointer so angeben, dass sie den DB mitenthalten, also die DB-Nummer ebenfalls im AR1/AR2 steht?
    Ich will das über eine Schleife realisieren, in der ich mit +AR1 die Adressen erhöhen.

    mfg und Danke im Voraus

    Holger
    Zitieren Zitieren Auf DB mit Pointer zugreifen  

  2. #2
    Registriert seit
    08.04.2008
    Ort
    Köln
    Beiträge
    844
    Danke
    39
    Erhielt 244 Danke für 199 Beiträge

    Standard

    Hallo Holger,

    so wie Du Dir das vorstellst geht es leider nicht. Du kannst den DB mit in einen Pointer schreiben,
    aber das kopieren musst Du dann mit dem SFC 20 machen.

    Grüße
    Gebs

  3. #3
    Registriert seit
    13.10.2007
    Beiträge
    12.026
    Danke
    2.784
    Erhielt 3.268 Danke für 2.156 Beiträge

    Standard

    nein, das geht nicht. Du könntest dir mit einen "DB-Zeiger" oder "Any-Zeiger"
    auf die Adresse zeigen und diesen Zeiger endsprechend zerlegen.
    - - -
    Wer als Werkzeug nur einen Hammer hat, sieht in jedem Problem einen Nagel.

  4. #4
    Registriert seit
    04.09.2008
    Beiträge
    69
    Danke
    23
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Danke Gebs,

    kann ich da aber auch mit Schleifen arbeiten (möchte jeden 3. Wert des umfangreichen DB in einen anderen schreiben)

    Holger

  5. #5
    Registriert seit
    04.09.2008
    Beiträge
    69
    Danke
    23
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Danke Helmut,

    kannst du mir erklären, wie ich das machen kann?

    Holger

  6. #6
    Registriert seit
    13.10.2007
    Beiträge
    12.026
    Danke
    2.784
    Erhielt 3.268 Danke für 2.156 Beiträge

    Standard

    Zitat Zitat von Holger Levetzow Beitrag anzeigen
    Danke Helmut,

    kannst du mir erklären, wie ich das machen kann?

    Holger
    na klar könnte ich das, aber der Volker hat das schon viel schöner gemacht

    http://www.sps-forum.de/showthread.php?t=12923
    - - -
    Wer als Werkzeug nur einen Hammer hat, sieht in jedem Problem einen Nagel.

  7. Folgender Benutzer sagt Danke zu rostiger Nagel für den nützlichen Beitrag:

    Holger Levetzow (02.11.2010)

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

    Standard

    Zitat Zitat von Holger Levetzow Beitrag anzeigen
    ich möchte Werte eines DB in einen anderen DB schreiben. Ich habe das wie folgt realisiert (Beispiel)

    L P#DBX 0.0
    LAR1
    LAR2
    AUF "Werte"
    L W [AR1,P#0.0]
    AUF "Werte2"
    T W [AR2,P#0.0]
    Zitat Zitat von Holger Levetzow Beitrag anzeigen
    kann ich da aber auch mit Schleifen arbeiten (möchte jeden 3. Wert des umfangreichen DB in einen anderen schreiben)
    Das folgende Programmbeispiel kopiert jeden dritten Wert aus dem DB-Quelle in den DB-Ziel.

    Es werden insgesamt 4 Werte (Anzahl Werte) aus dem DB-Quelle in den DB-Ziel kopiert.

    Code:
    FUNCTION FC 100 : VOID
    TITLE =Werte aus DB-Quelle nach DB-Ziel kopieren
    AUTHOR : Kai
    FAMILY : SPSForum
    NAME : '40156'
    VERSION : 1.0
     
    VAR_INPUT
      DB_Quelle : BLOCK_DB ; 
      DB_Ziel : BLOCK_DB ; 
      Anzahl_Werte : INT ; 
    END_VAR
    VAR_TEMP
      DB_Register : WORD ; 
      AR1_Register : DWORD ; 
      AR2_Register : DWORD ; 
      Schleife : INT ; 
    END_VAR
    BEGIN
    NETWORK
    TITLE =Register sichern
     
          L     DBNO; // DB-Register
          T     #DB_Register; 
     
          TAR1  ; // AR1-Register
          T     #AR1_Register; 
     
          TAR2  ; // AR2-Register
          T     #AR2_Register; 
     
    NETWORK
    TITLE =Werte aus DB-Quelle nach DB-Ziel kopieren
    //Jeden dritten Wert aus DB-Quelle nach DB-Ziel kopieren
    //   
          L     P#0.0; 
          LAR1  ; 
          LAR2  ; 
     
          L     #Anzahl_Werte; // Anzahl Werte
    M01:  T     #Schleife; // Schleife
     
          AUF   #DB_Quelle; // DB-Quelle
          L     DBW [AR1,P#0.0]; // DB-Quelle Wert
          AUF   #DB_Ziel; // DB-Ziel
          T     DBW [AR2,P#0.0]; // DB-Ziel Wert
     
          L     P#6.0; 
          +AR1  ; 
     
          L     P#2.0; 
          +AR2  ; 
     
          L     #Schleife; // Schleife
          LOOP  M01; 
     
    NETWORK
    TITLE =Register wiederherstellen
     
          AUF   DB [#DB_Register]; // DB-Register
     
          L     #AR1_Register; // AR1-Register
          LAR1  ; 
     
          L     #AR2_Register; // AR2-Register
          LAR2  ; 
     
    END_FUNCTION
    Gruß Kai
    Angehängte Dateien Angehängte Dateien

  9. Folgende 2 Benutzer sagen Danke zu Kai für den nützlichen Beitrag:

    epy (03.11.2010),Holger Levetzow (06.11.2010)

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

    Standard

    Und noch ein Bild aus der Simulation mit PLCSIM.

    Gruß Kai
    Angehängte Grafiken Angehängte Grafiken

  11. #9
    Registriert seit
    06.10.2003
    Beiträge
    3.403
    Danke
    447
    Erhielt 502 Danke für 406 Beiträge

    Standard

    Es geht auf noch ein bisschen anders

    FC mit Parametertyp BLOCK_DB
    Code:
    //****************************************************************************
    //*** AR1 sichern
    //****************************************************************************
          TAR1  #TEMP_AR1
          SET   
          SAVE  
    
    //****************************************************************************
    //*** Daten kopieren (Parametertyp BLOCK_DB) 
    //****************************************************************************
    //*** QUELL-DB als DB öffnen
          L     P##QUELLE                   // BLOCK_DB
          SRD   16
          T     #TEMP_INT
          AUF   DB [#TEMP_INT]
    
    //*** ZIEL-DB als DI öffnen
          L     P##ZIEL                     // BLOCK_DB
          SRD   16
          T     #TEMP_INT
          AUF   DI [#TEMP_INT]
    
    //*** Adressregister auf P#0.0
          L     P#0.0
          LAR1  
          LAR2  
    
    //*** Daten kopieren
          L     #N                          // INTEGER
    LOO2: T     #TEMP_INT
          L     DBW [AR2,P#0.0]
          T     DIW [AR1,P#0.0]
          +AR1  P#2.0
          +AR2  P#6.0
          L     #TEMP_INT
          LOOP  LOO2
    
    
    //****************************************************************************
    //*** AR1-Register wiederherstellen
    //****************************************************************************
          LAR1  #TEMP_AR1
    oder FC mit Parametertyp POINTER
    Code:
    //****************************************************************************
    //*** AR1 sichern
    //****************************************************************************
          TAR1  #TEMP_AR1
          SET   
          SAVE  
    
    //****************************************************************************
    //*** Daten kopieren (Parametertyp POINTER)
    //****************************************************************************
    //*** DB öffnen und AR2 auf QUELLE
          L     P##ZIEL                     // POINTER
          LAR2  
          L     W [AR2,P#0.0]
          T     #TEMP_INT
          AUF   DB [#TEMP_INT]
          L     D [AR2,P#2.0]
          LAR2  
    
    //*** DI öffnen und AR1 auf ZIEL
          L     P##ZIEL                     // POINTER
          LAR1  
          L     W [AR1,P#0.0]
          T     #TEMP_INT
          AUF   DI [#TEMP_INT]
          L     D [AR1,P#2.0]
          LAR1  
    
    //*** kopieren
          L     #N                          // INTEGER
    LOO3: T     #TEMP_INT
          L     DBW [AR2,P#0.0]
          T     DIW [AR1,P#0.0]
          +AR1  P#2.0
          +AR2  P#6.0
          L     #TEMP_INT
          LOOP  LOO3
    
          NOP   0
    
    
    //****************************************************************************
    //*** AR1-Register wiederherstellen
    //****************************************************************************
    
          LAR1  #TEMP_AR1
    Es gibt viel mehr Leute, die freiwillig aufgeben, als solche, die echt scheitern.
    Henry Ford

  12. Folgende 2 Benutzer sagen Danke zu Onkel Dagobert für den nützlichen Beitrag:

    epy (03.11.2010),Holger Levetzow (06.11.2010)

  13. #10
    Registriert seit
    04.09.2008
    Beiträge
    69
    Danke
    23
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Guten Morgen und Danke euch allen. Das werde ich erstmal durchdenken müssen.

    Holger

Ähnliche Themen

  1. Antworten: 12
    Letzter Beitrag: 18.05.2011, 23:57
  2. Mit Any- Pointer auf Lokaldaten zugreifen
    Von AJ67 im Forum Simatic
    Antworten: 12
    Letzter Beitrag: 25.06.2009, 10:01
  3. Indirekt (Any-Pointer) auf PEW zugreifen?
    Von thorsten im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 11.05.2009, 12:44
  4. in ein Schieberegister per Pointer zugreifen
    Von Perfektionist im Forum Programmierstrategien
    Antworten: 16
    Letzter Beitrag: 25.08.2008, 16:17
  5. Mit Any-Pointer auf PAW zugreifen?
    Von merlin im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 24.06.2007, 20:51

Lesezeichen

Berechtigungen

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