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

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 21

Thema: DB auslesen

  1. #1
    Registriert seit
    04.03.2009
    Ort
    Lohmar
    Beiträge
    29
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    S7 414-2DP
    Step7 Vers. 5.4 + Optionen

    Hallo zusammen,

    ich möchte einen DB auslesen und diesen am liebsten nach Exel transferieren, Notepad oder Editor wären ebenfalls möglich.
    Die Lösung sollte so einfach und kostengünstig wie möglich sein da es sich um ein Provisorium handelt ( nichts hält so lange wie das Provisorium).

    Ein Datensatz besteht aus 26 Adressen. Der Schreibzeiger wird anschließend um 26 erhöht.
    Frage: Wieviele Adressen kann ich im DB (bei dieser CPU) beschreiben, bzw. wieviele Datensätze anlegen?
    Ich brauche eigentlich 2800(Datensätze) pro Woche.

    vielen Dank im voraus.
    Zitieren Zitieren DB auslesen  

  2. #2
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.166
    Danke
    921
    Erhielt 3.286 Danke für 2.655 Beiträge

    Standard

    Zitat Zitat von User1974 Beitrag anzeigen
    ich möchte einen DB auslesen und diesen am liebsten nach Exel transferieren, [...]
    Die Lösung sollte so einfach und kostengünstig wie möglich sein
    Man kann mit Step7 den DB mit den Aktualwerten ganz einfach in Excel kopieren:
    • den Offline-DB im Step7-Projekt öffnen
    • Datei > Online öffnen
    • Ansicht > Datensicht
    • alle Zeilen markieren (erste bis letzte, Strg-A geht nicht)
    • Bearbeiten > Kopieren
    • in das Excel-Tabellenblatt wechseln
    • Bearbeiten > Einfügen

    INT und DINT werden in Excel sofort richtig dezimal dargestellt.
    BYTE, WORD, DWORD werden als xx#16#nnn dargestellt, bei REAL wird die Kommastelle verfälscht.
    Wenn einem das nicht gefällt, dann noch schnell ein Makro schreiben, das die Spalte
    "Aktualwert" durchgeht und alle S7-Darstellungen in eine dezimale Darstellung ändert.

    Oder gleich das DB-auslesen mit LibNodave in Excel programmieren.

    Zitat Zitat von User1974 Beitrag anzeigen
    Ein Datensatz besteht aus 26 Adressen. Der Schreibzeiger wird anschließend um 26 erhöht.
    Frage: Wieviele Adressen kann ich im DB (bei dieser CPU) beschreiben, bzw. wieviele Datensätze anlegen?
    Bei einer CPU 414-2DP kann ein DB 64kB groß sein.
    Nach Adam Ries passen da also 2520 Datensätze zu je 26 Byte rein.
    Wenn man mehr Datensätze braucht, dann kann man auch mehrere DBs benutzen
    und z.B. täglich um Mitternacht zum nächsten DB wechseln.

    Gruß
    Harald

  3. Folgender Benutzer sagt Danke zu PN/DP für den nützlichen Beitrag:

    User1974 (08.06.2010)

  4. #3
    User1974 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    04.03.2009
    Ort
    Lohmar
    Beiträge
    29
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard

    vielen Dank ersteinmal, mit Exel hat mir schon sehr geholfen.

    Mit den Datensätzen hapert es noch ein wenig, ab Adresse 81.. wird kein Datensatz mehr beschrieben( ich denke anstatt 64Kb nur 8Kb? ),
    Oder kann es sein das in der Systemsteuerung noch etwas eingestellt werden muss?

    Zitieren Zitieren 64Kb oder nur 8Kb ?????  

  5. #4
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.166
    Danke
    921
    Erhielt 3.286 Danke für 2.655 Beiträge

    Standard

    Alle CPU 414-2DP die ich kenne erlauben DB bis 64kB.
    Um ganz sicher zu gehen kann man unter "Zielsystem > Baugruppenzustand > Reiter: Leistungsdaten" online nachsehen,
    was die real eingesetzte CPU tatsächlich kann.

    Zitat Zitat von User1974 Beitrag anzeigen
    Mit den Datensätzen hapert es noch ein wenig, ab Adresse 81.. wird kein Datensatz mehr beschrieben
    Da wird wohl die Berechnung Deines Schreibzeigers nicht korrekt sein.
    Poste doch mal den entsprechenden Code (bitte Code-Tags benutzen: #-Button im Beitragseditor).
    Steht was im Diagnosepuffer der CPU?

    Gruß
    Harald

  6. #5
    User1974 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    04.03.2009
    Ort
    Lohmar
    Beiträge
    29
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo Harald,

    es werden 316 Datensätze a 24 bit richtig abgelegt, der 317 nur zur Hälfte, die andere Hälfte überschreibt den ersten Datensatz und macht die ganze Dokumentation zu nichte. Wir hatten die DB zuerst mit 1250 Datensätzen konfiguriert und den FC so umgeschrieben, das die Daten nach dem der erste DB voll ist in den zweiten geschrieben werden. So geht es weiter bis der vierte voll ist, danach wird der erste wieder überschrieben.

    Der Schreibzeiger zählt bis zum Ende richtig, nur ab dem 316 Datensatz gibt es nur Datenmüll (in jedem der vier DB). Der Schreibzeige ist im INT konfiguriert, im DINT zählte er nicht richtig, es wurden statt der 24 etwas über 1500000 addiert?!

    Der Schreibzeiger wird mit "2" geladen und fängt dann an mit jedem Datensatz "24" zu addieren. Wie erklärst Du dir, dass es normal funktioniert und beim 317sten Datensatz aufhört? Ich war jetzt der Meinung, die DB's werden nicht mehr können.

    Gruß Benny

  7. #6
    Registriert seit
    17.06.2004
    Ort
    Offenau
    Beiträge
    3.745
    Danke
    209
    Erhielt 421 Danke für 338 Beiträge

    Standard

    kannst meinen protokoller verwenden. Der kann auch ein CSV File erzeugen.

    Dort ist in einem Unterverzeichnis auch ein Step 7 Projekt welches ein Baustein zum Datenaustausch mit der SPS und eine FiFo enthält!
    ---------------------------------------------
    Jochen Kühner
    https://github.com/jogibear9988/DotN...ToolBoxLibrary - Bibliothek zur Kommunikation mit PLCs und zum öffnen von Step 5/7 Projekten
    Zitieren Zitieren Mhmm...  

  8. #7
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.166
    Danke
    921
    Erhielt 3.286 Danke für 2.655 Beiträge

    Standard

    Zitat Zitat von User1974 Beitrag anzeigen
    Wie erklärst Du dir, dass es normal funktioniert und beim 317sten Datensatz aufhört? Ich war jetzt der Meinung, die DB's werden nicht mehr können.
    Wenn Deine CPU 414-2DP keine DB > 8KB könnte, dann hättest Du die DB garnicht auf die CPU laden können.
    Welche DB-Größe Deine CPU unterstützt kannst Du so nachsehen:
    Zielsystem > Baugruppenzustand > Reiter: Leistungsdaten
    (wie bereits im Beitrag #4 erwähnt)

    Zitat Zitat von User1974 Beitrag anzeigen
    es werden 316 Datensätze a 24 bit richtig abgelegt, der 317 nur zur Hälfte, die andere Hälfte überschreibt den ersten Datensatz [...]
    Der Schreibzeiger zählt bis zum Ende richtig, nur ab dem 316 Datensatz gibt es nur Datenmüll (in jedem der vier DB).
    Noch einmal: Da wird wohl die Adress-Berechnung Deines Schreibzeigers nicht korrekt sein.
    Wenn Du Deinen Code hier gepostet hättest, dann hätte Dir sicher schon jemand den Fehler aufgezeigt.
    Daß Deine Adressberechnung ausgerechnet im 317. Datensatz auf falsche Adressen kommt ist schon
    merkwürdig. Wenn es im 342. Datensatz wäre, dann könnte man es leicht erklären.

    Doch ich will nun nicht raten, welchen Rechenfehler Dein Code macht. Hier ein Code-Beispiel
    für 10000 Datensätze je 24 Byte auf 4 DB je 2500 Datensätze aufgeteilt.
    (das sind 4 DB je ca. 60kByte -> gesamt ca. 240kByte!)

    Code:
    DATA_BLOCK "A-Puffer1"   // DB71
    VERSION : 0.1
    
      STRUCT
       DS_Pointer : INT  := -1 ;    //Schreibzeiger zuletzt geschriebener Datensatz
       DS : ARRAY [0..2499] OF      //2500 Datensätze
       STRUCT
        Foo : ARRAY [0..23] OF      //Platzhalter für 24 Byte Daten
        BYTE  := B#16#0 ;
       END_STRUCT ;
      END_STRUCT ;
    BEGIN
       DS_Pointer := -1 ;
       DS[0].Foo[0] := B#16#0 ;
    // ...
       DS[2499].Foo[23] := B#16#0 ;
    END_DATA_BLOCK
    
    // DB72, DB73, DB74 haben den gleichen Aufbau, außer: DBW0 ist unbenutzt.
    
    FUNCTION FC 70 : VOID
    TITLE =Datensätze dem Aufzeichnungspuffer hinzufügen
    //DB71..DB74 Datenaufzeichnungspuffer für je 2500 Datensätze a 24 Byte
    //Das sind 4 DB je ca. 60 kByte = ca. 240 kByte!!!
    VERSION : 0.1
    
    VAR_INPUT
      DS_Reset : BOOL ;             //Reset Datensatz-Schreibzeiger
      DS_Add : BOOL ;               //1 Datensatz hinzufügen
    END_VAR
    VAR_TEMP
      DB_Nr : INT ;
    END_VAR
    BEGIN
    NETWORK
    TITLE =Schreibzeiger auf Anfang Aufzeichnungspuffer setzen ?
    //#DS_Reset sollte nur 1 Zyklus lang sein
    //#DS_Add darf nur 1 Zyklus lang sein
    
    // bei Reset Schreibzeiger "zuletzt geschriebener Datensatz" auf -1 setzen
          U     #DS_Reset ;                 // Reset Schreibzeiger?
          SPBN  MADS ;
          L     -1 ;
          T     "A-Puffer1".DS_Pointer ;
    // eventuell alle 10.000 alten Datensätze löschen
    // ...
    
    MADS: UN    #DS_Add ;                   // Datensatz hinzufügen?
          BEB   ;                           // nein, nichts tun
    
    NETWORK
    TITLE =Datensatz zum Aufzeichnungspuffer hinzufügen + Adresse berechnen
    //Puffer: 10000 Datensätze je 24 Byte in 4 Teil-DB je 2500 Datensätze
    //DB71: Datensatz    0..2499 / DB72: Datensatz 2500..4999 / 
    //DB73: Datensatz 5000..7499 / DB74: Datensatz 7500..9999
    //Der erste Datensatz im DB beginnt jeweils bei DBW2!
    
    // Schreibzeiger "zuletzt geschriebener Datensatz" 1 Datensatz weiter stellen
          L     "A-Puffer1".DS_Pointer ;    // -1..0..9999
          +     1 ;                         // nächster -> 0..1..10000
          L     10000 ;                     // max Anzahl Datensätze
          MOD   ;                           // auf 0..9999 begrenzen, ggf. Wrap
          T     "A-Puffer1".DS_Pointer ;    // und merken
    
    // Anfangsadresse neuer Datensatz im Aufzeichnungspuffer berechnen
          L     2500 ;                      // 2500 Datensätze je Teil-DB
          /I    ;                           // 0..9999 -> 0..3 / AKKU1-H -> 0..2499
    // AKKU1-L: Quotient 0..3 = DB-Selector -> Nr Datensatz-DB DB71..DB74
    // AKKU1-H: Div.Rest 0..2499 = Datensatz-Nr im Puffer-Teil-DB
          PUSH  ;                           // AKKU1-H 0..2499 retten
          +     71 ;                        // 0..3 -> DB71..DB74 (Nr Datensatz-DB)
          T     #DB_Nr ;
          POP   ;                           // AKKU1-H 0..2499 zurück
          SRD   16 ;                        // -> Datensatz-Nr in diesem Teil-DB
          L     24 ;                        // Länge 1 Datensatz
          *D    ;                           // -> 0..59976
          +     2 ;                         // Offset ab DB7x.DBW2 -> 2..59978
          SLD   3 ;                         // -> P#2.0 .. P#59978.0
          LAR1  ;                           // Anfangsadresse Datensatz
    
    NETWORK
    TITLE =Werte der Datensatzvariablen in Aufzeichnungspuffer eintragen
    
          L     DB101.DBW   10 ;            // Datenpunkt_1
    //      L     "A-Puffer1".DS_Pointer      // ##TEST##
          AUF   DB [#DB_Nr] ;               // DB71..DB74
          T     DBW [AR1,P#0.0] ;           // in Datensatz schreiben
    
          L     MW   100 ;                  // Datenpunkt_2
    //      AUF   DB [#DB_Nr]                 // DB71..DB74 ist noch offen
          T     DBW [AR1,P#2.0] ;           // in Datensatz schreiben
    
    // ...
    
          L     DB101.DBB   16 ;            // Datenpunkt_x
          AUF   DB [#DB_Nr] ;
          T     DBB [AR1,P#23.0] ;          // in Datensatz schreiben
    
    END_FUNCTION
    Gruß
    Harald
    Zitieren Zitieren Code-Beispiel  

  9. #8
    User1974 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    04.03.2009
    Ort
    Lohmar
    Beiträge
    29
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Code:
    STRUCTschreibzeigerINT0achseARRAY[1..300]STRUCTDoku_NummerARRAY[1..10]CHARNabengruppennummerARRAY[1..10]CHARachslaenge_sollINT0kapsellaengeachslaenge_istINT0links + rechtskorrekturwertINT0KorrekturwertEND_STRUCTEND_STRUCT

  10. #9
    User1974 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    04.03.2009
    Ort
    Lohmar
    Beiträge
    29
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Code:
    schreibzeiger                           INT                                    0                      
    achse                                       ARRAY[1..300]                                
                                                   STRUCT                               
    Doku_Nummer                       ARRAY[1..10]                                  
                                                   CHAR                         
    Nabengruppennummer            ARRAY[1..10]                                  
                                                   CHAR                         
    achslaenge_soll                        INT                                   0            kapsellaenge     
    achslaenge_ist                          INT                                   0            links + rechts   
    korrekturwert                          INT                                   0            Korrekturwert  
                                                    END_STRUCT                                   

  11. #10
    User1974 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    04.03.2009
    Ort
    Lohmar
    Beiträge
    29
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Code:
          L     #doku_nummer[1]
          T     #dkn_1
          L     #doku_nummer[2]
          T     #dkn_2
          L     #doku_nummer[3]
          T     #dkn_3
          L     #doku_nummer[4]
          T     #dkn_4
          L     #doku_nummer[5]
          T     #dkn_5
          L     #doku_nummer[6]
          T     #dkn_6
          L     #doku_nummer[7]
          T     #dkn_7
          L     #doku_nummer[8]
          T     #dkn_8
          L     #doku_nummer[9]
          T     #dkn_9
          L     #doku_nummer[10]
          T     #dkn_10
    
    
          L     #nabengruppennummer[1]
          T     #ngn_1
          L     #nabengruppennummer[2]
          T     #ngn_2
          L     #nabengruppennummer[3]
          T     #ngn_3
          L     #nabengruppennummer[4]
          T     #ngn_4
          L     #nabengruppennummer[5]
          T     #ngn_5
          L     #nabengruppennummer[6]
          T     #ngn_6
          L     #nabengruppennummer[7]
          T     #ngn_7
          L     #nabengruppennummer[8]
          T     #ngn_8
          L     #nabengruppennummer[9]
          T     #ngn_9
          L     #nabengruppennummer[10]
          T     #ngn_10
    
    
          L     #laenge_soll
          T     #l_soll
          L     #laenge_ist
          T     #l_ist
          L     #korrekturwert
          T     #k_wert

Ähnliche Themen

  1. S7-200 CPU 226 CN auslesen
    Von RGELEKTRO im Forum Simatic
    Antworten: 9
    Letzter Beitrag: 03.10.2016, 16:39
  2. S7 MMC auslesen
    Von Wowa05 im Forum Simatic
    Antworten: 13
    Letzter Beitrag: 30.01.2010, 11:20
  3. SZL auslesen
    Von der Micha im Forum Hochsprachen - OPC
    Antworten: 19
    Letzter Beitrag: 09.08.2008, 19:02
  4. OP 37 auslesen!
    Von RobRoy94 im Forum HMI
    Antworten: 4
    Letzter Beitrag: 16.03.2006, 18:28
  5. SPS mit c auslesen
    Von Speedy3311 im Forum Hochsprachen - OPC
    Antworten: 2
    Letzter Beitrag: 24.08.2005, 15:30

Lesezeichen

Berechtigungen

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