Rechenalgorithmen in S7

figo80

Level-1
Beiträge
13
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute,

bin gerade an einem Projekt dran und bin mir noch nicht sicher ob ich Rechenalgorithmen in C oder in S7 schreiben soll.
Es geht um Sachen wie
-Gradengleichung aus n Punkte
-Kreisgleichung aus n Punkte
-Fourieranalyse
ich würde das ganze gerne in S7 schreiben. Gibt es denn Bibliotheken die dass können?
Was mein ihr dazu?
 
Es ist ein klare Fall für SCL. SCL ist sehr Pascal-ähnlich.
Selber schreibe ich z.B. Kurvenfitting mit Least-Squares Algoritmen in SCL.

SCL ist ein Option zu STEP7. Evtl ist ein Upgrade von STEP7 auf STEP7 Pro günstiger. Dann bekommt man SCL, GRAPH und PLCSIM in ein 'Bundle'.

Ob es fertige 'Bilbliotheken' gibt mit die gewünschte Funktionen fix und fertig weiss ich nicht.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute,

bin gerade an einem Projekt dran und bin mir noch nicht sicher ob ich Rechenalgorithmen in C oder in S7 schreiben soll.

Was mein ihr dazu?

Schau dir mal SCL an.
Ist eine Hochsprache für S7 und damit kann man schon recht viel anstellen.

Gruß
Dieter
 
SCL hatte ich mir auch schon angeschaut und installiert, ich muss jetzt mal in Experimentierphase gehen da ich SCL noch nie programmiert habe.
Scheint mir aber auch der richtige Weg zu sein, in AWL würde man verrückt werden.

@Kai
Der Beitrag über FFT ist sehr Interresant, da muss ich mal einarbeiten und testen ob dass das richtige für mich ist.

Hat vielleicht jemand schonmal mit was in Richtung Geradengleichung oder Kurvengleichung gemacht?
Die Algorithmen müssten ja bekannt sein nur bin ich mir nicht sicher ob das die Rechenfähigkeit einer SPS sprengt.
Da ich z.B. aus einen Kreis mit 360 Messpunkte den radius und die Mittelpunktkoordinaten wissen sollte!
Als SPS habe ich eine CPU 319F.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
die von dir gewünschten Funktionen sind grundsätzlich mit der SPS machbar - eine leistungsfähige CPU vorausgesetzt ...
Du darfst dennoch bei komplizierteren Berechnungen (wie z.B. FFT-Analyse) nicht außer Acht lassen, das deine Zykluszeit ganz erheblich ansteigt - das sollte aber keine Hinderungsgrund sein ...

Gruß
LL
 
ja dass mit der Zykluszeit ist verständlich, während der Rechnungen müssen keine Steuerungstechnische Aufgaben gemacht werden somit ist es eigentlich egal.
 
Es ist ein klare Fall für SCL. SCL ist sehr Pascal-ähnlich.
Selber schreibe ich z.B. Kurvenfitting mit Least-Squares Algoritmen in SCL.


@JesperMP
Wäre es möglich dein Least-Squares Algorithmus in SCL zu posten.
Könnte ich eventuell auch gebrauchen und dass würde mir weiterhelfen mich in SCL einzuarbeiten. Wäre echt spitze!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hier ist ein Beispiel von lineare kurvenfitting.
Diese FB addiert eine Messpunkt.
Das durchscleifen von eine Menge von Messpunkte muss durch den aufrufene Baustein passieren.
Vor eine neue kurvenfitting muss man den Reset Eingang verwenden.

Code:
FUNCTION_BLOCK FB_KURVFIT
// by Jesper M. Pedersen
// Curvefits logged points of (x,y) to y=f(x)=a+b(x).
// The coefficients a and b are found by running through all points of x and y.
// The "weight" allows to let some points be more important than others, i.e. for "aging" of datapoints for example.
// If "weighing" or "aging" is not to be used, simply set rWeight:=1.0.
// The looping through of the datapoints is done in the calling block.
// This block updates one point per call.
// Need to be done: Calculating a "quality" of the approximated curve.
VAR_INPUT
    biReset : BOOL ;
    rx : REAL ;
    ry : REAL ;
    rWeight : REAL ;
END_VAR
VAR_OUTPUT
    ra : REAL ;
    rb : REAL ; 
END_VAR
VAR_TEMP
    rDivisor :REAL ;
    rWeight_squared : REAL ;
END_VAR
VAR
    rn : REAL ;
    rsum_y : REAL ;
    rsum_x : REAL ;
    rsum_xsquared : REAL ;
    rsum_xy : REAL ;
    
END_VAR
IF biReset THEN
    rn := 0.0 ;
    rsum_y := 0.0 ;
    rsum_x := 0.0 ;
    rsum_xsquared := 0.0 ;
    rsum_xy := 0.0 ;
    ra := 0.0 ;
    rb := 0.0 ;
END_IF ;
IF NOT biReset THEN
    IF NOT (rx=0.0 AND ry=0.0) THEN // ignore if empty values
        // first add up all summed values
        rn := rn + rWeight ;  
        rsum_y := rsum_y + (rWeight * ry) ;
        rsum_x := rsum_x + (rWeight * rx) ;
        rWeight_squared := rWeight * rWeight ;
        rsum_xsquared := rsum_xsquared + (rWeight * rx * rx) ;
        rsum_xy := rsum_xy + (rWeight * rx * ry) ;
        //then do the actual curvefit
        rDivisor := (rn * rsum_xsquared) - (rsum_x * rsum_x) ;
        ra := ((rsum_y * rsum_xsquared) - (rsum_x * rsum_xy))/rDivisor ;
        rb := ((rn * rsum_xy) - (rsum_x * rsum_y))/rDivisor ;
    END_IF ;
END_IF  ;
END_FUNCTION_BLOCK
 
Zurück
Oben