Typ Struct Indirekt adressieren

Jordy

Level-1
Beiträge
123
Reaktionspunkte
9
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
 
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>
 
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.
 
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
 

Anhänge

  • OB1.pdf
    3,4 KB · Aufrufe: 25
  • FC200.pdf
    4,3 KB · Aufrufe: 35
  • DB200.pdf
    2,8 KB · Aufrufe: 20
  • VAT_1.jpg
    VAT_1.jpg
    175,4 KB · Aufrufe: 27
  • VAT_2.jpg
    VAT_2.jpg
    175,5 KB · Aufrufe: 20
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
 
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 :rolleyes:

Viiielen Dank schonmal

Gruß
Jordy
 
Zurück
Oben