WinCC 6.0 Mittelwertbildung

HarbichC

Level-1
Beiträge
11
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Bin leider nicht so sattelfest in WinCC. Ich habe folgende Aufgabenstellung: Ich soll aus einer (Archiv)variablen die sekündlich
erfasst wird laufend einen Mittelwert über 1h bilden und nach Buttonbetätigung an die Steuerung schicken. Soll so eine Art ermittelter Offset sein. Wichtig ist, das nach dem FIFO Prinzip die Mittelwertbildung laufend erfolgt, wer kann mir helfen???

Vielen Dank im voraus!
 
Hallo,
nur als Ansatz,

Lege ein Verdichtungsarchiv an, im dem Du als Zeitraum eine Stunde wählst und als "Methode" wählt Du Mittelwert.

Wie beim normalen Archiv auch, müßtest 'Du den Archierten Wert auch in einer Variablen schreiben können.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Heinz,

vielen Dank für Deinen Tip, aber ich habe mich wohl nicht richtig ausgedrückt:
Es soll eine Mittelwertberechnung nicht zu jeder Stunde erfolgen, sondern
jede Sekunde über einen Zeitraum von 1h, das geht mit einem Verdichtungsarchiv doch auch nicht, oder doch??
 
ausser einem fifo fällt mir im moment auch nichts besseres ein.

kannst du den mittelwert nicht in der steuerung berechnen?

fifo mit 3600 einträgen.
um nicht jedesmal den kompletten db zu lesen:

wenn gefüllt einmal summe aller werte bilden und in einer variablen ablegen.
jede sekunde den neuen zu dieser summe dazuaddieren und den ältesten davon abziehen.
dann durch 3600 teilen.

auf meiner hp findest du einen fifo mit dem man das machen könnte.


eine andere möglichkeit wäre ein archiv zu beschreiben und über ein script alle werte des archivs zu addieren und dann durch 3600 zu teilen.
aber bei einem takt von 1 sekunde wird das nicht besonders resourceschonend sein.
sowas hab ich mal für ein mp270 geschrieben. dort bilde ich die mittelwerte aber auch nur ein mal beim bildaufruf.
das mp projekt findest du auch auf meiner hp unter protool.
 
Hallo HarbichC,
hätte ja klappen können :D das laufend habe ich überlesen :roll:

Nun wird es etwas schwieriger,

Ansatz:
Über VB oder C die letzten archivierten Werte holen und den Mittelwert berechnen.

Den SQL Server mit einem SQL String wie " Select AVG(...) as Mittelwert where DAtum > now-1 h"

In der Hilfe wird dazu sicherlich etwas stehen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Leute Vielen Dank erstmal,

habe festgestellt, das es wohl doch nicht so einfach ist, werde es wohl mal mit der FiFO Geschichte in der Steuerung probieren, allerdings ist meine CPU schon ziemlich am Ende bezüglich Speicher.
Erschwerend muss ich dies für 30 Archivvariablen machen!
Naja, werde versuchen, ob dem Kunden nicht die Variante mit der stündlichen Mittelwertbildung reicht.

Trotzdem Klasse, das einem als "Neuer" gleich so geholfen wird!!!

Schönen Abend

mfG
HarbichC
 
hier noch eine andere idee.

du addierst in wincc jede sekunde den neuen wert zur variablen summe.
gleichzeitig zählst du einen index hoch.
mittelwert = summe / index.
das ganze machst du solange bis du deinen neuen wert aus dem verdichtungsarchiv bekommst.
diesen mittelwert dann nach summe transf. und das gleiche spielchen mit dem index von vorne beginnen.
mittelwert = summe / (index + 3600).

das ganze klappt natürlich nur, wenn die summe am ende nicht zu gross (2 147 483 647) wird.

edit:
mittelwert kann man auch so bilden.
(Altwert * (Index-1) + Neuwert) / Index
 
Hallo Volker,

jetzt macht Du mich fertig, ich verstehe ab der Berechung Mittelwert Archiv--> Transfer in Summe garnichts mehr!!

Habe versucht es mit Beipielrechungen nach zu vollziehen, klappt auch nicht.

Wäre nett, wenn Du ab dem Punkt noch ein paar zusätzliche Erklärungen
machen könntest.

Vielen Dank dafür

mfG
HarbichC
 
Zuviel Werbung?
-> Hier kostenlos registrieren
:lol:
ok.

summe ist die summe aller werte.
also:
summe.varchiv = mittelwert.varchiv * archivlänge (3600)
summe = summe.varchiv + summe.archiv
da ja die summe.varchiv 3600 werte enthält muss dies auch im teiler berücksichtigt werden.

--------------------------------------------------------------------
aber so gehts besser, da du nicht so schnell in den überlauf kommst.

mal ein beispiel für 4 werte im archiv.
10,12,14,16
archivlänge = 4

summe.archiv = 52 => mw.archiv = 52/4 = 15,5

so nun ist das archiv gefüllt und du bekommst vom verd.archiv den wert 15,5. diesen wert merken in mw.varchiv.
verd.archiv löschen und neu anlegen. index auf 0 setzen

mittelwert = (mw.varchiv * archivlänge + summe.archiv) / (archivlänge + index)

zahlenbeispiel:
mw = (15,5 * 4 + 0) / 4 = 15,5

jetzt kommt ein neuer wert ins archiv. wert = 10, index = 1
summe.archiv = wert(1)
mw = (15,5 * 4 + 10) / (4 + 1) = 62 / 5 = 12,4

jetzt kommt ein neuer wert ins archiv. wert = 11, index = 2
summe.archiv = wert(1) + wert(2)
mw = (15,5 * 4 + 21) / (4 + 2) = 73 / 6 = 12,1666

usw.
-----------------------------------------------------------
 
was mir nocheinfällt.

so ganz richtig ist ergebnis oben nicht, denn:
du bekommst ja den mw aus dem varchiv. das ist der mw der letzten stunde. nun füllst du das archiv, was ja auch wieder 1 stunde dauert.
im endefekt hast du also immer einen mw zwischen 1 und 2 stunden.

aber ganz oben schreibst du, das der wert erst bei tastendruck übertragen werden soll.

ich denke ich würde so vorgehen.
die reihenfolge der daten ist in deinem fall ja egal. (neuste muss nicht oben und älteste unten sein, oder so)

datenbank anlegen mit einem index von 1-3600.
zähler, welcher dem index entspricht, hochzählen und den eintrag dort speichern. wenn 3600 ereicht wieder bei 1 anfangen.
so hast du immer die letzte stunde in der db.
wenn der wert übertragen werden soll, db auslesen, alle werte addieren und durch 3600 teilen.
fertig! :wink:
 
Du hattest recht, alles wird gut,

deine Lösung klappt super!!

mit den Mw zwischen 1-2h ist dem Kunden egal, er möchte mindestens 1h
ob nun genau oder mehr ist im wurscht!
Auf jeden Fall haut die MW-Bildung hin.
Zukünftig werde ich erst ins Forum gehen, bevor ich den Support kontaktiere, die wollten mir gleich einen Programmierer mit der Option Sw-Connectivity Pack schicken!!
Also vielen Dank nochmal, ich hoffe ich kann mit meinem bisschen Wissen auch mal jemanden helfen,

Schönes Wochenende

HarbichC
 
Zurück
Oben