# DB auslesen



## User1974 (7 Juni 2010)

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.


----------



## PN/DP (7 Juni 2010)

User1974 schrieb:


> 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.



User1974 schrieb:


> 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


----------



## User1974 (8 Juni 2010)

*64Kb oder nur 8Kb ?????*

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?


----------



## PN/DP (8 Juni 2010)

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.



User1974 schrieb:


> 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


----------



## User1974 (5 Juli 2010)

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


----------



## Jochen Kühner (5 Juli 2010)

*Mhmm...*

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!


----------



## PN/DP (7 Juli 2010)

*Code-Beispiel*



User1974 schrieb:


> 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)



User1974 schrieb:


> 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!)


```
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


----------



## User1974 (7 Juli 2010)

```
[FONT=Arial][SIZE=2]STRUCT[/SIZE][/FONT][FONT=Arial][SIZE=2][/SIZE][/FONT][FONT=Arial][SIZE=2][/SIZE][/FONT][FONT=Arial][SIZE=2]schreibzeiger[/SIZE][/FONT][FONT=Arial][SIZE=2]INT[/SIZE][/FONT][FONT=Arial][SIZE=2]0[/SIZE][/FONT][FONT=Arial][SIZE=2][/SIZE][/FONT][FONT=Arial][SIZE=2]achse[/SIZE][/FONT][FONT=Arial][SIZE=2]ARRAY[1..300][/SIZE][/FONT][FONT=Arial][SIZE=2][/SIZE][/FONT][FONT=Arial][SIZE=2][/SIZE][/FONT][FONT=Arial][SIZE=2][/SIZE][/FONT][FONT=Arial][SIZE=2]STRUCT[/SIZE][/FONT][FONT=Arial][SIZE=2][/SIZE][/FONT][FONT=Arial][SIZE=2][/SIZE][/FONT][FONT=Arial][SIZE=2]Doku_Nummer[/SIZE][/FONT][FONT=Arial][SIZE=2]ARRAY[1..10][/SIZE][/FONT][FONT=Arial][SIZE=2][/SIZE][/FONT][FONT=Arial][SIZE=2][/SIZE][/FONT][FONT=Arial][SIZE=2][/SIZE][/FONT][FONT=Arial][SIZE=2]CHAR[/SIZE][/FONT][FONT=Arial][SIZE=2][/SIZE][/FONT][FONT=Arial][SIZE=2][/SIZE][/FONT][FONT=Arial][SIZE=2]Nabengruppennummer[/SIZE][/FONT][FONT=Arial][SIZE=2]ARRAY[1..10][/SIZE][/FONT][FONT=Arial][SIZE=2][/SIZE][/FONT][FONT=Arial][SIZE=2][/SIZE][/FONT][FONT=Arial][SIZE=2][/SIZE][/FONT][FONT=Arial][SIZE=2]CHAR[/SIZE][/FONT][FONT=Arial][SIZE=2][/SIZE][/FONT][FONT=Arial][SIZE=2][/SIZE][/FONT][FONT=Arial][SIZE=2]achslaenge_soll[/SIZE][/FONT][FONT=Arial][SIZE=2]INT[/SIZE][/FONT][FONT=Arial][SIZE=2]0[/SIZE][/FONT][FONT=Arial][SIZE=2]kapsellaenge[/SIZE][/FONT][FONT=Arial][SIZE=2]achslaenge_ist[/SIZE][/FONT][FONT=Arial][SIZE=2]INT[/SIZE][/FONT][FONT=Arial][SIZE=2]0[/SIZE][/FONT][FONT=Arial][SIZE=2]links + rechts[/SIZE][/FONT][FONT=Arial][SIZE=2]korrekturwert[/SIZE][/FONT][FONT=Arial][SIZE=2]INT[/SIZE][/FONT][FONT=Arial][SIZE=2]0[/SIZE][/FONT][FONT=Arial][SIZE=2]Korrekturwert[/SIZE][/FONT][FONT=Arial][SIZE=2][/SIZE][/FONT][FONT=Arial][SIZE=2]END_STRUCT[/SIZE][/FONT][FONT=Arial][SIZE=2][/SIZE][/FONT][FONT=Arial][SIZE=2][/SIZE][/FONT][FONT=Arial][SIZE=2][/SIZE][/FONT][FONT=Arial][SIZE=2]END_STRUCT[/SIZE][/FONT]
```


----------



## User1974 (7 Juli 2010)

```
[SIZE=3][FONT=Times New Roman]schreibzeiger                           INT                                    0                      [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]achse                                       ARRAY[1..300]                                [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]                                               STRUCT                               [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]Doku_Nummer                       ARRAY[1..10]                                  [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]                                               CHAR                         [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]Nabengruppennummer            ARRAY[1..10]                                  [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]                                               CHAR                         [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]achslaenge_soll                        INT                                   0            kapsellaenge     [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]achslaenge_ist                          INT                                   0            links + rechts   [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]korrekturwert                          INT                                   0            Korrekturwert  [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]                                                END_STRUCT                                   [/FONT][/SIZE]
```


----------



## User1974 (7 Juli 2010)

```
[SIZE=3][FONT=Times New Roman]      L     #doku_nummer[1][/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      T     #dkn_1[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      L     #doku_nummer[2][/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      T     #dkn_2[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      L     #doku_nummer[3][/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      T     #dkn_3[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      L     #doku_nummer[4][/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      T     #dkn_4[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      L     #doku_nummer[5][/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      T     #dkn_5[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      L     #doku_nummer[6][/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      T     #dkn_6[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      L     #doku_nummer[7][/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      T     #dkn_7[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      L     #doku_nummer[8][/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      T     #dkn_8[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      L     #doku_nummer[9][/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      T     #dkn_9[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      L     #doku_nummer[10][/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      T     #dkn_10[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman] [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman] [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      L     #nabengruppennummer[1][/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      T     #ngn_1[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      L     #nabengruppennummer[2][/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      T     #ngn_2[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      L     #nabengruppennummer[3][/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      T     #ngn_3[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      L     #nabengruppennummer[4][/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      T     #ngn_4[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      L     #nabengruppennummer[5][/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      T     #ngn_5[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      L     #nabengruppennummer[6][/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      T     #ngn_6[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      L     #nabengruppennummer[7][/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      T     #ngn_7[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      L     #nabengruppennummer[8][/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      T     #ngn_8[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      L     #nabengruppennummer[9][/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      T     #ngn_9[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      L     #nabengruppennummer[10][/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      T     #ngn_10[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman] [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman] [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      L     #laenge_soll[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      T     #l_soll[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      L     #laenge_ist[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      T     #l_ist[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      L     #korrekturwert[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      T     #k_wert[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman] [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman] [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman] [/FONT][/SIZE]
```


----------



## User1974 (7 Juli 2010)

```
[FONT=Times New Roman][SIZE=3]db1:  L     "db_längedaten_1".schreibzeiger    //Abfrage DB1 voll[/SIZE][/FONT]
[SIZE=3][FONT=Times New Roman]      L     7802[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      >=I   [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      SPB   db2[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman] [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      L     "db_längedaten_1".schreibzeiger    //Abfrage DB1 leer[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      L     0[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      ==I   [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      SPBN  lad1[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman] [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      L     2                           //Lade Anfangswert Schreibzeiger[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      T     "db_längedaten_1".schreibzeiger[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      SPA   wdb1[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman] [/FONT][/SIZE]
[FONT=Times New Roman][SIZE=3]lad1: L     "db_längedaten_1".schreibzeiger[/SIZE][/FONT]
[SIZE=3][FONT=Times New Roman]      L     26[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      +I    [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      T     "db_längedaten_1".schreibzeiger[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      L     7776[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      >I    [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      SPBN  wdb1[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman] [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      L     0                           //Reset Schreibzeiger DB2[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      T     "db_längedaten_2".schreibzeiger[/FONT][/SIZE]
```


----------



## User1974 (7 Juli 2010)

```
[FONT=Times New Roman][SIZE=3]db2:  L     "db_längedaten_2".schreibzeiger    //Abfrage DB2 voll[/SIZE][/FONT]
[SIZE=3][FONT=Times New Roman]      L     7802[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      >=I   [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      SPB   db3[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman] [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      L     "db_längedaten_2".schreibzeiger    //Abfrage DB2 leer[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      L     0[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      ==I   [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      SPBN  lad2[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman] [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      L     2                           //Lade Anfangswert Schreibzeiger[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      T     "db_längedaten_2".schreibzeiger[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      SPA   wdb2[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman] [/FONT][/SIZE]
[FONT=Times New Roman][SIZE=3]lad2: L     "db_längedaten_2".schreibzeiger[/SIZE][/FONT]
[SIZE=3][FONT=Times New Roman]      L     26[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      +I    [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      T     "db_längedaten_2".schreibzeiger[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      L     7776[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      >I    [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      SPBN  wdb2[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman] [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      L     0                           //Reset Schreibzeiger DB3[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      T     "db_längedaten_3".schreibzeiger[/FONT][/SIZE]
```


----------



## User1974 (7 Juli 2010)

```
[FONT=Times New Roman][SIZE=3]db3:  L     "db_längedaten_3".schreibzeiger    //Abfrage DB3 voll[/SIZE][/FONT]
[SIZE=3][FONT=Times New Roman]    L     7802                        //Schreibe weiter in DB4[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]    >=I   [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]    SPB   db4[/FONT][/SIZE]
 
[SIZE=3][FONT=Times New Roman]    L     "db_längedaten_3".schreibzeiger    //Abfrage DB3 leer[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]    L     0[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]    ==I   [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]    SPBN  lad3[/FONT][/SIZE]
 
[SIZE=3][FONT=Times New Roman]    L     2                           //Lade Anfangswert Schreibzeiger[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]    T     "db_längedaten_3".schreibzeiger[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]    SPA   wdb3[/FONT][/SIZE]
 
[FONT=Times New Roman][SIZE=3]lad3: L     "db_längedaten_3".schreibzeiger[/SIZE][/FONT]
[SIZE=3][FONT=Times New Roman]    L     26[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]    +I    [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]    T     "db_längedaten_3".schreibzeiger[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]    L     7776[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]    >I    [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]    SPBN  wdb3[/FONT][/SIZE]
 
[SIZE=3][FONT=Times New Roman]    L     0[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]    T     "db_längedaten_4".schreibzeiger[/FONT][/SIZE]
```


----------



## User1974 (7 Juli 2010)

```
db4:  L     "db_längedaten_4".schreibzeiger
      L     7802
      >=I   
      SPB   db5
 
      L     "db_längedaten_4".schreibzeiger    //Abfrage DB4 leer
      L     0
      ==I   
      SPBN  lad4
 
      L     2                           //Lade Anfangswert Schreibzeiger 
      T     "db_längedaten_4".schreibzeiger
      SPA   wdb4
 
lad4: L     "db_längedaten_4".schreibzeiger
      L     26
      +I    
      T     "db_längedaten_4".schreibzeiger
      L     7876
      >I    
      SPBN  wdb4
```


----------



## User1974 (7 Juli 2010)

```
[FONT=Times New Roman][SIZE=3]db5:  L     "db_längedaten_5".schreibzeiger[/SIZE][/FONT]
[SIZE=3][FONT=Times New Roman]     L     7802[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     >=I   [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     SPB   db5[/FONT][/SIZE]
 
[SIZE=3][FONT=Times New Roman]     L     "db_längedaten_5".schreibzeiger    //Abfrage DB5 leer[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     L     0[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     ==I   [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     SPBN  lad5[/FONT][/SIZE]
 
[SIZE=3][FONT=Times New Roman]     L     2                           //Lade Anfangswert Schreibzeiger [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     T     "db_längedaten_5".schreibzeiger[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     SPA   wdb5[/FONT][/SIZE]
 
[FONT=Times New Roman][SIZE=3]lad5: L     "db_längedaten_5".schreibzeiger[/SIZE][/FONT]
[SIZE=3][FONT=Times New Roman]     L     26[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     +I    [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     T     "db_längedaten_5".schreibzeiger[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     L     7876[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     >I    [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     SPBN  wdb5[/FONT][/SIZE]
 
 
 
[SIZE=3][FONT=Times New Roman]     L     0[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     T     "db_längedaten_1".schreibzeiger[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]     SPA   db1[/FONT][/SIZE]
```


----------



## User1974 (7 Juli 2010)

Leider kann ich nicht den ganzen Code in einem Fenster hoch laden, unsere EDV verbietet solche Datenmengen... Die CPU kann 6000 DB mit jeweils 64kByte. Es sollte demnach funktionieren, tut es aber nur mit etwas über 300 Datensätzen.


----------



## User1974 (7 Juli 2010)

```
[FONT=Times New Roman][SIZE=3]wdb1: L     "db_längedaten_1".schreibzeiger[/SIZE][/FONT]
[SIZE=3][FONT=Times New Roman]      SLW   3[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      LAR1  [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      SPA   writ[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman] [/FONT][/SIZE]
[FONT=Times New Roman][SIZE=3]wdb2: L     "db_längedaten_2".schreibzeiger[/SIZE][/FONT]
[SIZE=3][FONT=Times New Roman]      SLW   3[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      LAR1  [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      SPA   writ[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman] [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman] [/FONT][/SIZE]
[FONT=Times New Roman][SIZE=3]wdb3: L     "db_längedaten_3".schreibzeiger[/SIZE][/FONT]
[SIZE=3][FONT=Times New Roman]      SLW   3[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      LAR1  [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      SPA   writ[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman] [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman] [/FONT][/SIZE]
[FONT=Times New Roman][SIZE=3]wdb4: L     "db_längedaten_4".schreibzeiger[/SIZE][/FONT]
[SIZE=3][FONT=Times New Roman]      SLW   3[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      LAR1  [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      SPA   writ[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman] [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman] [/FONT][/SIZE]
[FONT=Times New Roman][SIZE=3]wdb5: L     "db_längedaten_5".schreibzeiger[/SIZE][/FONT]
[SIZE=3][FONT=Times New Roman]      SLW   3[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      LAR1  [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      SPA   writ[/FONT][/SIZE]
```


----------



## User1974 (7 Juli 2010)

```
[SIZE=3][FONT=Times New Roman]writ: L     #dkn_1[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      T     DBB [AR1,P#0.0][/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      L     #dkn_2[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      T     DBB [AR1,P#1.0][/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      L     #dkn_3[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      T     DBB [AR1,P#2.0][/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      L     #dkn_4[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      T     DBB [AR1,P#3.0][/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      L     #dkn_5[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      T     DBB [AR1,P#4.0][/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      L     #dkn_6[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      T     DBB [AR1,P#5.0][/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      L     #dkn_7[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      T     DBB [AR1,P#6.0][/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      L     #dkn_8[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      T     DBB [AR1,P#7.0][/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      L     #dkn_9[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      T     DBB [AR1,P#8.0][/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      L     #dkn_10[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      T     DBB [AR1,P#9.0][/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman] [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman] [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      L     #ngn_1[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      T     DBB [AR1,P#10.0][/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      L     #ngn_2[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      T     DBB [AR1,P#11.0][/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      L     #ngn_3[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      T     DBB [AR1,P#12.0][/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      L     #ngn_4[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      T     DBB [AR1,P#13.0][/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      L     #ngn_5[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      T     DBB [AR1,P#14.0][/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      L     #ngn_6[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      T     DBB [AR1,P#15.0][/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      L     #ngn_7[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      T     DBB [AR1,P#16.0][/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      L     #ngn_8[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      T     DBB [AR1,P#17.0][/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      L     #ngn_9[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      T     DBB [AR1,P#18.0][/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      L     #ngn_10[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      T     DBB [AR1,P#19.0][/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman] [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      L     #l_soll[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      T     DBW [AR1,P#20.0][/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      L     #l_ist[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      T     DBW [AR1,P#22.0][/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      L     #k_wert[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]      T     DBW [AR1,P#24.0][/FONT][/SIZE]
```


----------



## PN/DP (8 Juli 2010)

Hallo Benny,

daß Du Dein Problem derart umständlich löst, hätte ich nicht gedacht.
Doch OK, jeder darf seine Aufgabe so aufwändig und uneffizient lösen, wie es der Prozess zuläßt.

Du mußt nicht für jeden DB einen eigenen Schreibzeiger verwalten.
Denk' Dir doch Deinen Datensatzpuffer als ein einziges Gebilde "am Stück", mach' Deine 
Schreib-Verwaltung auf Basis von Datensatz-Nummern (und nicht Offset-Adressen) und teile den 
Datensatzpuffer erst beim eigentlichen Datensatz-Schreiben auf mehrere DB der zulässigen Größe auf. 
Dann mußt Du auch nicht vorher Adress-Grenzwerte berechnen.

Das Zwischenspeichern der Datenpunkte in einen Temp-Bereich vor dem Übertragen in den Datensatz-Puffer 
ist aber eine gute Idee (so halte ich das auch immer). Damit erspart man sich das ständige AUF [#DB]
beim indirekten Schreiben jedes Datenpunktes in den Datensatz (bei Dir ab Marke writ:, Beitrag #18).

Wie aus Deinen Postings zu sehen ist, ist jeder Datensatz nun doch wieder 26 Byte lang.
Damit ist ganz logisch, daß Deine Adressberechnung beim 316. Datensatz crasht (bei 24 Byte je 
Datensatz crasht es erst beim 341. Datensatz).

Lange Rede, kurzer Sinn:
Dein Problem steckt im Code im Posting #17.
Ersetze die "SLW 3" durch "SLD 3", dann ist die Pointerbildung auch für mehr als 316 Datensätze 
in einem DB korrekt (sprich: nach der 8kB-Grenze).
Deine Adress-Grenzwerte 7802 und 7776 mußt Du natürlich anpassen oder besser Adress-unabhängig mit 
Datensatz-Nummern arbeiten.

Oder mache Dir die Mühe, meinen kurzen knackigen Code im Beitrag #7 zu lesen und zu verstehen, 
dann kannst Du den leicht auf eine andere Datensatz-Größe, Datensatz-Anzahl und DB-Anzahl ändern.

Gruß
Harald


----------



## User1974 (28 Juli 2010)

Hallo Harald,



PN/DP schrieb:


> daß Du Dein Problem derart umständlich löst, hätte ich nicht gedacht.
> Doch OK, jeder darf seine Aufgabe so aufwändig und uneffizient lösen, wie es der Prozess zuläßt.



Schön geschrieben, finde ich gut.

Das das Programm viel zu aufwendig und kompliziert geschrieben wurde war mir klar, einen anderen Weg habe ich nicht gefunden. Meine Programmierkenntnisse sind schlecht und waren bis vor kurzen in meiner Tätigkeit (IH) auch nicht gefragt. Bin Frischling...

Ich habe mir Deinen Code die letzten zwei Tage, immer wenn es zeitlich ging, angeschaut und auch zum Großteil verstanden. So hatte ich mir das vorgestellt, kannte aber den Weg dahin nicht.

Ein paar Fragen habe ich dennoch:

Dein Schreibzeiger setzt sich selbstständig zurück, warum dann die zusätzlichen Eingangsvariablen #DS-Reset und #DS_Add?
Wie kommt die Datensatz-Nr. zustande? Die DB Auswahl kann ich noch nachvollziehen, oder rechne ich falsch?
	
	



```
// 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
```

Und zu guter letzt, wozu ist der Schiebe rechts Befehl gut? Da komm ich nicht hinter.
	
	



```
POP                               // AKKU1-H 0..2499 zurück
      SRD   16                          // -> Datensatz-Nr in diesem Teil-DB
      L     26                          // Länge 1 Datensatz
```


Vielend Dank.


----------



## PN/DP (29 Juli 2010)

User1974 schrieb:


> 1. Dein Schreibzeiger setzt sich selbstständig zurück, warum dann die zusätzlichen Eingangsvariablen #DS-Reset und #DS_Add?


Mein FC70 aus Beitrag #7 realisiert einen Ringpuffer/Archiv für 10000 Datensätze je 24 Byte.
Da diese 10000 Datensätze nicht in einen DB passen, ist der Puffer auf 4 DB je 2500 Datensätze aufgeteilt.
Im ersten DB ist der Schreibzeiger, er merkt sich die Nummer des zuletzt geschriebenen Datensatzes 0 bis 9999.
Damit beim Start auf den ersten Datensatz Nummer 0 geschrieben wird, ist der Schreibzeiger mit -1 initialisiert 
(könnte auch 9999 sein).

Immer wenn ein Datensatz hinzugefügt werden soll, dann ist der Baustein-Eingang *DS_Add* für 1 Zyklus zu aktivieren.
Ist das Ende des Ringpuffers bei Datensatz Nummer 9999 erreicht, dann beginnt der FC70, die Datensätze ab Datensatz 
Nummer 0 zu überschreiben. Der Schreibzeiger setzt sich genaugenommen nicht zurück, sondern schließt den Ringpuffer, 
indem am linearen Ende des Puffers auf den Anfang des Puffers weitergeschaltet wird (Überlauf, Wrap). Das macht das *MOD*.

Wenn der Puffer explizit von vorn bei Datensatz Nummer 0 beginnen soll, dann ist der Baustein-Eingang *DS_Reset* zu aktivieren. 
Das stellt den Schreibzeiger so, daß der nächste Datensatz in den ersten Datensatz des Ringpuffers geschrieben wird.



> _2. Wie kommt die Datensatz-Nr. zustande? Die DB Auswahl kann ich noch nachvollziehen, oder rechne ich falsch?_


Der Schreibzeiger zählt die Datensatznummern 0 bis 9999. Der Ringpuffer ist aber "physikalisch" auf 4 DB aufgeteilt. 
Deshalb wird berechnet, in welchem DB sich der zu schreibende Datensatz befindet und der wievielte Datensatz innerhalb 
dieses DB das ist. Das macht die Division der Datensatznummer durch die Kapazität der Teil-DB = 2500 Datensätze.

```
// 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
[COLOR="Red"]// hier ist die Nummer des aktuell zu schreibenden Datensatzes noch im AKKU1[/COLOR]
      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
```
Beispiel: Datensatz 5203 soll geschrieben werden
5203 / 2500 = 2 Rest 203
Im AKKU1-L-Word steht nach der Division der Quotient 2 und im AKKU1-H-Word steht der Divisionsrest 203.
(siehe auch die Step7-Hilfe zu */I*).
AKKU1-L (Quotient) wählt nun den DB: DB71 + 2 = DB73
AKKU1-H (Divisionsrest) ergibt die Datensatznummer innerhalb dieses DB73: Datensatz 203



> _3. Und zu guter letzt, wozu ist der Schiebe rechts Befehl gut? Da komm ich nicht hinter._


*SRD 16* schiebt den Divisionsrest (203) vom AKKU1-H-Word (Bits 16 bis 31) in das AKKU1-L-Word (Bits 0 bis 15).

Gruß
Harald


----------

