... und dann zähle wie oft jede Richtung vorkam, um irgendwie die am häufigsten vorkommende Richtung zu ermitteln.
...
Es soll zur Beobachtung von möglichen Immissionen durch die Luft verwendet werden.
Wenn Du die möglichen Immisionen beobachten willst, ist die Betrachtung,
wie oft die einzelnen Richtungen vorkommen eher unerheblich, wenn die jeweils auftretenden Geschwindigkeiten nicht mit bewertet werden. Selteneres Auftreten bei hoher Geschwindigkeit könnte mehr Luftbewegung bedeuten, als häufiges Auftreten bei niedriger.
Wie sieht es bei den vom Sensor gemeldeten Geschwindigkeiten aus? Die müssten doch auch heftig schwanken (können) bei dem "unmechanischen" MessVerfahren.
Die Windrichtungsanzeige schwankt extrem, teilweise um > 90..180° in einer Sekunde (der Sensor gibt alle ca. 0,5s einen neuen Wert aus, WinCC aktualisiert jede Sekunde)
Nur alle halbe Sekunde neue Messwerte bei sich sooo flatterhaft ändernden Werten? Jetzt nähern wir uns den Themen AbtastTheorem und StroboskopEffekt!
Wie aktuell passt denn ein GeschwindigkeitsWert zum mitgelieferten WinkelWert?
Wenn du dieses Eingangssignal auf 2Pi normierst und dann irgend wie mit der Sinus-Funktion arbeitest, ... kannst du dann dämpfen, mitteln oder wie auch immer.
Na klar, ein SinusSignal ist leichter zu glätten.
Wir hatten doch mal einen Thread zum Thema WinkelErmittlung aus zwei PotiSignalen. Letztlich den ArcTan aus einem Sinus- und Cosinus-Signal bilden.
Ein CosinusSignal lässt sich natürlich genauso glätten/mitteln, wie ein SinusSignal. Aber ich hätte groesste Bedenken, ob geglättete Sinus- und CosinusSignale über den ArcTan mehr als nur irgendeinen (gar nicht relevanten) Winkel ergeben würden!
Allein aus entweder einem Sinus- oder einem CosinusWert erhält man aber immer zwei mögliche Lösungen pro Phase statt einer eindeutigen.
Ich teile die Rose in zwei Hälften auf. 0 grad und 0 grad bei Nord und Süd. ... Dazu brauchst du einen Beiwert der dir die nord/südrichtung gibt.
Das sind also zwei um 180° gegeneinander verdrehte KoordinatenSysteme - bei der SinusCosinusVariante sind es zwei um 90° verdrehte.
Dieser Ansatz ist gar nicht sooo weit entfernt von der Sinus-Cosinus-Variante, die ich aber besser finde, weil sie per ArcTan (insbesondere wenn diejenige, praxisnahe Variante zur Verfügung steht, die mit 2 Argumenten "gefüttert" wird, nämlich mit Sinus und Cosinus statt mit dem vorab zusammengefassten 1 Argument Sinus/Cosinus) leicht mit "StandardMitteln" zu einem guten Ergebnis führt. Aber leider nur mit zueinander passenden WertePaaren von Sinus und Cosinus. Geringe Abweichungen schon eines der beiden können allerdings zu unangenehmen Fehlern in der WinkelErmittlung führen.
Tja, Harald, wie kommen wir mit Deinem Problem weiter? Die schnellen Reaktionen Deines Sensors erfordern - glaube ich - eine häufige (lieber öfter als alle 500 ms) Auswertung von Richtung und Geschwindigkeit. Für AnzeigeZwecke der aktuellen WindRichtung könntest Du - wie geplant - die ArrayElemente entsprechend der Häufigkeit inkrementieren und für die bewegten LuftMassen - statt zu inkrementieren - die Geschwindigkeiten aufsummieren.
Die ModuloFunktion kennst Du bestens und könntest damit ein gegenüber Deinem "ArrayKoordinatenSystem" verdrehtes, imaginäres auswerten. Damit sind wir bei vollmis Vorschlag.
Ich will nur hoffen, dass die Hibbeligkeit der SensorWerte realistisch die Hibbeligkeit des Windes widerspiegelt und nicht Verwirbelungen am Sensor durch den Sensor oder seine Halterung.
PS:
Evtl. WinkelWerte, die bei zu geringer Geschwindigkeit gemeldet werden, ignorieren.
PPS:
Die Modulo-Idee bereitet mir gerade KopfGrimmen und ich glaube, ich werde eine Einteilung der Richtung in ViertelGraden (0..1439) weiter verfolgen.
Mit der Einteilung in 16 Sektoren kommt man auf 22,5° und, wenn man die Sektoren dann noch um die Hälfte davon, nämlich 11,25° verdreht, sieht das ganze freundlicher aus. Z.B. der Sektor Nord mit dem ArrayIndex 0 reicht dann von -11,25° (=348,75°=1395 ViertelGrad) bis +11,25° (= 45
ViertelGrad ) u.s.w..
Damit kann man gut mit INT-Zahlen den Kreis mit (vermutlich) genügender Auflösung und schön symmetrisch einteilen.
in diesem Sinne "VBA-mässig":
Code:
Tmp.Dir = Range("A5").Value ' Winkel in ? einlesen (REAL, 0?=N, 90?=O, 180?=S, 270?=W)
xTmp& = Tmp.Dir * 4# + 45#
Do While xTmp& < 0: xTmp& = xTmp& + 1440: Loop ' "MOD zu Fuss" für neg. Werte
xTmp& = xTmp& Mod 1440
xErg& = Int(xTmp& / 90)
Range("C5").Value = xErg& ' ArrayIdx (=SektorNr, INT, 0..15) ausgeben