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

Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 22

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

  1. #11
    Mtroniker ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    18.06.2008
    Beiträge
    9
    Danke
    12
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    @ Larry Laffer
    Wenn ich es richtig verstanden habe (Feedback erwünscht), dann benötigst du den FC eigentlich nur um deine Matrix auch von anders woher beschreiben zu können ...?LL
    Also, die FC's benötige ich für die Berechnung von Matrizen. z.B. um eine Matrix zu Transponieren oder zwei Matrizen miteinander zu multiplizieren. Dort sind die Rechenregeln für Matrizen hinterlegt. Wie es auf jeden Fall funktioniert (Wenn Matrizen Fest vorgegeben werden! (jedoch nicht gewünscht)):
    Code:
    FUNCTION_BLOCK FB1
    
    VAR
      A, B, C  : MATRIX;
    END_VAR
       A.zeilenzahl:= 2;  // Deklaration einer 2x2 Matrix
       A.spaltenzahl:= 2;
       A.elemente[1,1]:= 11;
       A.elemente[1,2]:= 12;
       A.elemente[2,1]:= 21;
       A.elemente[2,2]:= 22;
       
       B.zeilenzahl:= 2;
       B.spaltenzahl:= 2;
       B.elemente[1,1]:= 0.11;
       B.elemente[1,2]:= 12;
       B.elemente[2,1]:= 21;
       B.elemente[2,2]:= 22;
    
       MxMul( MxA:= A, MxB:= B, MxC:= C);  // A*B=C  (Matrix Multiplikation)
       //
    END_FUNCTION_BLOCK
    
    //---------------------------------------------------------------------------
    DATA_BLOCK DB1 FB1
    BEGIN
    
    END_DATA_BLOCK
    
    //---------------------------------------------------------------------------
    ORGANIZATION_BLOCK OB1
     //call
    VAR_TEMP
      info : ARRAY[0..19] OF BYTE; //reserviert
    END_VAR
       FB1.DB1();
    END_ORGANIZATION_BLOCK
    Um meine Matrizen nicht fest vorzugeben wurde mittels FOR-Schleifen in die elemente der Matrix geschrieben, dessen Werte im DB bzw. DB's abgelegt wurden.
    [code] FOR i := 1 TO input1*input2 BY 1 DO
    A.elemente[i,i] := DWORD_TO_REAL (DB10.DBD[i*4-4]); [/quote]Wenn Sie nochmal in meinen letzten Beitrag gucken, liegt nun in dem DB eine Diagonalmatrix. Wie Sie mir ja gesagt haben mit der Dimension 1. Meine Funktionen erwarten jedoch ein zwei Dimensionales Array (aus Matrix UDT "Type Matrix") als INPUT.
    Code:
    VAR_INPUT
        MxA: MATRIX;
        MxB: MATRIX;
    END_VAR
    
    VAR_OUTPUT
        MxC: MATRIX;
    END_VAR
    Die Matrizen "A,D,E" (siehe letzten Beitrag Bild 1.2) liegen als ein Dimensionale Arrays im DB. Wie kann ich die wiederum an meine FC'S übergeben, die den Datentyp Matrix als Input erwarten.

    Der Vorteil an der ganzen Überlegung liegt darin, die Matrizen Global von außen vorgeben zu können und für jede zwischenberechnungen das Ergebnis in einen separaten DB abzulegen, damit mit dem Zwischenergebnis weitergerechnet werden kann. Das soll eigentlich die Bearbeitungsschritte kürzen, da bestimmte zwischenergebnisse an anderen stellen benötigt werden "könnten".
    Jetzt sollte die Problemstellung bei Ihnen sehr nahe gekommen sein.
    Geändert von Mtroniker (20.06.2008 um 20:39 Uhr)

  2. #12
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.712
    Danke
    398
    Erhielt 2.397 Danke für 1.997 Beiträge

    Standard

    Zum letzten Punkt:
    Hierfür wäre der Any-Pointer prädestiniert.
    Der genannte übergibt die Informationen eines Datenbereichs an eine andere Routine. Er könnte also so aussehen :
    Code:
    DB1.DBX814.0 Byte 404
    oder auch
    DB1.DBX818.0 REAL 100
    An dieser Stelle kommt aber lediglich eine Bereichs-Information zum Tragen. es halt nur ein Pointer. Derselbe müßte in der Ziel-Prozedur wieder zerlegt werden. Hier wäre es dann aber gar kein Problem mehr, die Daten in ein vollkommen anderes ARRAY zu schreiben.

    Eine andere Möglichkeit, die ich sehe, wäre, dem Quell-FB schon gleich die Info zu geben, das und wo er die (oder auch bestimmte) Daten hinzuschreiben hätte.

    Passt das jetzt für dein Problem ?

    Gruß
    LL

  3. Folgender Benutzer sagt Danke zu Larry Laffer für den nützlichen Beitrag:

    Mtroniker (20.06.2008)

  4. #13
    Registriert seit
    20.06.2003
    Ort
    Sauerland.NRW.Deutschland
    Beiträge
    4.850
    Danke
    78
    Erhielt 800 Danke für 543 Beiträge

    Standard

    zu meinem verständnis.

    dein typ matrix hat nicht immer die gleiche länge.
    die länge ergibt sich aus zeilen * spalten ? richtig?
    z.b.
    zeilen = 2, spalten = 3
    => elemente array(1..2,1..3) richtig?

    nun möchtest du, das der udt matrix automatisch so aufgebaut wird und dann so aussieht ?
    Code:
    STRUCT
        zeilenanzahl: INT := 2;
        spaltenanzahl: INT := 3;
        elemente: ARRAY[1..2,1..3] OF REAL;
    END_STRUCT
    das geht nicht.
    du kannst dir zwar die adressen berechnen wo a,d,e beginnt und auch die länge des benötigten dbs errechnen können.
    aber in der onlineansicht des db wirst du das nicht so sehen können da du einen udt nicht aus dem prog heraus ändern kannst. die anzahl der werte im array lässt sich leider nicht variabel gestallten
    wie z.b. so
    elemente: ARRAY[1..zeilen,1..spalten] OF REAL

    programmtechnisch was die funktion betrifft ist das natürlich machbar. der steuerung ist es völlig egal (hautsache der db ist lang genung) was du für einen text du am db stehen hast. der ist nur für uns zum besseren verständnis.
    Geändert von volker (20.06.2008 um 12:51 Uhr)
    .
    mfg Volker .......... .. alles wird gut ..

    =>Meine Homepage .. direkt zum Download

    Meine Definition von TIA: Total Inakzeptable Applikation

  5. Folgender Benutzer sagt Danke zu volker für den nützlichen Beitrag:

    Mtroniker (20.06.2008)

  6. #14
    Mtroniker ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    18.06.2008
    Beiträge
    9
    Danke
    12
    Erhielt 0 Danke für 0 Beiträge

    Standard

    @ Volker
    Zitat Zitat von volker Beitrag anzeigen
    zu meinem verständnis.

    dein typ matrix hat nicht immer die gleiche länge.
    die länge ergibt sich aus zeilen * spalten ? richtig?
    z.b.
    zeilen = 2, spalten = 3
    => elemente array(1..2,1..3) richtig?

    nun möchtest du, das der udt matrix automatisch so aufgebaut wird und dann so aussieht ?
    Code:
     elemente: ARRAY[1..zeilen,1..spalten] OF REAL
    Alles richtig so weit. Gut, die UDT Variabel zu gestalten wäre dann geklärt. Das geht bei UDT's dann nicht. Damit kann ich leben. Wie kann aber nun das Array aus Bild 1.1 bzw. Bild 1.2 [z.B. die Matrix A und D] meiner Funktion als Bausteinparameter übergeben werden, der als INPUT
    Code:
    VAR_INPUT
        MxA: MATRIX;
        MxB: MATRIX;
    END_VAR
    
    VAR_OUTPUT
        MxC: MATRIX;
    END_VAR
    Matrix erwartet.
    z.B.
    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?

  7. #15
    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

    Ich hab das immer noch nicht so gerafft, hab mal Folgendes probiert. Die Array werden per UDT definiert und in einem Datenbaustein abglegt.

    AWL-Quelle:
    Code:
    TYPE "MATRIX"
      STRUCT 	
       zeilenanzahl : INT ;	
       spaltenanzahl : INT ;	
       elemente : ARRAY  [1 .. 10, 1 .. 10 ] OF REAL ;	
      END_STRUCT ;	
    END_TYPE
    
    DATA_BLOCK "Matrixarray"
    TITLE =
    VERSION : 0.1
    
    
      STRUCT 	
       A : "MATRIX";	
       D : "MATRIX";	
       G : "MATRIX";	
      END_STRUCT ;	
    BEGIN
     
    END_DATA_BLOCK
    
    ORGANIZATION_BLOCK "Main"
    TITLE = "Main Program Sweep (Cycle)"
    VERSION : 0.1
    
    
    VAR_TEMP
      OB1_EV_CLASS : BYTE ;	//Bits 0-3 = 1 (Coming event), Bits 4-7 = 1 (Event class 1)
      OB1_SCAN_1 : BYTE ;	//1 (Cold restart scan 1 of OB 1), 3 (Scan 2-n of OB 1)
      OB1_PRIORITY : BYTE ;	//Priority of OB Execution
      OB1_OB_NUMBR : BYTE ;	//1 (Organization block 1, OB1)
      OB1_RESERVED_1 : BYTE ;	//Reserved for system
      OB1_RESERVED_2 : BYTE ;	//Reserved for system
      OB1_PREV_CYCLE : INT ;	//Cycle time of previous OB1 scan (milliseconds)
      OB1_MIN_CYCLE : INT ;	//Minimum cycle time of OB1 (milliseconds)
      OB1_MAX_CYCLE : INT ;	//Maximum cycle time of OB1 (milliseconds)
      OB1_DATE_TIME : DATE_AND_TIME ;	//Date and time OB1 started
    END_VAR
    BEGIN
    NETWORK
    TITLE =
    
          CALL "Mulaufruf" (
               RET_VAL                  := MW    10);
    
    END_ORGANIZATION_BLOCK
    SCL-FC100: MatMul

    Code:
    FUNCTION MatMul : INT
    
    VAR_INPUT
        MxA: UDT10;//MATRIX;
        MxB: UDT10;//MATRIX;
    END_VAR
    
    VAR_OUTPUT
        MxC: UDT10;//MATRIX;
    END_VAR
    
    VAR_TEMP
        // temporäre Variablen
    
    END_VAR
    
        // Anweisungsteil
        
           
        ;
        MatMul := 100;
    END_FUNCTION
    SCL-FC101:Mulaufruf

    Code:
    FUNCTION Mulaufruf : INT
    
    VAR_TEMP
        // temporäre Variablen
      Erg: Int;
    END_VAR
    
        // Anweisungsteil
        
        Erg := MatMul( MxA:= "Matrixarray".A, MxB:= "Matrixarray".D, MxC:="Matrixarray".G);
        
        
        Mulaufruf := 101;
        
    END_FUNCTION

    Das läßt sich zumindest übersetzen, also könnte man die Matritzen durchaus als UDT übergeben, diese liegen in einem globalen DB.

    Was allerdings nicht geht, eine UDT als Durchgangstyp zu übergeben. Da weigert sich Step7. Willst du also deine UDT an weitere Funktionen nach "unten" durchreichen, geht das nur über Larry's Vorschlag, einen Zeiger oder Any-Pointer zu übergeben.

    PS: Ich würde dann diesen Pointer zerlegen und die Daten von der daraus resultierenden Adresse per Blockmove (SFC20) in eine interne Struct kopieren, diese dann weiterreichen. Ob das "Weiterrreichen" und nochmalige "Umkopieren" allerdings so einfach geht, bleibt auszutesten.

    Vielleicht wäre es am Einfachsten, immer einen Zeiger zu übergeben, dann erst zum Rechnen die Daten umzukopieren und danach das Ergebnis zurückzukopieren und auch dieses als Zeiger zurückzugeben.
    Geändert von Ralle (20.06.2008 um 14:23 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

  8. Folgender Benutzer sagt Danke zu Ralle für den nützlichen Beitrag:

    Mtroniker (20.06.2008)

  9. #16
    Registriert seit
    20.06.2003
    Ort
    Sauerland.NRW.Deutschland
    Beiträge
    4.850
    Danke
    78
    Erhielt 800 Danke für 543 Beiträge

    Standard

    Zitat Zitat von Mtroniker Beitrag anzeigen
    aus PN
    Dabei bin ich im Downloadbereich auf ein 2-D-Array gestoßen. Meine 2-D-Arrays beschreiben ja nichts anderes als eine Matrix mit zeilen und spalten. Vielleicht haben Sie ja noch eine sehr gute Idee für mein Anliegen.

    Unterschied (nach meinem Verständnis): Ihre arrays liegen alle in einem eigenen DB. So wie ich es gelöst habe, ensteht in einem DB (DB20) Mehrere Matrizen in bestimmten Datenbereichen. Nüzlich wäre es, wenn ich nun diese erzeugten Matrizen in eigene DB's ablegen könnte um diese dann an meine Function (multipliziere Matrix) als Bausteinparameter übergeben könnte. Als Eingang erwartet die Funktion den Typ Matrix, die im UDT definiert wurde. Siehe nochmal im Thread. Ich habe auf Ihren Bericht nochmals eine Antwort erstellt
    @ralle
    da sich der udt ja immer, abhängig von zeilen/spalten, ändert geht das so nicht.
    ich würde garnicht den udt übergeben sondern nur die db-nr.

    im anhang mal ein prog als awl-quelle
    das prog löscht auf anforderung die bestehenden db's und erzeugt diese dann neu in abhängigkeit der anzahl der elemente.
    fc102 multipliziert dir die elemente des matrix_db_1 mit matrix_db_2.
    das ergebnis liegt im matrix_db_3
    Angehängte Dateien Angehängte Dateien
    Geändert von volker (20.06.2008 um 15:45 Uhr)
    .
    mfg Volker .......... .. alles wird gut ..

    =>Meine Homepage .. direkt zum Download

    Meine Definition von TIA: Total Inakzeptable Applikation

  10. Folgender Benutzer sagt Danke zu volker für den nützlichen Beitrag:

    Mtroniker (20.06.2008)

  11. #17
    Mtroniker ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    18.06.2008
    Beiträge
    9
    Danke
    12
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Jetzt nochmal alles vergessen, was im vorfeld besprochen wurde. Ich glaube manch zusatzinformationen haben Verwirrung gestiftet.

    Code:
    UDT
    Zeilenanzahl : int:
    Spaltenanzahl: int;
    Ich habe ein Struct vom Typ Matrix im DBxxx (siehe Bild 2.1). Ich möchte nun diese Struct in ein User Datentyp Matrix (gleicher aufbau wie im DB) von einer anderen SCL aus zuückwandeln.
    Gibt es etwas wie ein typecast oder ähnliches.
    Das muss wessentlich einfacher gehen.
    ___________
    Gruß
    Micha
    Geändert von Mtroniker (20.06.2008 um 20:37 Uhr)

  12. #18
    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

    Ich denke, du mußt die gleiche UDT (Struct) in der SCL-Funktiion als Variable zuweisen und deine Daten dann dort hinein kopieren. Evtl. geht das einfacher mit der AT-Zuweisung in SCL, das ist ja eine Art Typecast, allerdings muß man das mal ausprobieren.

    @Volker

    Ist schon klar, aber man kann ja ein Array [0..10, 0..10] vereinbaren und dann mit Zeilen- und Spaltenzahl die tatsächlich für die Matrix genutzte Anzahl angeben. Das ist zwar einiges an verschenktem Speicherplatz, aber das variabelste, was man machen kann.
    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

  13. Folgender Benutzer sagt Danke zu Ralle für den nützlichen Beitrag:

    Mtroniker (20.06.2008)

  14. #19
    Mtroniker ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    18.06.2008
    Beiträge
    9
    Danke
    12
    Erhielt 0 Danke für 0 Beiträge

    Standard

    @ Ralle
    Ich denke, du mußt die gleiche UDT (Struct) in der SCL-Funktiion als Variable zuweisen und deine Daten dann dort hinein kopieren. Evtl. geht das einfacher mit der AT-Zuweisung in SCL
    Könntest du ein Beispiel für beides posten?


    Was jetzt zu funktionieren scheint: Ich Rufe aus einem x beliebigen FB die Function TRANSPONIERE auf. Ich übergebe die Matrix DB20.A.
    Code:
    MatxTransp( MxA:= DB20.A, MxA_transp:=G)
    Der Compiler gibt keinen Fehler aus.
    Ja, es funktioniert. Vielen Dank an alle.

    Beispiel von Ralle würde ich dennoch gerne sehen.
    Geändert von Mtroniker (20.06.2008 um 18:18 Uhr)

  15. #20
    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
    Zitat Zitat von Mtroniker Beitrag anzeigen
    @ Ralle
    Könntest du ein Beispiel für beides posten?


    Was jetzt zu funktionieren scheint: Ich Rufe aus einem x beliebigen FB die Function TRANSPONIERE auf. Ich übergebe die Matrix DB20.A.
    Code:
    MatxTransp( MxA:= DB20.A, MxA_transp:=G)
    Der Compiler gibt keinen Fehler aus.
    Ja, es funktioniert. Vielen Dank an alle.

    Beispiel von Ralle würde ich dennoch gerne sehen.
    Das Beispiel müßte ich mit auch erst zurechtklimpern, war auch erstmal eine rein theoretische Überlegung, da ich eher selten UDT und Struct nutze. Daher erstmal kein Beispiel, leider. Zum Thema AT gibts hier einiges schon im Forum zu lesen. Mit dem Umkopieren meine ich folgendes:

    Im FC eine Temp (oder im FB auch Stat) mit deiner UDT definieren.
    Dann dem einen Any übergeben (siehe Larry). Ich glaube, wenn man eine Struct übergibt kann man selbst daraus diese Daten gewinnen, da wohl eigentlich auch ein Any übergeben wird. Der Any enthält im Prinzip, den DB, den Start und die Länge der Daten. Diese Daten aus dem Any extrahieren (siehe Forum und AT-Befehl). Nun könnte man mit dem SFC 20 (Blk_Move) die im FC definierte Variable mit Daten füllen. Auf diese Variable kann man anschließend im FC zugreifen. Das klingt sehr umständlich, wenn man es aber mal umgesetzt hat, kann man es immer wieder verwenden.
    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

  16. Folgender Benutzer sagt Danke zu Ralle für den nützlichen Beitrag:

    Mtroniker (20.06.2008)

Ä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
  •