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

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

Thema: Verständnisproblem mit AR in Schleife

  1. #11
    Pico1184 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    05.10.2006
    Beiträge
    324
    Danke
    11
    Erhielt 8 Danke für 7 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    ber du solltest den Hinweis in einer Antwort weiter oben beachten, dein FB ist nicht multiinstanzfähig. Das ist nicht weiter schlimm, wenn du ihn nicht in einer Multiinstanz einzusetzen gedenkst. Wenn doch muß bei der Adressberechnung noch der Offset der Daten im Multiinstanz-DB beachtet werden, den du im AR2 am Anfang praktischerweise ohnehin absicherst.
    Ich muss diesen Baustein multiinstanzfähig machen, das ist mir jetzt wiederrum nicht klar, alles was ich in die AR lade habe ich ja mit dem Instanzanfang addiert.

    Code:
    L     #T_DW_Instanzanfang         // Anfang der Instanzdaten merken
    L     P##Statistik_Register       // Zeiger AR1 auf T_Struktur setzen
    +D    
    LAR1  
    
    L     #T_DW_Instanzanfang
    L     P##IN_OUT_ANY_Register
    +D    
    LAR2 
    
    L     D [AR2,P#6.0]               // Zeiger AR2 auf DW setzen
    T     #T_DW_Dat_Komponente
    LAR2  
    
    //Zeiger berechnen und Offset für AR2 einstellen
    L     #T_INT_Schleifenzaehler
    L     16
    *I    
    T     #T_DWORD_Zeiger
     +AR2
    oder wo meinst du jetzt genau??

    Grüße Pico

  2. #12
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.222
    Danke
    533
    Erhielt 2.698 Danke für 1.950 Beiträge

    Standard

    Hier #7 hat PN/DP es dir doch schon geschrieben.
    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

  3. #13
    Pico1184 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    05.10.2006
    Beiträge
    324
    Danke
    11
    Erhielt 8 Danke für 7 Beiträge

    Standard

    Aber das hab ich doch.....

    Code:
    L     #T_DW_Instanzanfang          
    L     P##Statistik_Register       // Zeiger AR1 auf T_Struktur setzen 
    +D     
    LAR1    
    
    L     #T_DW_Instanzanfang 
    L     P##IN_OUT_ANY_Register 
    +D     
    LAR2
    Grüße Pico

  4. #14
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.222
    Danke
    533
    Erhielt 2.698 Danke für 1.950 Beiträge

    Standard

    Du hast vollkommen Recht, das hab ich übersehen, du hast das ja schon in deinen Code aufgenommen, in Bezug auf AR2 war ich gedanklich noch in deinem Anfangscode aus Post 1.
    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

  5. #15
    Pico1184 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    05.10.2006
    Beiträge
    324
    Danke
    11
    Erhielt 8 Danke für 7 Beiträge

    Standard

    Kann ja passieren vor lauter Adressregister hier Adressregister da....

    Vielen Dank an euch soweit passt alles!

    Grüße Pico

  6. #16
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.191
    Danke
    923
    Erhielt 3.292 Danke für 2.661 Beiträge

    Standard

    Ich nochmal ... eine Anmerkung habe ich noch:
    Code:
    L     #T_DW_Instanzanfang         // Anfang der Instanzdaten merken
    L     P##Statistik_Register       // Zeiger AR1 auf T_Struktur setzen
    +D    
    LAR1  
    
    L     #T_DW_Instanzanfang
    L     P##IN_OUT_ANY_Register
    +D    
    LAR2 
    
    L     D [AR2,P#6.0]               // Zeiger AR2 auf DW setzen
    T     #T_DW_Dat_Komponente
    LAR2     <-------- ist das so richtig ???
    
    //Zeiger berechnen und Offset für AR2 einstellen
    L     #T_INT_Schleifenzaehler
    L     16
    *I    
    T     #T_DWORD_Zeiger
     +AR2
    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  7. #17
    Pico1184 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    05.10.2006
    Beiträge
    324
    Danke
    11
    Erhielt 8 Danke für 7 Beiträge

    Standard

    LAR2 <-------- ist das so richtig ???
    Wieso nicht? Ich lade ja hier den zuvor extrahierten Zeiger auf die db daten ins AR2 oder was meinst du?

    Grüße Pico

  8. #18
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.191
    Danke
    923
    Erhielt 3.292 Danke für 2.661 Beiträge

    Standard

    Achso, Du baust ja erstmal einen Pointer auf den IN_OUT-Parameter, welcher selber auch wieder ein Pointer ist.
    Es ist also richtig so.


    Allerdings sehen Deine Codeschnipsel mittlerweise etwas unübersichtlich aus.
    Ich würde einige Sachen anders formulieren, z.B. so oft wie möglich mit AR1 arbeiten und AR2 nur anfassen, wenn es unbedingt nötig ist. Weiters benutze ich fast immer die Kombination DB-Register + AR1 für die Quelle und DI-Register + AR2 für das Ziel, wenn ich beide AR benutzen muß. Und bei Zugriffen auf den mit dem DI-Register adressierten DB schreibe ich für mich zur Erinnerung und "zur Sicherheit" gerne DIB/DIW/DID statt nur B/W/D - nicht, daß mal aus irgendeinem Grund die Bereichskennung in AR2 futsch geht und auf den falschen DB zugegriffen wird (paranoid - aber übersichtlicher )
    Doch eigentlich ist meine Variante gar nicht soweit weg von Deinem Entwurf.
    Code:
    //AR2 sichern und Instanzanfang merken
          TAR2  
          T     #T_DW_AR2_Sicherung         // Sichern Adressregister
          UD    DW#16#FFFFFF                // Bereichskennung ausblenden
          T     #T_DW_Instanzanfang         // Anfang der Instanz merken
    
    //IN-Parameter in TEMP umkopieren bevor AR2 verändert wird
          L     #IN_INT_Anzahl_Stationen
          T     #T_INT_Anzahl_Stationen
    
    //Adresse des externen Datenbereichs holen und Pointer AR1 darauf setzen
          L     #T_DW_Instanzanfang         // Anfang der Instanz
          L     P##IN_OUT_ANY_Register      // Adresse des IO_Any-Parameters in dieser Instanz
          +D                                // Adresse meines IO_Any-Parameters
          LAR1                              // Pointer AR1 auf mein IN_OUT_ANY_Register setzen
          L     DIW [AR1,P#4.0]             // DB-Nr des übergebenen Any
          T     #T_INT_DB_Komponente        // in lokalen TEMP umspeichern
          L     DID [AR1,P#6.0]             // Speicherbereich und Offset des übergebenen Any
          T     #T_DW_Dat_Komponente        // in lokalen TEMP umspeichern (falls nochmal benötigt)
          LAR1                              // <DB>.AR1: Pointer auf die externe Datenstruktur
          AUF   DB [#T_INT_DB_Komponente]
    
    //Pointer AR2 auf lokale T_Struktur setzen
          L     #T_DW_Instanzanfang         // Anfang der Instanz
          L     P##Statistik_Register       // Anfang der T_Struktur in dieser Instanz
          +D    
          LAR2                              // <DI>.AR2: Pointer auf meine T_Struktur
    
    //Schleife zum Umkopieren vom externen Datenbereich in die lokale Datenstruktur
          L     #T_INT_Anzahl_Stationen     // Schleifenzähler initialisieren
    N1:   T     #T_INT_CopySchleife
    
          L     W [AR1,P#0.0]               // Kopiere Daten von externem Bereich
          T     W [AR2,P#0.0]               // in lokale Struktur (*)
    
          L     P#2.0                       // Pointer-Abstand für INT-Variablen
          +AR1                              // SourcePointer++
          +AR2                              // DestPointer++
    
          L     #T_INT_CopySchleife
          LOOP  N1
    
    //*** lokale Datenkopien auswerten **********
    //AR2 wiederherstellen
          LAR2  #T_DW_AR2_Sicherung
          L     #Statistik_Register[0]
          L     #Statistik_Register[1]
    //...
    
    //AR2 wiederherstellen
          LAR2  #T_DW_AR2_Sicherung
    (*) Normalerweise würde ich "zur Sicherheit" T DIW [AR2,P#0.0] schreiben, doch wegen einer Macke des AWL-Editors geht das nicht, wenn der erste IN-Parameter vom Datentyp INT oder WORD ist (oder es müsste AR1 mit AR2 vertauscht werden).


    PS: Ich sehe zwar nicht, warum dieser FB multiinstanzfähig sein muß, doch Du wirst schon wissen, was der FB noch alles machen soll. Und ich nehme an, Du weißt was "multiinstanz" heißt.

    Harald
    Geändert von PN/DP (22.03.2013 um 18:02 Uhr)
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  9. Folgender Benutzer sagt Danke zu PN/DP für den nützlichen Beitrag:

    Koch (22.08.2013)

  10. #19
    Pico1184 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    05.10.2006
    Beiträge
    324
    Danke
    11
    Erhielt 8 Danke für 7 Beiträge

    Standard

    PS: Ich sehe zwar nicht, warum dieser FB multiinstanzfähig sein muß, doch Du wirst schon wissen, was der FB noch alles machen soll. Und ich nehme an, Du weißt was "multiinstanz" heißt.
    Der FB muss deshalb multiinstanz fähig sein, weil es ein Standartbaustein werden soll der für verschiedenste Statistikfunktionen verwendet wird.

    Code:
    STAT:
    Kamera_Statistik : FBS_Statistik
    Sensor_Statistik : FBS_Statistik
    Ausschuss_Statistik : FBS_Statistik
    Grüße Pico

  11. #20
    Pico1184 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    05.10.2006
    Beiträge
    324
    Danke
    11
    Erhielt 8 Danke für 7 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Ich möchte den Baustein nun noch gerne so erweitern, dass alle Felder des lokalen Registers welche nicht benutzt werden, auf Null gesetzt werden.

    Dazu hab ich mir gedacht ein zusätzliches Array anzulegen welches die gleiche Größe hat wie das Statistik Array:

    Code:
    STAT:
    Statistik_Register : Array [0..127] of Int
    Statistik_Register_Null : Array [0..127] of Int
    Um nun die nicht benötigten Daten (IN_INT_Anzahl + 1) auf Null zu setzen möchte ich einfach die Größe aus dem Null Register nehmen (da stehen ja eh nullen drin, eben die Anfangswerte)
    und in das Statistik_Register Array kopieren.

    Code:
          L     126
          L     #IN_INT_Anzahl_Stationen
          -I    
          T     #T_INT_Anzahl_Not_Used
    
          L     #IN_INT_Anzahl_Stationen
          L     1
          +I    
          T     #T_INT_Index
    
    //Lokaldatenbereich Statistik_Register
          CALL  "FC MAKE ANY POINTER"
           IN_IN_Typ             :=4
           IN_IN_Anzahl          :=#T_INT_Anzahl_Not_Used
           IN_IN_Index           :=#T_INT_Index
           IN_IN_DB_Nr           :=20
           IN_IN_Operandenbereich:=5
           IN_DW_Zeiger          :=DW#16#160    //44.0
           OUT_ANY_Anyzeiger     :=#T_ANY_CPY_Zeiger
    
    
    //Lokaldatenbereich Statistik_Register_Null
          CALL  "FC MAKE ANY POINTER"
           IN_IN_Typ             :=4
           IN_IN_Anzahl          :=#T_INT_Anzahl_Not_Used
           IN_IN_Index           :=#T_INT_Index
           IN_IN_DB_Nr           :=20
           IN_IN_Operandenbereich:=5
           IN_DW_Zeiger          :=DW#16#970    //302.0
           OUT_ANY_Anyzeiger     :=#T_ANY_NU_Zeiger
    
          CALL  "BLKMOV"
           SRCBLK :=#T_ANY_NU_Zeiger
           RET_VAL:=#T_DummyInt
           DSTBLK :=#T_ANY_CPY_Zeiger
    Würdet ihr das auch so machen, oder gibts da eine elegantere Lösung?

    Grüße Pico

Ähnliche Themen

  1. Antworten: 7
    Letzter Beitrag: 15.08.2011, 16:41
  2. Kurze Frage zu ASCII --> Verständnisproblem mit CR
    Von Günter_Pecki im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 26.05.2011, 01:32
  3. Mit Schleife DB füllen
    Von htw im Forum Simatic
    Antworten: 59
    Letzter Beitrag: 23.05.2011, 18:29
  4. Antworten: 22
    Letzter Beitrag: 14.01.2011, 12:10
  5. Verständnisproblem mit pointer ?
    Von Waelder im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 03.08.2009, 09:02

Lesezeichen

Berechtigungen

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