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

Ergebnis 1 bis 9 von 9

Thema: Typ Struct Indirekt adressieren

  1. #1
    Registriert seit
    29.03.2007
    Beiträge
    123
    Danke
    17
    Erhielt 9 Danke für 9 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Wollte mir letztens auf Baustelle einen Fifo Speicher basteln, also eigenen FC dafür und um diesen FC öfters benutzen zu können, wollte ich eine IN_OUT Variable vom Typ Struct anlegen, worin ich die Daten speicher.

    So... das Problem ist jedoch, das ich in dem FC, die Daten aus diesem Struct nicht indirekt weiterverarbeiten kann. Lege ich den selben Struct aber nicht in den IN_OUT Bereich, sondern in den Temp Bereich, ist das kein Problem.

    Könnt ihr mir sagen warum?

    Danke
    Zitieren Zitieren Typ Struct Indirekt adressieren  

  2. #2
    Jordy ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    29.03.2007
    Beiträge
    123
    Danke
    17
    Erhielt 9 Danke für 9 Beiträge

    Standard

    Leider nicht das passende...

  3. #3
    Jordy ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    29.03.2007
    Beiträge
    123
    Danke
    17
    Erhielt 9 Danke für 9 Beiträge

    Standard

    Keiner ne erklärung?

    Noch mal in einem Satz: Warum kann ich bei einem "IN-Lokalparameter" (Struct) darauf nicht indirekt zugreifen?

  4. #4
    Registriert seit
    08.08.2007
    Ort
    Dresden
    Beiträge
    9.648
    Danke
    1.059
    Erhielt 2.046 Danke für 1.627 Beiträge

    Standard

    was meinst du mit indirekt?

    du kannst auf die bestandteile deines struct über <Strukturname.Variablenname> zugreifen, bei verschachtelung dann eben <Strukturname1.Strukturname2. ...und so weiter max8... Variablenname>
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

  5. #5
    Jordy ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    29.03.2007
    Beiträge
    123
    Danke
    17
    Erhielt 9 Danke für 9 Beiträge

    Standard

    mit indirekt meine ich mit einem Pointer.
    Wenn ich in diesem Struct als Beispiel 50 DINT drin habe. Und möchte einen neuen Wert speichern und alle anderen "eins aufrücken" (FIFO). Wäre mit nem Pointer halt einfacher...

    Kann diesen Struct auch nicht mit dem SFC20 kopieren. Wenn der Struct sich im Temp-Speicher befindet, dann gehts jedoch.

  6. #6
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.726
    Danke
    398
    Erhielt 2.401 Danke für 2.001 Beiträge

    Standard

    ... da wäre dann aber nicht ein STRUCT dein Ansprechpartner, sondern ein ARRAY. Das könnte man dann auch wieder als Parameter übergeben ...

  7. #7
    Registriert seit
    30.03.2005
    Beiträge
    2.096
    Danke
    0
    Erhielt 673 Danke für 541 Beiträge

    Standard

    Zitat Zitat von Jordy Beitrag anzeigen
    Wollte mir letztens auf Baustelle einen Fifo Speicher basteln, also eigenen FC dafür und um diesen FC öfters benutzen zu können, wollte ich eine IN_OUT Variable vom Typ Struct anlegen, worin ich die Daten speicher.

    das Problem ist jedoch, das ich in dem FC, die Daten aus diesem Struct nicht indirekt weiterverarbeiten kann.
    Hier mal ein kurzes Programmbeispiel für den indirekten Zugriff mit einem Pointer auf eine IN_OUT-Variable vom Datentyp STRUCT:

    Code:
    FUNCTION FC 200 : VOID
    TITLE =FIFO
    AUTHOR : KAI
    FAMILY : SPSFORUM
    NAME : FIFO
    VERSION : 1.0
     
    VAR_INPUT
      WERT : DINT ; 
      EINLESEN : BOOL ; 
    END_VAR
    VAR_IN_OUT
      FIFO : STRUCT     
       WERT_1 : DINT ;  
       WERT_2 : DINT ;  
       WERT_3 : DINT ;  
       WERT_4 : DINT ;  
       WERT_5 : DINT ;  
      END_STRUCT ;  
    END_VAR
    VAR_TEMP
      EINLESEN_FP : BOOL ;  
      DB_NUMMER : WORD ;    
      DB_REGISTER : WORD ;  
      AR1_REGISTER : DWORD ;    
    END_VAR
    BEGIN
    NETWORK
    TITLE =Neuen Wert in FIFO einlesen
     
          U     #EINLESEN; // Wert einlesen
          FP    #EINLESEN_FP; 
          NOT   ; 
          BEB   ; // Bausteinende
     
    NETWORK
    TITLE =DB-Register und Adressregister AR1 sichern
     
          L     DBNO; // DB-Register
          T     #DB_REGISTER; 
     
          TAR1  #AR1_REGISTER; // Adressregister AR1
     
    NETWORK
    TITLE =Werte im FIFO verschieben
     
          L     P##FIFO; // POINTER
          LAR1  ; 
     
          L     W [AR1,P#0.0]; // POINTER DB-Nummer
          T     #DB_NUMMER; 
     
          AUF   DB [#DB_NUMMER]; 
     
          L     D [AR1,P#2.0]; // POINTER Bereichszeiger
          LAR1  ; 
     
          L     D [AR1,P#12.0]; // FIFO Wert 4
          T     D [AR1,P#16.0]; // FIFO Wert 5
     
          L     D [AR1,P#8.0]; // FIFO Wert 3
          T     D [AR1,P#12.0]; // FIFO Wert 4
     
          L     D [AR1,P#4.0]; // FIFO Wert 2
          T     D [AR1,P#8.0]; // FIFO Wert 3
     
          L     D [AR1,P#0.0]; // FIFO Wert 1
          T     D [AR1,P#4.0]; // FIFO Wert 2
     
          L     #WERT; // Eingabe
          T     D [AR1,P#0.0]; // FIFO Wert 1
     
    NETWORK
    TITLE =DB-Register und Adressregister AR1 wiederherstellen
     
          AUF   DB [#DB_REGISTER]; // DB-Register
     
          LAR1  #AR1_REGISTER; // Adressregister AR1
     
    END_FUNCTION
    Gruß Kai
    Angehängte Grafiken Angehängte Grafiken
    Angehängte Dateien Angehängte Dateien

  8. #8
    Registriert seit
    30.03.2005
    Beiträge
    2.096
    Danke
    0
    Erhielt 673 Danke für 541 Beiträge

    Standard

    Den obigen Programmcode kann man auch für den indirekten Zugriff mit einem Pointer auf IN_OUT-Variablen mit anderen zusammengesetzten Datentypen wie ARRAY oder STRING anwenden.

    Gruß Kai

  9. #9
    Jordy ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    29.03.2007
    Beiträge
    123
    Danke
    17
    Erhielt 9 Danke für 9 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Suuper. Vielen Dank schonmal!!

    Habe bei mir das nicht gemacht:
    L W [AR1,P#0.0]; // POINTER DB-Nummer
    T #DB_NUMMER;

    AUF DB [#DB_NUMMER];

    L D [AR1,P#2.0]; // POINTER Bereichszeiger
    LAR1 ;
    Denn, der DB ist doch schon aufgeschlagen wenn ich vorher auf irgendeine Variable aus dem DB zugreife.

    Puuhhh, mal gucken ob ichs vernünfitg erklärt kriege was ich nicht verstehe.
    Also wie der Pointer aufgebaut ist, ist mir eigentlich klar.
    Unklar ist

    A: Wenn ich P##FIFO lade, dann lade ich doch schon den Bereichszeiger ins Adressregister, oder? Wieso nachher mit
    L D [AR1,P#2.0]; // POINTER Bereichszeiger
    nochmal machen?

    B: Da ich den Pointer #FIFO ja schon ins Adressregister geladen habe, greif ich mit
    L D [AR1,P#2.0]; // POINTER Bereichszeiger
    doch nicht auf die "Bestandteile" meines Pointers zu, sondern auf das Doppelwort in meinem DB, oder??


    Hoffe ihr versteht was ich meine

    Viiielen Dank schonmal

    Gruß
    Jordy

Ähnliche Themen

  1. PEW; PAW indirekt Adressieren
    Von casius im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 02.10.2017, 09:00
  2. String indirekt adressieren
    Von The Dude im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 22.06.2011, 12:21
  3. SCL indirekt Adressieren
    Von Nafura im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 19.05.2011, 21:42
  4. UDT Indirekt Adressieren
    Von EULANER im Forum Simatic
    Antworten: 14
    Letzter Beitrag: 14.11.2010, 19:30
  5. SFC 20 indirekt adressieren
    Von drmicha im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 19.10.2009, 09:24

Lesezeichen

Berechtigungen

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