# Ableitung und inverse Matrix in SPS programmieren



## businesskasper (23 Oktober 2013)

Hallo zusammen,

ich habe zwei grundlegende Fragen zur Programmierung in Structured Text nach IEC 61131-3 und freue mich über zahlreiche Unterstützung. Ich arbeite aktuell hauptsächlich mit MATLAB/Simulink, wo mir grafische Blöcke bzw. auch vorgefertigte Funktionen helfen. 
Ich möchte ein Polynomfitting (in MATLAB heißt der Befehl polyfit) mit einer beliebigen Anzahl an Polynom-Stützpunkten und einem Polynomgrad von 3-8 durchführen. 

Aus meiner Sicht brauche ich dazu hauptsächlich die Möglichkeit zur *Bildung einer inversen Matrix* (zur Bestimmung der Polynom-Koeffizienten) und zum *Ableiten *(zur Bestimmung des Wendepunkts). 

Hat jemand schon mal so etwas SPS-lauffähig umgesetzt oder weiß, wie es geht? 

LG


----------



## ducati (23 Oktober 2013)

Naja, eine SPS ist keine Matheprogramm und auch nicht Excel...

Ich weiss ja nicht, was Du machen willst/musst. Aber die Messreihe würd ich extern (z.B. in Matlab) Fitten, und das entstehende Polynom dann in der SPS verwenden. Ich hab grad keine Anwendung vor Augen, wo so ein Polynom in Echtzeit auf der SPS bestimmt werden sollte/kann...

Jedenfalls kenn ich auch keine fertigen Funktionen. Wenn Du es selber machen willst: die SPS kann erstmal keine höheren algebraischen Aufgaben lösen:

Zur Inversen Matrix hab ich auf die schnelle das hier gefunden: http://www.arndt-bruenner.de/mathe/scripts/inversematrix.htm

Zum Ableiten nimmst Du Dir ein numerisches Verfahren Deiner Wahl und programmierst das für die SPS nach... (

Aber wie hoch da die Zykluszeit wird, bzw. wie man das auf mehrere Zyklen aufteilt wird dann das spannende...


----------



## ducati (23 Oktober 2013)

Vielleicht ist es einfacher, gleich einen Optimierungsalgorithmus zu verwenden, welcher mit SPS-Grundrechenoperationen auskommt...

z.B. https://de.wikipedia.org/wiki/Downhill-Simplex-Verfahren

Aber welches Optimierungsverfahren ist für welche Anwendung die Beste? Darüber haben sich schon viele den Kopf zerbrochen.

Naja, jedenfalls den Sinn, das auf ner SPS laufen zu lassen, seh ich leider immer noch nicht...


----------



## Larry Laffer (23 Oktober 2013)

@Ducati:
Ich kann jetzt zwar zu der obien Problematik noch nicht wirklich etwas beisteuern ... auf der anderen Seite habe ich hinsichtlich Berechnungen (auch komplexer Natur) noch nicht feststellen müssen, dass man da etwas mit der SPS nicht umsetzen könnte. Man muss natürlich hier in Kauf nehmen, dass durch so etwas die Dauer eines Zyklus kräftig ansteigt ... aber wenn das Konzept das hergibt ... ich muss ja zu dem Zeitpunkt einer solchen Auswertung keine zeitkritischen Maschinenfunktionen auslösen ...

Gruß
Larry


----------



## ducati (24 Oktober 2013)

Naja, solche iterativen Berechnungen dauern schon... Je nach Komplexität und geforderter Genauigkeit ("beliebige Anzahl Messwerte, Polynom 8. Grades!") können da schon mal 100000 Schleifendurchläufe notwendig sein. Wobei der TE ja nicht erwähnt hat, welchen Optimieralgorithmus er verwenden will.

Da gibt's ja 1000de Mathematiker, welche sich mehr oder weniger effektive Algorithmen ausdenken. Man könnte ja mal schauen, wie lange Matlab mit polyfit zum Berechnen benötigt, und das dann auf die Zykluszeit der SPS versuchen hochzurechnen...

Also umsetzbar mit einer SPS ist das sicherlich, nur die Frage mit welchem Aufwand und mit welchem Ergebnis (Genauigkeit, Berechnungsdauer)

Gruß.


----------



## godi (24 Oktober 2013)

ducati schrieb:


> Also umsetzbar mit einer SPS ist das sicherlich, nur die Frage mit welchem Aufwand und mit welchem Ergebnis (Genauigkeit, Berechnungsdauer)



Probieren geht über Studieren! 

Ich würde mir mal Beispielcode in C ansehen. Diese kann man im ersten Schritt mal leicht nach ST/SCL portieren.
Danach sieht man ja mal was mit der Zykluszeit los ist und ob die Genauigkeit noch akzeptabel ist.
Danach kann man noch immer mit dem zerlegen der Schleifen beginnen damit diese auf meherere Zyklen aufgeteilt werden, und sonstige Optimierungen.

Vielleicht hier noch was interessantes:
http://de.wikipedia.org/wiki/Polynominterpolation
http://www.zeiner.at/informatik/c/Matrix.html


----------



## drfunfrock (24 Oktober 2013)

Ich würde soetwas versuchen mit einem Tool, das passt und das wäre Python mit numpy. Python ist der Server und deine SPS der TCP/IP client. Der Server-Code ist nicht weiter aufwendig. Es werden etwa 30 Zeilen. Grundgedanke ist, dass du ein Kommando mit der Matrix an den Server lieferst und der Server die Inverse zurücsendet. Es würde ja auch mit RS232 gehen. Das Bestimmen einer Inversen Matrix kann zu nummerischen Instabilitäten führen, die dir ein falsches Ergebnis liefern. Da vertraue ich lieber auf externe Werkzeuge, die diese Probleme richtig behandeln.


----------



## Blockmove (24 Oktober 2013)

Ich würde auch den Ansatz von drfunrock vorziehen.
Viele SPSen arbeiten nur mit 32Bit-Realzahlen. Da werden die Rundungsfehler ganz nett heftig bei iterativen Rechnungen.

Gruß
Dieter


----------



## LowLevelMahn (25 Oktober 2013)

Matrix-Rechnung mit viele Durchläufen und einfacher Genauigkeit REAL=32bit float, LREAL(ab S71200) = 64bit double 
kann ganz schön schlechte Ergebnisse liefern - besonders im Vergleich mit MATLAB  - klar kann man alles portieren - aber die Präzision laesst sich
nicht soo einfach "nachbauen", ganz davon abgesehen das die SPS keine starke FPU hat und auch nicht dafür geschaffen wurde komplexe/iterative Mathe durchzuknebeln

ich würde eher ein kleines PC Programm schreiben und das per TCP/IP von der S7 füttern/abhorchen - dann kannst du auch deinen Code weiterverwenden
- oder einen kleine embedded PC oder sowas an die SPS drannhängen (falls es etwas industrietauglicher sein soll)


----------



## ducati (25 Oktober 2013)

naja, so dringend scheints den TE ja nicht zu interessieren...


----------



## drfunfrock (25 Oktober 2013)

LowLevelMahn schrieb:


> Matrix-Rechnung mit viele Durchläufen und einfacher Genauigkeit REAL=32bit float, LREAL(ab S71200) = 64bit double
> kann ganz schön schlechte Ergebnisse liefern - besonders im Vergleich mit MATLAB  - klar kann man alles portieren - aber die Präzision laesst sich
> nicht soo einfach "nachbauen", ganz davon abgesehen das die SPS keine starke FPU hat und auch nicht dafür geschaffen wurde komplexe/iterative Mathe durchzuknebeln
> 
> ...



Das Problem mit den Ungenauigkeiten wirst du auch mit einem PC haben. Du musst die Bedg. für die Existenz der Inversen prüfen, bevor du loslegst. Numpy selbst benutzt Lapack-Funktionen. Es kann sein, das Matlab hier besser ist, aber das kostet auch. Eine weitere Alternative is Octave, der OpenSource Matlab clone.


----------



## Blockmove (26 Oktober 2013)

drfunfrock schrieb:


> Das Problem mit den Ungenauigkeiten wirst du auch mit einem PC haben.



Für den PC gibt es eigentlich für nahezu jede Programmiersprache math. Bibliotheken mit erweiterten numerischen Datentypen.
Damit sollte sich die nötige Genauigkeit erreichen lassen.

Ansonsen ist Octave sicher eine gute Wahl zur Lösung des Problems.

Gruß
Dieter


----------

