- Beiträge
- 15.414
- Reaktionspunkte
- 4.043
-> Hier kostenlos registrieren
So, ich hab mal was probiert. Die Variante mit Any schein bei FC nicht so einfach zu funktionieren, daher hab ich es mal mit FB versucht. Wie es aussieht, kann man dann aber doch gleich die Struct durchreichen. Deshalb hab ich folgende Konstellation zum Test gewählt:
OB1 --> Baustein "Aufruf" ruft Baustein "SubAufruf" mit Übergabe der Martix als Parameter --> Baustein "Subaufruf" ruft Baustein "MatMul" und reicht die Matix durch. Dabei hab ich eine Multiinstanz gewählt, das spart einen DB, es geht aber auch ohne Multiinstanz.
OB1
FC101 - "Aufruf"
FB99 - "SubAufruf"
FB100 - MatMul
Der Code darin ist nur zum Testen, stellt nicht die Multiplikation einer Matritze da!
Hoffe, das hilft dir weiter, wäre auf jeden Fall die einfachste Variante. Allerdings etwas Datenintensiv, da der InstanzDB nochmals die Matrizen enthält. Mit TempVar wäre man wahrscheinlich ohnehin an die Grenzen der S7 gestoßen, da eine 10x10 Real-Matritze schon fast die Standardeinstellungen für lokale Variablen sprengt und diese nur bei 400-er und VIPA Speed7 verstellt werden können.
OB1 --> Baustein "Aufruf" ruft Baustein "SubAufruf" mit Übergabe der Martix als Parameter --> Baustein "Subaufruf" ruft Baustein "MatMul" und reicht die Matix durch. Dabei hab ich eine Multiinstanz gewählt, das spart einen DB, es geht aber auch ohne Multiinstanz.
OB1
Code:
CALL "Aufruf"
RET_VAL:=MW10
FC101 - "Aufruf"
Code:
FUNCTION Aufruf : INT
VAR_TEMP
// temporäre Variablen
Erg: Int;
END_VAR
// Anweisungsteil
SubAufruf.DB1(MxA2 := "Matrixarray".A // IN: STRUCT
,MxB2 := "Matrixarray".D // IN: STRUCT
);
"Matrixarray".G := DB1.MxC2; // OUT: STRUCT
Aufruf := 101;
END_FUNCTION
FB99 - "SubAufruf"
Code:
FUNCTION_BLOCK SubAufruf
VAR_INPUT
MxA2: MATRIX;
MxB2: MATRIX;
END_VAR
VAR_OUTPUT
MxC2: MATRIX;
END_VAR
VAR_TEMP
// temporäre Variablen
Erg: INT;
END_VAR
VAR
// statische Variablen
MatMul_Stat: MatMul;
END_VAR
// Anweisungsteil
MatMul_Stat(MxA2 := MxA2 // IN: Struct
,MxB2 := MxB2 // IN: Struct
,MxC2 := MxC2 // INOUT: Struct
);
END_FUNCTION_BLOCK
FB100 - MatMul
Der Code darin ist nur zum Testen, stellt nicht die Multiplikation einer Matritze da!
Code:
FUNCTION_BLOCK MatMul
VAR_INPUT
MxA2: Matrix;
MxB2: Matrix;
END_VAR
VAR_IN_OUT
MxC2: Matrix;
END_VAR
VAR_TEMP
// temporäre Variablen
END_VAR
VAR
// statische Variablen
END_VAR
// Anweisungsteil
MxC2.elemente[1,1] := MxA2.elemente[1,1] + MxB2.elemente[1,1];
MxC2.elemente[2,1] := MxA2.elemente[2,1] + MxB2.elemente[2,1];
END_FUNCTION_BLOCK
Hoffe, das hilft dir weiter, wäre auf jeden Fall die einfachste Variante. Allerdings etwas Datenintensiv, da der InstanzDB nochmals die Matrizen enthält. Mit TempVar wäre man wahrscheinlich ohnehin an die Grenzen der S7 gestoßen, da eine 10x10 Real-Matritze schon fast die Standardeinstellungen für lokale Variablen sprengt und diese nur bei 400-er und VIPA Speed7 verstellt werden können.
Zuletzt bearbeitet: