# Matrizen in Codesys?



## Christian68 (23 November 2012)

Hallo,

ich möchte eine Rotationsmatrix in Codesys V2.3 erstellen.

Offenbar kann man Matrizen wohl direkt nicht erstellen, sondern muss irgendwelche Umwege über Arrays gehen. Das Rechnen mit Matrizen muss man dann auch noch selbst programmieren.
Deshalb habe ich folgende Fragen:
a) Gibt es eine Bibliothek oder ähnliches, die Matrizen und Matrizenrechnen unterstützt?
b) Einige Matrixelemente  müssten "COS(alpha)" heißen. Es steht also kein direkter Zahlenwert dort, sondern es soll der Kosinus des Winkels alpha  berechnet werden. Da erscheint in meiner zusammengeschusterten "Array-Matrix" immer eine Fehlermeldung bezügl. eines fehlerhaften Initalwerts.
Geht das irgendwie?

Danke schonmal fürs lesen. Ich wäre euch wirklich sehr dankbar, wenn einer von euch dafür eine Lösung hat. Weder die Forumssuche noch google hat das was brauchbares ausgespuckt. Bin darüber ehrlichgesagt ziemlich verwundert, da ich ja wohl nicht der erste sein werde, der damit zu kämpfen hat.

viele Grüße
Christian


----------



## M_o_t (25 November 2012)

Hallo,

zu den Berechnungen kann ich dir nicht wirkich weiterhelfen, aber zu dem Fehler: die Größe der Arrays können während der Laufzeit nicht verändert werden. Wenn du also z.B. ein Array definierst mit array [0...Variable] of INT muß die Variable zuvor schon einen Wert haben. Es ist also oftmals einfacher das Array ausreichend groß zu definieren und dann halt nur den notwendigen teil wirklich nutzen

Gruß
M_o_t


----------



## PLC-Gundel (25 November 2012)

Hallo Christian,

was hast Du vor, möchtest Du den Wert Deiner Matrix bzw. Determinante mit der Regel von Sarrus berechnen ?

Habe in der Oscat Bibliothek unter Vector Mathematik sehr viele Vektor Funktionen gefunden, allerdings keine Wertberechnung einer einzelnen Determinante. Schau mal unter: Oscat Basic Doku.German 

Hilfe bietet vielleich auch dieser Beitrag über Matrizenberechnung.


----------



## PLC-Gundel (25 November 2012)

M_o_t schrieb:


> Hallo,
> 
> zu den Berechnungen kann ich dir nicht wirkich weiterhelfen, aber zu dem Fehler: die Größe der Arrays können während der Laufzeit nicht verändert werden. Wenn du also z.B. ein Array definierst mit array [0...Variable] of INT muß die Variable zuvor schon einen Wert haben. Es ist also oftmals einfacher das Array ausreichend groß zu definieren und dann halt nur den notwendigen teil wirklich nutzen
> 
> ...



Habe es so verstanden - er möchte einige Arrayelemente anstatt mit einer Variable oder Konstante mit "COS(a)" etc. füllen.
Hab zwar kein Codesys, aber hab's interessehalber mal in TwinCAT ausprobiert. Dort geht es einwandfrei, allerdings muß das Arrayelement 
unbedingt ein REAL sein!


----------



## DaHauer (26 November 2012)

Hallo,

am ehesten bekommst Matrizennotation, wenn du mit mehrdimensionalen Arrays arbeitest (hier denke ich 3). Die Verwendung der Indizes kannst du so verwenden wie es im allgemeinen für Matrizen gemacht wird.
Weder in CoDeSys noch in TwinCAT gibt es aber fertige Funktionen, die mit Matrizen umgehen können. Hier musst du dir die Funktionen selber bauen (Bsp. Skalarprodukt und Matrizenprodukt).

Vom Datentyp her musst Du sehen was für dich sinnvoll ist. Bei Rotationen und Verschiebungen nehme ich gerne ganzzahlige Datentypen, Komma wird nach rechts verschoben, und rechne die Ergebnisse dann in Real mit den gewünschten Nachkommastellen um.

cheers


----------



## LambdaFourth (26 November 2012)

Guten Morgen!
Ich würds mit nem zwei-dimensionalem Array machen. Ich bekomme in Codesys keine Fehlermeldung

matrix : ARRAY [0..2,0..2] OF REAL;
 alpha: INT := 45;
matrix[0,0] := COS(alpha); (* = 0.525322 *)

Oder habe ich das Problem falsch verstanden?


----------



## Christian68 (26 November 2012)

Hallo, 

erstmal vielen Dank für alle Antworten.
Hab ja jetzt die Antwort, dass es keine fertigen Algorithmen für Matrizenrechnungen gibt. Is zwar nicht das was ich gehofft habe, aber zumindest hab ich jetzt Gewissheit.

Ich wollte einige Matrixelmente ursprünglich und einmal zu beginn mit COS(alpha) initialieren. "alpha" sollte dann als globale Variable zur Verfügung stehen und sich ca alle 100ms ändern.
Es sollte einfach eine halbwegs elegante Lösung her. Letztendlich mach ich es jetzt halt so "MATRIX[2,2]:=COS(alpha);
MATRIX[2,3]:=-SIN(alpha);
MATRIX[2,4]:=dz2*SIN(alpha);" usw.
und schreib gemäß dem Link zum "Beitrag über Matrizenberechnung" eine Matrizenmultiplikation.
Nochmals danke für die kompetente Hilfe.


----------

