FC_MatrixInversion - Allgemeine Informationen
Typ |
Funktion |
Verfügbar ab: |
V1.0.3.0 |
Versionen: |
Aktuelle Version |
Berechnung der inversen Matrix einer gegebenen quadratischen Matrix.
Liefert die inverse Matrix einer quadratischen Matrix der Dimension i_diDim x i_diDim zurück. Der Zeiger i_plrMatrix muss auf den Beginn des Speicherbereichs zeigen, in dem die Matrix abgelegt ist. Der Zeiger i_plrInvMatrix muss auf den Beginn des Speicherbereichs zeigen, in den das Ergebnis der Berechnung, also die inverse Matrix, kopiert werden soll. Ist eine Matrix nicht invertierbar, so spricht man von einer singulären Matrix.
Eingang |
Datentyp |
Beschreibung |
---|---|---|
i_diDim |
DINT |
Zeilen-/Spaltenzahl der Matrix, deren Inverse berechnet werden soll. Muss >= 2 sein. |
i_lrZeroLimit |
LREAL |
Numerische Nullgrenze. Matrixelemente, die betraglich kleiner als diese Zahl sind, werden als null betrachtet. Dient dazu, die Rundungsfehlerfortpflanzung zu begrenzen. Der günstigste Wert hängt von den numerischen Eigenschaften der Matrix ab. Muss > 0,0 sein. Ein gängiger Wert ist beispielsweise 1E-12. |
i_plrMatrix |
POINTER TO LREAL |
Zeiger auf den Beginn des Speicherbereichs, in dem die Matrix abgelegt ist, deren inverse Matrix berechnet werden soll. |
i_plrInvMatrix |
POINTER TO LREAL |
Zeiger auf den Beginn des Speicherbereichs, in den die inverse Matrix kopiert werden soll. |
Ausgang |
Datentyp |
Beschreibung |
---|---|---|
q_etDiag |
Allgemeingültige, bibliotheksunabhängige Aussage zur Diagnose. Ein Wert ungleich ET_Diag.Ok entspricht einer Diagnosemeldung. |
|
q_etDiagExt |
POU-spezifischer, diagnosebezogener Ausgang. q_etDiag = ET_Diag.Ok -> Statusmeldung q_etDiag <> ET_Diag.Ok -> Diagnosemeldung |
oDieser Funktionsbaustein benötigt i_diDim * i_diDim * SIZEOF(LREAL) Bytes dynamischen Speicher. Es muss daher sichergestellt sein, dass der Parameter LMCx00C\C\Konfiguration\Programm\DynIECDataSize (gesamter zur Verfügung stehender dynamischer Speicher) auf einen hinreichend großen Wert gesetzt ist.
oDie korrekte Größe der Speicherbereiche, auf die die Zeiger i_plrMatrix und i_plrInvMatrix verweisen (mindestens i_diDim * i_diDim LREALs), muss sorgfältig geprüft werden, da der Funktionsbaustein sonst einen Speicherzugriffsfehler verursacht.
oFür die Belegung und das Lesen von Elementen der beteiligten Matrizen stehen die Funktionen FC_GetMatrixElement() und FC_SetMatrixElement() zur Verfügung.
oSind die Matrizen durch Arrays gegeben und soll die inverse Matrix direkt in einem Array abgelegt werden, so können diese auch direkt (ohne Benutzung der zuvor genannten Hilfsfunktion) belegt werden. Der erste Index der Arrays ist dann der Zeilenindex der Matrizen, der zweite der Spaltenindex.
q_etDiag |
q_etDiagExt |
Enumerationswert |
Beschreibung |
---|---|---|---|
OK |
0 |
OK |
|
ControllerConditionInvalid |
75 |
Es ist zu wenig dynamischer Speicher reserviert. |
|
InputParameterInvalid |
72 |
Dim ist außerhalb des gültigen Bereichs. |
|
InputParameterInvalid |
77 |
Die Matrix ist singulär. |
|
InputParameterInvalid |
8 |
Der Zeiger InvMatrix ist ungültig. |
|
InputParameterInvalid |
69 |
Der Zeiger Matrix ist ungültig. |
|
InputParameterInvalid |
74 |
ZeroLimit ist außerhalb des gültigen Bereichs. |
|
UnexpectedProgramBehavior |
1 |
Es ist ein unbeabsichtigter Fehler während der Ausführung aufgetreten. |
Enumerationsname: |
DimRange |
Enumerationswert: |
72 |
Beschreibung: |
Dim ist außerhalb des gültigen Bereichs. |
Problem |
Ursache |
Lösung |
---|---|---|
- |
Am Eingang i_diDim wurde ein ungültiger Wert übergeben. |
Es muss gelten: i_diDim > 1 |
Enumerationsname: |
DynIecDataSizeTooSmall |
Enumerationswert: |
75 |
Beschreibung: |
Es ist zu wenig dynamischer Speicher reserviert. |
Problem |
Ursache |
Lösung |
---|---|---|
- |
Es steht kein oder nicht genügend dynamischer Speicher zu Verfügung. |
Erhöhen Sie den dynamischen Speicher Controller > Konfiguration > Programm > DynIECDataSize. |
Enumerationsname: |
MatrixSingular |
Enumerationswert: |
77 |
Beschreibung: |
Die Matrix ist singulär. |
Problem |
Ursache |
Lösung |
---|---|---|
- |
Die Matrix am Eingang i_plrMatrix ist singulär. |
Dem Eingang i_plrMatrix muss eine reguläre Matrix übergeben werden. |
Enumerationsname: |
Ok |
Enumerationswert: |
0 |
Beschreibung: |
OK |
Die inverse Matrix wurde erfolgreich berechnet.
Enumerationsname: |
PointerInvMatrixInvalid |
Enumerationswert: |
8 |
Beschreibung: |
Der Zeiger InvMatrix ist ungültig. |
Problem |
Ursache |
Lösung |
---|---|---|
- |
Am Eingang i_plrInvMatrix wurde ein Nullzeiger übergeben. |
Dem Eingang i_plrInvMatrix muss die Addresse des Speichers übergeben werden, in dem die invertierte Matrix liegt. |
Enumerationsname: |
PointerMatrixInvalid |
Enumerationswert: |
69 |
Beschreibung: |
Der Zeiger Matrix ist ungültig. |
Problem |
Ursache |
Lösung |
---|---|---|
- |
Am Eingang i_plrMatrix wurde ein Nullzeiger übergeben. |
Dem Eingang i_plrMatrix muss die Addresse des Speichers übergeben werden, in dem die Matrix liegt. |
Enumerationsname: |
UnexpectedFeedback |
Enumerationswert: |
1 |
Beschreibung: |
Es ist ein unbeabsichtigter Fehler während der Ausführung aufgetreten. |
Problem |
Ursache |
Lösung |
---|---|---|
- |
Es ist ein Fehler in der internen Abarbeitung aufgetreten. |
Bitte informieren Sie das Supportteam über diesen Fehler. |
Enumerationsname: |
ZeroLimitRange |
Enumerationswert: |
74 |
Beschreibung: |
ZeroLimit ist außerhalb des gültigen Bereichs. |
Problem |
Ursache |
Lösung |
---|---|---|
- |
Am Eingang i_lrZeroLimit wurde eine Zahl <= 0 angelegt. |
i_lrZeroLimit muss größer sein als 0. |