Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Results 1 to 5 of 5

Thread: Steigung/Anstieg berechnen in SCL

  1. #1
    Join Date
    07.08.2018
    Location
    Magdeburg
    Posts
    7
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Frage


    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
    Reply With Quote Reply With Quote Steigung/Anstieg berechnen in SCL  

  2. #2
    Join Date
    05.06.2018
    Location
    Kreis Osnabrück<>Bad Oeynhausen
    Posts
    106
    Danke
    14
    Erhielt 10 Danke für 9 Beiträge

    Default

    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, ...
    Last edited by escride1; 08.04.2019 at 12:59.

  3. #3
    Join Date
    25.06.2017
    Location
    Oerlinghausen
    Posts
    1,854
    Danke
    156
    Erhielt 342 Danke für 283 Beiträge

    Default

    Quote Originally Posted by Redstup View Post
    Steigung= (Wert[1]-Wert[0]+Wert[2]-Wert[1]+Wert[2]-Wert[0])/3 (wobei Wert[Index] ist)
    Code:
    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]) = ???
    
    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
    Last edited by Heinileini; 08.04.2019 at 13:35.

  4. #4
    Join Date
    19.02.2015
    Location
    Hamburg
    Posts
    71
    Danke
    11
    Erhielt 11 Danke für 8 Beiträge

    Default

    Quote Originally Posted by Heinileini View Post
    [CODE]

    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)


    Gruss, Heinileini
    Bräuchte er nicht wenn die Werte immer genau eine Sekunde auseinander wären, aber dazu schrieb er nichts

  5. #5
    Join Date
    25.06.2017
    Location
    Oerlinghausen
    Posts
    1,854
    Danke
    156
    Erhielt 342 Danke für 283 Beiträge

    Default


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Quote Originally Posted by mek_meik View Post
    . . . , aber dazu schrieb er nichts
    Eben! Darum dachte ich, ich könnte mal so nebenbei daran erinnern! Wo die Werte dann hergenommen werden, ist mir ja sowas von egal, aber in den Überlegungen zum Lösungsweg sollten sie wenigstens noch durch den Hinterkopf geistern!

Similar Threads

  1. Twincat 3 Steigung berechnen
    By flo_ffb in forum CODESYS und IEC61131
    Replies: 19
    Last Post: 01.02.2019, 07:21
  2. Drehzahl in SCL berechnen
    By Rokko in forum Programmierstrategien
    Replies: 0
    Last Post: 01.03.2016, 19:25
  3. 2^x berechnen
    By TimoK in forum Simatic
    Replies: 4
    Last Post: 23.02.2010, 09:31
  4. Sprung einer Steigung ermitteln
    By DennisBerger in forum Simatic
    Replies: 25
    Last Post: 30.06.2009, 17:33
  5. Anstieg von Analogwerten auswerten
    By mclear in forum Simatic
    Replies: 5
    Last Post: 18.07.2006, 13:06

Tags for this Thread

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •