Spitzenwerte eines Analogsignals herausfiltern

Alex vs. SPS

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

vielleicht kann mir jemand von euch weiter helfen!? Ich arbeitete zur Zeit an einer Regelungsaufgabe, bei der der größte Wert eines Sensor während einer Wellenumdrehung herausgefiltert werden soll. Ich bekomme einen Eingangsimpuls je Umdrehung (Initiator). Darüber wird also der Zeitraum definiert, in dem ich den größten Wert des Sensors herausbekommen und speichern möchte. Meine ersten Denkansätze gehen in die Richtung, das ich immer dann den Istwert des Sensors in einen Puffer DB schreibe, wenn die Steigung des Sensorsignals "0" ist (Wendepunkt). Ich wollte 2 Puffer DB´s erzeugen und sie immer im Wechsel mit den Spitzenwerten der jeweiligen Umdrehung beschreiben. Nach einer Umdrehung sollten dann die gespeicherten Spitzenwerte verglichen und der größte Wert als Sollwert für die Regelung verwendet werden. Hat jemand von euch vielleicht schon einmal eine ähnliche Aufgabe in S7 realisiert oder hat wer vielleicht sogar eine bessere Lösung für das Problem? Freue mich über weitere Ideen und Denkanstöße. Meine zur Verfügung stehenden Komponenten lauten wie folgt:

Software: S7 V5.4 + SP3
Hardware: CPU 315-2DP (6ES7 315 2AG10-0AB0)

Schönen Tag noch.

Gruß, Alex
 
Hallo,

Ich würde hier den Analog-wert immer in bestimmten Abständen einlesen,
hier eigent sich der OB34. Die Zeit zwischen den Alarmen kannst Du in der Hardwarekonfiguration festlegen.
Bei jedem Einlesen/Skalieren würde ich den Maximumwert von aktuellem Analogwert und (letzten) Maximumwert ermitteln und diesen Wert wieder als Maximumwert speichern.
Bei jeder Flanke des Initiators würde ich den Maximumwert dann als Maximum für letze Umdrehung ablegen den Maximumwert zum Einlesen würde ich entwerden mit "0" oder mit "-31767" oder mit "2exp-31" vorbelegen/Löschen.

Das wars.


Viel Erfolg

S7_Programmer
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Alex,

ich würde mir immer nur den höchsten Wert in eine Hilfswort schreiben, dieses Hilfswort beim Start auf Nullsetzen.
So etwa:
Code:
     U #Start
     FP #Flanke_Start
     SPBN GO
     L 0
     T #Höchster_Wert
GO:  L #Ist_Wert
     L #Höchster_Wert
     <I
     SPB NEIN
     TAK
     T #Höchster_Wert
NEIN:NOP 0
 
Hallo S7_Programmer,

das war auch mein erster Ansatz, die Werte des Sensors in definierten Zeitabständen einlesen. Die Gefahr dabei ist lediglich, das ich gewisse Spitzen, auf die ich eigentlich unbedingt reagieren müsste, nicht mitbekomme. Die Wahrscheinlichkeit ist eher gering (OB34 alle 200ms), ausschließen kann ich es aber so nicht. Deshalb bin ich auch erst zu dem Ansatz mit der Ermittlung der Wendepunkte übergegangen. Im ersten Beitrag habe ich übrigens einen nicht ganz unwichtigen Punkt vergessen: Sollte der Istwert während der aktuellen Umdrehung den maximalen Istwert der vorherigen Umdrehung überschreiten, muss der Sollwert des Reglers unbedingt auf den neuen Istwert angepasst werde.

@Paule
Werde deinen Vorschlag gleich mal ausprobieren, hört sich ganz gut an.

Vielen Dank schonmal für eure Antworten.

Gruß,
Alex
 
Zuletzt bearbeitet:
Wenn Du noch keinen Impuls hast, dann bilde dir einen mit dem [P] Befehl, mit dem Ergebnis legst Du den aktuell vorliegenden Istwert des Sensors in einen Speicher. Nun vergleichst Du in jedem Zyklus diesen gespeicherten mit dem neuen Istwert. ISt dieser größer als der vorhergehende speicherst Du ihn erneut ab. Beim nächsten Initiatorsignal legst Du den max-Speicher in eine weitere Speicherzelle. die Du zu Regelung verwenden kannst, anschleißend wiederholt sich alles.

EDIT: Paule hts ja schon geschrieben, ich war wohl zu langsam

Gruß Rolf
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich denke, wenn noch nichts im OB34 steht, dass die Aufrufzeit des OB34 bei deinem Problem auf 2ms vielleicht sogar auf 1ms gesetzt werden kann. Hier würde ich auch die Wandlungszeit deiner Analogkarte ansetzen. Schau doch einamal in der Hardwarekonfig auf die Aufrufzeit des OB34.

Es kann dann durchaus sein, dass bei einer entsprechend kurzen Alarmzeit der OB34 mehrmals den OB1 unterbricht, die OB1-Zykluszeit erhöt sich entsprechend. NaJa einenTod musst du halt sterben....

Weiterhin viel Erfolg!

S7_Programmer
 
Folgender Ansatz:
Wenn ein neuer Messwert größer ist als sein Altwert,wird er als Maxwert gespeichert.Ist der Ini bedämpft startet eine neue Maxwerterfassun

AWL Quellencode
Code:
FUNCTION_BLOCK "Spitzenwert"
TITLE =
VERSION : 0.1


VAR_INPUT
  Neue_Umdrehung : BOOL ;    
  Analogwert : REAL ;    
END_VAR
VAR_OUTPUT
  Max_Analog : REAL ;    
END_VAR
VAR
  FLME : BOOL ;    //Flankenmerker
  Altwert_Analog : REAL ;    
END_VAR
BEGIN
NETWORK
TITLE =

      U     #Neue_Umdrehung; //Neue Umdrehung
      FP    #FLME; 
      SPBN  m001; 
      L     0.000000e+000; //rücksetzen des Altwertes bei Neumessung
      T     #Altwert_Analog; 
m001: CLR   ; 

      L     #Analogwert; //Vergleich ob Neuwert > Altwert
      L     #Altwert_Analog; 
      >R    ; 
      SPBN  m002; 
      TAK   ; //wenn Neuwert> Alwert
      T     #Altwert_Analog; 
m002: L     #Altwert_Analog; //Maxwertausgabe pro Umdrehung
      T     #Max_Analog; 
END_FUNCTION_BLOCK
 
Hallo Paul

Zwei Menschen ein Gedanke.

Bin leider etwas zu Spät.Ist ja auch egal :confused:

Übrigens Die angegebene SPS kennt keinen OB34,sonder nur OB 35.

Viele Grüße Bernard
 
Zurück
Oben