Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 3 von 3 ErsteErste 123
Ergebnis 21 bis 22 von 22

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

  1. #21
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.220
    Danke
    533
    Erhielt 2.696 Danke für 1.948 Beiträge

    Standard


    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.
    Geändert von Ralle (21.06.2008 um 13:32 Uhr)
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  2. #22
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.712
    Danke
    398
    Erhielt 2.398 Danke für 1.998 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    So, jetzt bin ich wieder mit an Bord ...

    Zitat Zitat von Mtroniker Beitrag anzeigen
    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 ...
    Geändert von Larry Laffer (21.06.2008 um 20:53 Uhr) Grund: Schon zum Teil in der Erklärung von Ralle enthalten ...

Ähnliche Themen

  1. Index aus Array auslesen
    Von heri1980 im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 17.09.2010, 14:54
  2. 2 dimensionales Array
    Von Airpower im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 31.01.2010, 10:19
  3. Warum kann S7 nur 6-dimensionales Feld (Array)?
    Von bischkul im Forum Simatic
    Antworten: 15
    Letzter Beitrag: 26.10.2009, 21:14
  4. Übergabe variables 2-dimensionales Array of INT als VAR_IN_OUT
    Von grosser_marco im Forum CODESYS und IEC61131
    Antworten: 2
    Letzter Beitrag: 09.09.2009, 08:47
  5. opc Array auslesen
    Von Ernst im Forum HMI
    Antworten: 1
    Letzter Beitrag: 19.07.2009, 10:12

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •