Mit SCL 2 Dimensionales ARRAY auslesen und zurückkonvertieren (AWL Vorschläge)

Zuviel Werbung?
-> 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

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:
So, jetzt bin ich wieder mit an Bord ...

Jetzt will ich Matrix A mit Matrix D multiplizieren gemäß:
Code:
MatxMul( MxA:= A, MxB:= D, MxC:=G)
Fehler beim kompilieren: ungültiger Datentyp. (nicht das es mich wundert) Nur wir bekomme ich den Datentyp wieder aus dem Array?

Ich muß mich hier noch mal dran hängen.
In dem dargestellten Beipiel soll MxC eine Output Matrix sein. Das ist das Problem. Du übergibst an dieser Stelle nicht eine Variable sondern einen Pointer. Dieser wird aber nicht aus deiner Funktion heraus generiert, sondern nur benutzt.

Zu Beachten bei dieser Vorgehensweise (gilt auch für den Gebrauch von ANY-Pointern) :
Im eigentlichen Ziel-Code (übersetztem Script) werden aus diesen Pointern schlußedlich angepasst Daten-(Wort) hin- und her-Kopier-Funktionen. Das schlägt sich dann shon in der Laufzeit (Zykluszeit) des Programms nieder.

Gruß
LL

Schon zum Teil in der Erklärung von Ralle enthalten ...
 
Zuletzt bearbeitet:
Zurück
Oben