DB auslesen

User1974

Level-1
Beiträge
29
Reaktionspunkte
0
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:D).

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

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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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?

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

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
 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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!
 
Code-Beispiel

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)

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
 
Code:
[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]
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
[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]
 
Code:
[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]
 
Code:
[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]
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
[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]
 
Code:
[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]
 
Code:
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
[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]
 
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.
 
Zuletzt bearbeitet:
Code:
[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]
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
[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]
 
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
 
Hallo Harald,

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:
  1. Dein Schreibzeiger setzt sich selbstständig zurück, warum dann die zusätzlichen Eingangsvariablen #DS-Reset und #DS_Add?
  2. Wie kommt die Datensatz-Nr. zustande? Die DB Auswahl kann ich noch nachvollziehen, oder rechne ich falsch?
    Code:
    // 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
  3. Und zu guter letzt, wozu ist der Schiebe rechts Befehl gut? Da komm ich nicht hinter.
    Code:
        POP                               // AKKU1-H 0..2499 zurück
          SRD   16                          // -> Datensatz-Nr in diesem Teil-DB
          L     26                          // Länge 1 Datensatz

Vielend Dank.
 
Zurück
Oben