Step 7 Steigung/Anstieg berechnen in SCL

Redstup

Level-1
Beiträge
7
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute,
ich habe als Werkstudent ein neues Projekt erhalten was mich ein wenig fertig macht...Ich soll einen FB schreiben der von aufgenommenen Messwerten die Steigung berechnen soll. Das speichern der Messwerte in einen Array der in einem DB liegt hab ich schon fertig bekommen( dies geschieht in FuP und AWL). Die Steigung soll am Ende über einen Zeitraum von ca. 5min gehen und mögliche Fehler durch Spikes sollen minimiert werden. Es liegt also ein Array mit ca. 300 Werten vor und die Berechnung läuft neben dem einlesen der Werte parallel. Dadurch würde ja eine Regression nicht funktionieren richtig?

Mein Vorgang wäre in SCL den Array auf zu rufen und in einer for-Schleife eine mittlere Steigung über 3 Werte zu berechnen, ungefähr so:
Steigung= (Wert[1]-Wert[0]+Wert[2]-Wert[1]+Wert[2]-Wert[0])/3 (wobei Wert[Index] ist)
Die Rechnung von dem Mittelwert sollte doch mögliche Spikes berichtigen oder?

Die Steigungswerte würde ich dann in einen weiteren Array im selben DB speichern und hier das selbe nochmals machen nur mit dem ersten und letzen Wert, dies müsste dann annähernd die Steigung sein die das System ( wahrscheinlich nur Temperaturmessung) nach 5min mit Spikes hat oder?

Was mein Problem ist, ist die Syntax für das aufrufen des Arrays...Vllt. hat ja auch jemand eine bessere Möglichkeit oder weiß mehr darüber?

So sieht die for-Schleife erstmal mit falschem Array Aufruf aus.
Code:
....
BEGIN
// Anweisungsteil
i:=0;  // counter als int
x:=19; // Anzahl an Elementen im Array-> DB hat symbolischen Namen Werte, Array hat den Namen Werte und ist vom Typ Real


FOR Werte.Werte[i*4] TO Werte.Werte[x*4] // *4 wegen Addressen 0.0;4.0;8.0...


Steigung=(Werte.Werte[(i+1)*4]-Werte.Werte[i*4]+Werte.Werte[(i+2)*4]-Werte.Werte[(i+1)*4]+Werte.Werte[(i+2)*4]-Werte.Werte[i*4])/3
//Steigung=(Werte.Werte[4.0]-Werte.Werte[0.0]+Werte.Werte[8.0]-Werte.Werte[4.0]+Werte.Werte[8.0]-Werte.Werte[0.0])/3
//0.0->1. Wert im Array 4.0->2. Wert 8.0->3. Wert


Werte.Steigung[i*4]=Steigung // Speichern der errechneten Werte im DB: Werte und dem Array: Steigung


i=i+1;
END_FUNCTION_BLOCK

Ich hoffe ich konnte das halbwegs erklären,MfG Red:)
 
Code:
FOR #i := 0 TO 19 BY 1 DO
    #Steigung := (#Werte.Werte[#i + 1] - #Werte.Werte[#i * 4] + #Werte.Werte[#i + 2] - #Werte.Werte[#i + 1] + #Werte.Werte[(#i + 2) * 4] - #Werte.Werte[#i * 4]) / 3;
END_FOR;

Ohne jetzt Deine Formel angeschaut oder geprüft zu haben scheint mir nur das Problem mit dem richtigen Aufruf der FOR-Schleife zu sein.
Das sähe dann ja so aus.

Versuchst Du eine nicht-lineare Steigung zu berechnen oder eine lineare? Bin mir grad nicht ganz sicher was Du meinst.

Könntest auch
Code:
FOR #i := 0 TO 76 BY 4 DO
    #Steigung := (#Werte.Werte[#i + 1] - #Werte.Werte[#i * 4] + #Werte.Werte[#i + 2] - #Werte.Werte[#i + 1] + #Werte.Werte[(#i + 2) * 4] - #Werte.Werte[#i * 4]) / 3;
END_FOR;
meinen, dann würde i immer um 4 addiert und dann aufgerufen werden. Also I=0, I=4, I=8, ...
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Steigung= (Wert[1]-Wert[0]+Wert[2]-Wert[1]+Wert[2]-Wert[0])/3 (wobei Wert[Index] ist)
Code:
[FONT=courier new]Wert[1]-Wert[0]+Wert[2]-Wert[1]+Wert[2]-Wert[0] = 
Wert[1]-Wert[1] -Wert[0]-Wert[0] +Wert[2]+Wert[2] =
       0          - 2 * Wert[0]   + 2 * Wert[2] =
2 * Wert[2] - 2 * Wert[0] =
2 * (Wert[2] - Wert[0]) = ???
[/FONT]
Das meinst Du doch nicht?

Was mein Problem ist, ist die Syntax für das aufrufen des Arrays...
Eines Deiner Probleme ist das " * 4 ".
FOR Werte.Werte[i*4] TO Werte.Werte[x*4] // *4 wegen Addressen 0.0;4.0;8.0...
Mit dem Kommentar meinst Du anscheinend die ByteAdressen, auf denen die Elemente des Array beginnen.
Lass " * 4 " um HimmelsWillen aus Deinen Überlegungen weg!

Ein weiteres Problem ist der SchleifenKopf, in dem bei Dir "nur am Rande" der Index vorkommt. Hier wird nur angegeben, mit welchen Indizes die Schleife arbeiten soll.
FOR Index=0 to irgendwas // oder FOR Index=1 to irgendwas, jenachdem, mit welchem Index Dein Array beginnt.
x = Werte.Werte[Index]

i=i+1; ist überflüssig, das macht die FOR-Schleife schon automatisch.

Ein weiteres Problem ist das fehlende Ende der FOR-Schleife, siehe escrides Beitrag in #2

Du willst Steigungen berechnen? Dann benötigst Du immer zwei WertePaare, z.B. Wert1 zur Zeit1, Wert2 zur Zeit2, . . .
Steigung1 = (Wert2-Wert1)/(Zeit2-Zeit1)
Steigung2 = (Wert3-Wert2)/(Zeit3-Zeit2)
u.s.w.
Mittlere SteigungsWerte kannst Du dann z.B. zu
SteigungM1_5 = (Wert5-Wert1)/(Zeit5-Zeit1) berechnen.

Gruss, Heinileini
 
Zuletzt bearbeitet:
Code:
Du willst Steigungen berechnen? Dann benötigst Du immer zwei Werte[B]Paare[/B], z.B. Wert1 zur Zeit1, Wert2 zur Zeit2, . . .
Steigung1 = (Wert2-Wert1)/(Zeit2-Zeit1)
Steigung2 = (Wert3-Wert2)/(Zeit3-Zeit2)

 
Gruss, Heinileini[/QUOTE]

Bräuchte er nicht wenn die Werte immer genau eine Sekunde auseinander wären, aber dazu schrieb er nichts :confused:
 
Zurück
Oben