Kontinuierliche Daten mit der S7 aufzeichnen

Sebastian

Level-1
Beiträge
4
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich habe das Problem, dass ich Analogdaten nach entsprechender Wandlung in REAL-Werte alle 100ms in einen DB schreiben muss. Start und Ende der Aufzeichnung werden durch Ereignisse gesteuert (das Funktioniert auch soweit).

Als Steuerung benutze ich eine VIPA CPU 315 SB/DPM und zum Programmieren STEP 7 V5.3 SP1.

Ich habe mir einen FC geschrieben der von einem FB aus alle 100ms aufgerufen wird und dann dort bei jedem Aufruf einen REAL-Wert in einen zuvor definierten DB schreiben soll. Den DB habe ich als Array mit 500 REAL-Werten definiert (Definition aus Siemensunterlagen, daher sicherlich fehlerfrei). Der FC bekommt als Übergabewert leidglich die Adresse, die in dem FB nach jedem Aufruf des FCs um 4 (INT) erhöht wird. Vor dem Start jeder Aufzeichnung wird die Adresse immer wieder auf 0 gesetzt.

Code:
      AUF   "Vak5_1"                    // DB30 öffnen
      L     #adresse                    // IN-Variable in INT
      T     #akt_ADR                    // TEMP-Variable in INT
 
      L     #akt_ADR
      SLD   3                           // INT-Wert zu Pointer wandeln
      LAR1  
 
      L     "Trending".Vac5_1           // Realwert laden (so möglich???)
      T     DBD [AR1,P#0.0]             // schreiben von DB30
 
      BE                             // zum Testen eingefügt!
 
      AUF   "Vak5_2"                    // DB31 öffnen
      L     "Trending".Vac5_2           // Realwert laden
      T     DBD [AR1,P#0.0]             // schreiben von DB31
 
      AUF   "Vak13_1"                   // DB32 öffnen
      L     "Trending".Vac13_1          // Realwert laden
      T     DBD [AR1,P#0.0]             // schreiben von DB32
 
      AUF   "Vak13_2"                   // DB33 öffnen
      L     "Trending".Vac13_2          // Realwert laden
      T     DBD [AR1,P#0.0]             // schreiben von DB33
 
      AUF   "Vak13_3"                   // DB34 öffnen
      L     "Trending".Vac13_3          // Realwert laden
      T     DBD [AR1,P#0.0]             // schreiben von DB34

Den OB121 (fängt Programmierfehler ab) habe ich auch eingefügt, da die Steuerung sonst sofort in STOP geht, wenn der Aufruf T DBD [AR1,P#0.0] abgearbeitet wird. Die Steuerung gibt einen Fehler aus, der auf eine unerlaubte Adressierung hinweist. Bei der Erstellung des FCs habe ich micht weitestgehend an ein Beispiel von volker gehalten (http://www.sps-forum.de/showthread.php?t=6364), doch leider bekomme ich außer der Fehlermeldung kein Ergebnis zustande.

Noch einige Fragen:
  • Darf des Beschreiben des DBs in einem FC geschehen, oder führt dies schon zu Problemen.
  • Darf ich den Messwert mit dem Aufruf L "Trending".Vac5_1 laden oder funktioniert das nicht so einfach (es steht dort definitiev ein REAL-Wert drin!)
  • Kann ich, wie in dem Beispiel oben, mehrere DBs hintereinander öffnen und gleich beschreiben (die Adresse ist für alle DBs die gleiche) oder muss ich dies in unterschiedlichen FCs machen.
Sollte noch etwas unklar sein, werde ich es so gut es geht Erklären.

Vielen Dank schonmal vorab für die Hilfestellungen!!!

mfg Sebastian
 
Falscher DB ?

Hallo,

versuch mal die Befehle so umzustellen:
L "Trending".Vac5_1 // Realwert laden (so möglich???)

Hier: Auf "Vak5_1"
T DBD [AR1,P#0.0] // schreiben von DB30

Ich vermute mal dass "Trending" der symbolische Name eines DB`s ist, und
Du damit den vorherigen Befehle AUF "" überschreibst, d.h. die SPS schreibt in den DB "Trending", und falls der nicht bis zum DBD30 offen ist, bekommst Du einem Programmierfehler.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Achtung der Pointer ist ein DWORD, also auch ein DINT verwenden bzw. wandeln. Es funktioniert sonst nur für "kurze Sprünge", da ab einer bestimmten Sprungweite die Adresse falsch ist.

Code:
      L     #akt_ADR
      ITD                                //INT in DINT wandeln
      SLD   3                           //DINT-Wert zu Pointer wandeln
      LAR1

Ansonsten siehe vorigen Beitrag, du willst immer in den "Trending"-DB schreiben.
 
@RonOro

Danke für den Hinweis! Das vertauschen der beiden Aufrufe hat wunderbar funktioniert. Ich kann nun alle fünf DBs mit den Werten der fünf Messstellen beschreiben!!!

Hätte nicht gedascht, dass dabei so penibel auf die Reihenfolge der Aufrufe geachtet werden muss.

@Ralle

Ich habe mich wie schon zuvor erwähnt an das Beispiel von volker gehalten (http://www.sps-forum.de/showthread.php?t=6364), darin hat CrazyCat gefragt, welcher Datentyp für akt_ADR (bei Ihm hieß das teil akt_dw) verwendet werden kann.

>>Für akt_dw ist nur der Datentyp INT zulässig, oder?
sollte doch wohl reichen,oder? oder hast du einen db der dw mit einer adresse > 32768 hat. :wink:
Ich habe für akt_ADR auch den Datentyp INT verwendet und es geht!?!? Ich habe auch einen Timer mit laufen lassen um die Messdauer zu kontrollieren, damit ich einen Ruckschluss auf die Anzahl der aufgezeichneten Messwerte ziehen kann und auch das ist richtig. Messdauer 16,4 sek --> 164 aufgezeichnete Messwerte bei einem Trigger von 100ms.

Wie lange ist ein "langer" bzw "kurzer" Sprung? Momentan springe ich immer 4 um auf die nächste höhere Adresse des DBs zu kommen.
 
@Sebastian

Das mit dem DINT sollte nur ein Hinweis sein, ich hatte auch immer INT stehen, bis ich in einem Datenbaustein von 15384 Byte Länge fast ganz am Ende Daten per indirekter Adressierung auslesen wollte. Das ergibt eigenartige Effekte in der SPS. Sie geht nicht mal unbedingt in Stop, aber beim Schreiben der Daten kann es passieren, daß irgendwas im Programm gesetzt wird, z.Bsp. Ausgänge die gar nicht beschaltet waren. Nachdem ich mit DINT bzw ITD gearbeitet habe war das Problem behoben. Bis wann INT ausreicht weiß ich nicht (bin zu faul das mal genau nachzurechnen) und eigentlich ist es egal, ich nutze seitdem DINT bzw. DWORD und es geht. :rolleyes:

PS: Vielleicht kann ich es nächste Woche nochmal austesten.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für den Hinweis!

Wenn du ein Ergebnis hast bis wohin INT funkioniert und ab wann man DINT benutzen sollte, dann kannst es ja mal ins Form stellen. Würde mich auch interessieren.
 
Zurück
Oben