Windwert den peak erfassen

Jimm

Level-1
Beiträge
4
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,
ich erfasse an einem Wago-PFC-Steuerung, am analogen Eingang, 4-20mA, den Windwert. Den Windwert habe ich skaliert und es funktioniert soweit.
Da der Windwert sehr schnell den Wert ändert, möchte ich z.B. die Werte in ein Array füllen und wenn der Array gefüllt ist den Max-Wert/sek ausgeben, oder den peak nach einer Zeit aktualisieren.
Als Anfänger habe ich keine Idee es umzusetzen. Kann mir wer erklären wie das umzusetzen? Vielen Dank im Voraus!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,
ich erfasse an einem Wago-PFC-Steuerung, am analogen Eingang, 4-20mA, den Windwert. Den Windwert habe ich skaliert und es funktioniert soweit.
Da der Windwert sehr schnell den Wert ändert, möchte ich z.B. die Werte in ein Array füllen und wenn der Array gefüllt ist den Max-Wert/sek ausgeben, oder den peak nach einer Zeit aktualisieren.
Als Anfänger habe ich keine Idee es umzusetzen. Kann mir wer erklären wie das umzusetzen? Vielen Dank im Voraus!
Befasse dich mal mit For-Schleifen und Ringspeichern .
Wenn du einen Ringspeicher erfolgreich erstellt hast, der in gewünschten Zeitintervallen aktualisiert wird, kannst du diesen z.B in einem zweiten Array sortieren und von dort min und max Werte auswerten.
 
Ich würde da gar nicht mit einem Array arbeiten ... Mein Ansatz wäre :
- du nimmst den aktuellen Wert und vergleichst ihn mit dem Vorgänger-Wert - ist er größer überschreibst du den Vorgänger und nimmst den DateAndTime-Wert auf.
- Ist die Differenz des letzten DT-Werts zum aktuellen Wert größer als das von dir gewünschte Zeitfenster so löscht du den Peak-Wert wieder bzw. schreibst den aktuellen Windwert und den Zeitstempel weg.
- wenn du hier einigermaßen präzise sein willst solltest du in einem schnellen Intervall diese Werte einlesen ...
 
- Ist die Differenz des letzten DT-Werts zum aktuellen Wert größer als das von dir gewünschte Zeitfenster so löscht du den Peak-Wert wieder bzw. schreibst den aktuellen Windwert und den Zeitstempel weg.
Dann verwirfst Du aber alle zwischenzeitlichen Werte, die größer waren als der aktuelle...

Ich denke, ich würde auch eher dann mit einem Ringspeicher arbeiten:
Array 1..60, jede Sekunde einen Wert reinschreiben (oder nach Belieben entsprechend schneller, ggf. Array vergrößern).
Zähler auf die aktuelle Array-Position bei jedem Schreiben erhöhen. Wenn größer als Array, dann wieder bei 1 anfangen.
Und dann immer den größten Wert aus diesem Array raussuchen.
Damit das schneller geht, kann man sich ja dann ggf. die Position des größten Wertes wegspeichern, immer mit dem neuen vergleichen, nur sobald der alte dann überschrieben wurde, einmal wieder neu nach dem Größten suchen.

Aber warum Peak-Werte? Soll das ein Sicherheits-Feature sein?
Beachte, daß Du dann Deine Sicherheit bei jeder Böe auslöst, das kann nervig werden.
Ein Windwert sollte über eine Zeit t anstehen, bis ausgelöst wird.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Array 1..60, jede Sekunde einen Wert reinschreiben (oder nach Belieben entsprechend schneller, ggf. Array vergrößern).
Zähler auf die aktuelle Array-Position bei jedem Schreiben erhöhen. Wenn größer als Array, dann wieder bei 1 anfangen.
Und dann immer den größten Wert aus diesem Array raussuchen.
Damit das schneller geht, kann man sich ja dann ggf. die Position des größten Wertes wegspeichern, immer mit dem neuen vergleichen, nur sobald der alte dann überschrieben wurde, einmal wieder neu nach dem Größten suchen.
Hätte Ich auch so in etwa gemacht.
Bsp.
Jede Sekunde einen Wert aufnehmen. Nach 60sek, wenn der Speicher einmal vollgeschrieben ist den max wert rausschreiben und das ganze wie gesagt als Ringspeicher immer wiederholen. Die Max werte eines Bestimmten Zeitraumes sammeln und jeweils diese Werte vergleichen um deinen Max Wert zu aktualisieren.
 
Mein Vorschlag war als anderer Ansatz zu verstehen ...
Aber @JSEngineering und @Batavia1527 : im Sekundentakt abfragen ist absolut kontraprodultiv wenn ich einen Peak (egal ob min. oder max.) suche - was ist denn wenn der relevante Peak genau zwischen den 2 Abfragen kommt ? Deshalb aus meiner Sicht am Besten im Millisekunden-Takt abfragen ... und dann schauen ...
 
@Larry Laffer da hasst du natürlich Recht bezüglich dem Sekundentakt, war meinerseits mehr als Beispiel gemeint. Kommt natürlich auf die genaue Verwendung der Anlage und der Messwerte drauf an welche Zeitintervalle für Messungen sinnvoll wären...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Aber @JSEngineering und @Batavia1527 : im Sekundentakt abfragen ist absolut kontraprodultiv wenn ich einen Peak (egal ob min. oder max.) suche - was ist denn wenn der relevante Peak genau zwischen den 2 Abfragen kommt ?
Array 1..60, jede Sekunde einen Wert reinschreiben (oder nach Belieben entsprechend schneller, ggf. Array vergrößern).

Hab ich ja geschrieben: Nach Belieben schneller...
Die Frage ist ja, wie schnell die Werte reinkommen und am Ende immer noch: Was ist der Zweck, wie stark ist das Signal ggf. eh schon geglättet...
Wenn ich über 60s den Max-Wert haben will und dann alle ms aufnehme, dann wird das Array auch ganz schnell ganz groß und somit eventuell Sortier-/Suchzeiten höher...
Wir bekommen ja auch momentan keine weiteren Infomationen, daher fangen wir wieder fröhlich an, zu spekulieren...
 
Vielen Dank für die vielen Hinweise und Tips.
Ich habe eine Beschattungs-Steuerung der bei Wind aus Sicherheitsgründen einfahren muss.
Mein Gedanke war am analogen Eingang den Windwert zyklisch (das könnte ich mit Task anpassen) zu erfassen und den Peak als aktuellen Windwert z.B. für zwei bis fünf Sekunden zu halten oder bei einem neuen Peak den aktuellen Wert zu ersetzen. So habe ich für die Beschattungs-Steuerung immer einige Sekunden ein Windwert der maximal vorhanden war und nicht jede 1/10 s den Wert ändert.
Wäre hier eine For Schleife die bessere oder einfachere Weg?
 
Erstens: Schlau machen, wie lange der Maximalwert anliegen muß, damit die Beschattung einfahren muß. Meistens brauchst Du nicht bei jeder Böe einfahren.
Ich würde das Signal stark glätten, anstatt ungefilterte Maximalwerte zu nutzen.
Wenn dann das Signal X Sekunden über dem Schwellwert liegt (Toleranz einbauen!), dann erst einfahren.

Also glätten, vergleichen, Vergleichsergebnis auf TON legen. So lange TON an ist: Einfahren und dann das Ausfahren sperren.
Was nützen Dir Maximalwerte, wenn Du nur auf ein Limit prüfen willst?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Erstens: Schlau machen, wie lange der Maximalwert anliegen muß, damit die Beschattung einfahren muß. Meistens brauchst Du nicht bei jeder Böe einfahren.
Ich würde das Signal stark glätten, anstatt ungefilterte Maximalwerte zu nutzen.
Wenn dann das Signal X Sekunden über dem Schwellwert liegt (Toleranz einbauen!), dann erst einfahren.

Also glätten, vergleichen, Vergleichsergebnis auf TON legen. So lange TON an ist: Einfahren und dann das Ausfahren sperren.
Was nützen Dir Maximalwerte, wenn Du nur auf ein Limit prüfen willst?
Das Einfahren und Steuern macht die Beschattungssteuerung, den Windgrenzwert für die Sperre zum Ein- Ausfahren kann ich an der Beschattungs-Steuerung eintippen. Ich muss der Beschattungs-Steueurng über Modbus-Verbindung nur den aktuellen Windwert zur Verfügung stellen. Ich wollte den aktuellen Windwert nicht mit fünf Sekunden-Zyklus aktualiseren wenn inzwischen ein Windgrenzwert bereits überschritten ist. Manchmal ist jede Sekunde zum Einfahren wichtig bevor etwas kaputt geht.
 
Und was machst Du, wenn die Modbus-Verbindung mal unterbrochen ist oder die Steuerung steht? Geht dann die Beschattungssteuerung auf Nummer sicher und fährt ein?

So weit ich mich damit auskenne, gibt der Herstellt Windstärke und Zeit vor, so daß die Beschattung nicht bei jeder kleinen Böe eingefahren wird, denn das ist für die Anwender mehr als nervig.
Du überträgst also nur alle 5 Sekunden einen aktualisierten Wert?
Dann ist Dein Ansatz verständlich, aber muß ich wirklich einfahren, wenn 1ms lang ein Grenzwert anstand? Ich denke, ich würde trotzdem eher auf Glättung setzen.
 
Zurück
Oben