SPS-Data logging

Si Mon

Level-1
Beiträge
3
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo allerseits,
ich wuerde gern mit einer SPS wie zB. Siemens Simatic S7 daten loggen.
d.h. alle messdaten die am analog input anliegen aufzeichen, aber ohne eine PC zu benutzen. Viellecht gibt es in der SPS einen internen Speicher mit dem ich das machen kann und diesen dann spaeter auslesen und die Daten speichern.
Bitte um schnellst moegliche hilfe, vielen Dank im Vorraus
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo marlob, erstmal vielen dank fuer deine schnelle antwort, habe mich vielleicht schlecht ausgedrueckt oder ich kapiers einfach nicht;)
Ich erklaere mal meine situation: ich habe eine SPS(z.B.:MicroLogix 1100 von allen-bradley), an diese ist ein druckluftsensor angeschlossen der mir signale liefert (4-20mA Industriestandard), diese signale lese ich am pc mit einem programm aus und visualisiere sie. natuerlich koennte ich die daten mit der software loggen, aber was ist wenn der pc aus ist? Deswegen wuerde ich gerne die daten mit zeitstempel und wert in der SPS speichern und spaeter mit dem pc abrufen. geht das ueberhaupt, wenn ja wie?
z.B.: Input1:20/05/2008,11:52,7.85mA,13.25bar in etwa so
 
Was du möchtest ist mir klar, aber du solltest schon wissen welche SPS du verwenden willst.

...mit einer SPS wie zB. Siemens Simatic S7 daten loggen.
....

... ich habe eine SPS(z.B.:MicroLogix 1100 von allen-bradley),
...
Mein Beispiel mit dem FIFO sollte ja auch nur ein Einführung sein. Habe ich ja auch geschrieben. Das muss man natürlich noch ein wenig an deine Bedürfnisse anpassen.
Aber um jetzt weitere Tipps zu geben, solltest du dich erstmal festlegen, welche SPS du benutzen willst
 
ich würde die sps nur lückenfüllend als datenhure mißbrauchen.

heißt: die datenerfassung auf dem angeschlossenen hmi durchführen und nur für den fall, diese falle aus, eine datenerfassung temporär in einen datenbaustein ... diese da dann auch wieder als bald möglich entfernen.

technisch ist es so lösbar wie marlob vorschlug, man kann da noch einiges an automatismen drumrum basteln:

watchdog mit hmi um aufzeichnung starten zu können
automatisch db erstellen
aufzeichnungstriggerung (zyklusgenaues aufzeichnen verbrät speicherplatz)
datenaustausch mit hmi nach wiederkehr
erstellte db löschen ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke, vierlagig, das ist genau die antwort, die ich gesucht hab, sowie ich das verstanden hab sollte ich daten auf dem pc loggen, nur im worstcase sollte die sps ein programm aufrufen das dann die daten fuer mich logt und bei einschalten des pc's zieht der sich die daten aus dem baustein, right?
So da dass meine ersten erfahrungen mit SPSen ist und ich nicht viel ahnung von der programmierung hab, koenntest du mir mal son programm-beispiel fuer deine vorgehensweise mal posten, waere echt nett.
@marlob ich muss mich fuer eine SPS entscheiden, das ist wahr deswegen schrieb ich zum Beispiel "z.B." und habe mich nicht festgelegt vielleicht weiss du ja ne SPS mit der das ohne probleme und mit brvur moeglich ist, trotzdem danke fuer deine sschnelle antwort
 
programmbeispiel wofür? es sieht in ner 300er s7 anders aus als in ner micrologix 1100, da müßte es fast so aussehen wie in ner 200er s7 aber auf keinen fall wie in ner logo aber zwischen 300er und 400er sollte der unterschied nicht so groß sein. mit moeller bin ich zwar nicht so vertraut aber ich glaub da wird die IEC unterstützt ...

aber ich will ja nicht so sein, anbei ein S7-beispiel zum aufzeichnen eines wertes nach startimpuls. ist nicht ganz was du willst, weil hier nur der wert aufgezeichnet wird uns kein timestamp, aber als überblick sollte es genügen (die beschränkung auf zehn db ist im beispiel notwendig bei dir evtl. nicht...)

Code:
*
Kurvenschreiber

Aurufumgebung: Weckalarm OB mit 10ms
Interface: EXCEL, Visu, other direkt auf IDB

Dieser Baustein erstellt nach einem Startimpuls einen Datenbaustein mit aus 
Aufzeichnungsdauer und Stützpunktanzahl berechneter Länge. Der Datenbaustein 
wird mit den Daten des angegebenen MD gefüllt.

Es können max. 10 DB angelegt werden. Bevor eine neue Messung gestartet werden 
kann, müssen diese 10 DB gelöscht werden.

DATE:     19.05.2008
AUTHOR:   4lagig
VERSION:  V0.0



// ---------> Interrupt-Daten sichern <--------- //


      L     DBNO                        // letzten offenen Globaldatenbaustein ...
      T     #wDbnoSave                  // ... sichern
      TAR1  #dAr1Save                   // AR1 sichern
      TAR2  #dAr2Save                   // AR2 sichern


// --------> Startbedingungen ermitteln <------- //


      U     #xOutOnAir                  // Aufzeichnung läuft bereits
      SPB   log                         // dann aufzeichnen

      U     #xInStart                   // Startimpuls
      FP    #xHelpFlag1
      UN    #xDbOverflow                // bereits 10 Aufzeichnungen gemacht
      SPBN  late                        // neuer DB oder Möglichkeit zu löschen


// -------> Datenbausteinnummer prüfen <-------- //


      L     #wBuffer9                   // der letzte Pufferplatz
      L     0                           // ungleich 0
      <>I                               // heißt 10 DBs angelegt
      O                                 // oder
      L     #iDbCounter                 // der DB-Zähler
      L     10                          // ist auf 10
      ==I   
      SPBN  go                          // wenn noch Platz ist, ist alles i.O.
      S     #xDbOverflow                // 10-DBs angelegt
      SPA   late                        // maximale Anzahl erreicht, erst löschen


// ------> Datenbausteinlänge ermitteln <------ //


go:   L     #iInTimeWriting             // Länge der Aufzeichnung
      L     #iInTimeStamp               // Trigger 10, 20, 30, ... 100ms ...
      /I                                // = Anzahl der Aufzuzeichnenden Werte
      L     4                           // REAL in Bytes ...
      *I                                // ...Anpassung
      T     #wDbLength                  // Datenbausteinlänge


// ----------> Datenbaustein erzeugen <--------- //


      CALL  "CREAT_DB"
       LOW_LIMIT:=W#16#1                // Bereich der DB-Nummer
       UP_LIMIT :=W#16#FF               // angeben
       COUNT    :=#wDbLength            // Länge übergeben
       RET_VAL  :=#iCreateReturn        // Fehlercode
       DB_NUMBER:=#wDbNumber            // DB Nummer zur weiterbearbeitung


// --------> Datenbausteinnr. ablegen <--------- //


      L     #wBuffer8                   // shift-Register begin...
      T     #wBuffer9                   // 
      L     #wBuffer7                   // 
      T     #wBuffer8                   // 
      L     #wBuffer6                   // 
      T     #wBuffer7                   // 
      L     #wBuffer5                   // 
      T     #wBuffer6                   // 
      L     #wBuffer4                   // 
      T     #wBuffer5                   //                
      L     #wBuffer3                   // 
      T     #wBuffer4                   // 
      L     #wBuffer2                   // 
      T     #wBuffer3                   // 
      L     #wBuffer1                   // 
      T     #wBuffer2                   // 
      L     #wBuffer0                   // 
      T     #wBuffer1                   // 
      L     #wDbNumber                  // 
      T     #wBuffer0                   // ... end

      L     #iDbCounter                 // DB-Zähler
      +     1                           // 
      T     #iDbCounter                 // inkrementieren


// -------------> Initialisierung <------------- //


      L     0                           // 0
      T     #iDataCounter               // für den Wertezähler

      L     0                           // 0
      T     #iCycleCounter              // für Aufzeichnungszähler

      L     #iInTimeStamp               // Trigger 10, 20, 30, ... 100ms ...
      L     10                          // 10
      /I                                // dividiert
      T     #iCycleTimes                // macht die Pausen

      L     #wDbLength                  // verfügbarer Speicherplatz
      +     -4                          // -4 
      T     #wDbLength                  // macht Adressierung

      SET                               // 1
      S     #xOutOnAir                  // für Aufzeichnung läuft


// --------------> Daten erfassen <------------- //


log:  U     #xOutOnAir                  // Aufzeichnung läuft
      SPBN  late                        // 

      L     #iCycleCounter              // Aufzeichnungszähler
      L     1
      +I                                // inkrementieren
      T     #iCycleCounter

      L     #iCycleCounter
      L     #iCycleTimes                // mit Soll
      ==I                               // vergleichen
      SPBN  late                        // wenn nich, dann nich

      L     0                           // wenn doch, dann 0
      T     #iCycleCounter              // in Aufzeichnungszähler

      L     #wDbNumber                  // DB-Adresse
      T     #wDbNumberTemp              // für Weiterverarbeitung

      L     #iInMdNumber                // MD-Adresse
      SLD   3
      T     #dMdNumber                  // für Weiterverarbeitung

      L     #iDataCounter               // Adressierungszähler
      SLD   3                           // Bits maskieren
      LAR1                              // in AR1  laden
      AUF   DB [#wDbNumberTemp]         // DB öffnen
      L     MD [#dMdNumber]             // Wert
      T     DBD [AR1,P#0.0]             // in DB schreiben

      L     #iDataCounter               // Adressierung
      +     4                           // um vier
      T     #iDataCounter               // erhöhen     

      L     #wDbLength
      L     #iDataCounter               // mit Adressierungszähler
      <=I                               // vergleichen
      SPBN  late
      R     #xOutOnAir                  // Aufzeichnung beendet


// ---------> Datenbausteine löschen <---------- //


late: U     #xInDeleteDb                // löschen angefordert
      FP    #xHelpFlag2
      UN    #xOutOnAir                  // und keine Aufzeichnung aktiv
      SPBN  end

      L     10                          // max. angelegte DBs
next: T     #iLoop                      // als Schleifenzähler benutzen

      L     #wBuffer0                   // DB-Adresse auf 0 prüfen
      L     0
      ==I                               // wenn 0 (=ungültige DB-Adresse)
      SPB   shif                        // löschen überspringen

      CALL  "DEL_DB"                    // Datenbaustein löschen
       DB_NUMBER:=#wBuffer0
       RET_VAL  :=#iDelReturn

shif: L     #wBuffer1                   // shift-Register begin...
      T     #wBuffer0                   //  
      L     #wBuffer2                   // 
      T     #wBuffer1                   // 
      L     #wBuffer3                   // 
      T     #wBuffer2                   // 
      L     #wBuffer4                   // 
      T     #wBuffer3                   // 
      L     #wBuffer5                   // 
      T     #wBuffer4                   // 
      L     #wBuffer6                   // 
      T     #wBuffer5                   // 
      L     #wBuffer6                   // 
      T     #wBuffer7                   // 
      L     #wBuffer7                   // 
      T     #wBuffer8                   // 
      L     #wBuffer9                   // 
      T     #wBuffer9                   // 
      L     0                           // 
      T     #wBuffer9                   // ... end

      L     #iLoop
      LOOP  next
      SET   
      R     #xDbOverflow                // max-Bit rücksetzen
      L     0
      T     #iDbCounter                 // Datenbausteinzähler zurücksetzen


// -------------> Schlußbehandlung <------------ //


end:  LAR1  #dAr1Save                   // AR1 rücksichern
      LAR2  #dAr2Save                   // AR2 rücksichern
      AUF   DB [#wDbnoSave]             // letzten Globaldatenbaustein öffnen
      SET   
      SAVE                              // EN0 eins machen
      BE
 
Zurück
Oben