Pointer an FB übergeben, aber wie?

Aendes

Level-1
Beiträge
3
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo liebe Wissenden

Ich möchte im Rahmen meiner momentanen Programmierarbeiten aus einem FB heraus einen bestimmten Eingangsbereich abfragen. Dazu will ich die Basisadresse dieses Eingangsbereichs per Pointer an den FB übergeben.

Ich habe in den Eingangsparamtern einen Pointer namens "Basisadresse "deklariert.
An diesem Eingang übergebe ich z.B. P#2.0

L #akt_Offset
SLW 3
LAR1
L P##Basisadresse
+AR1
L EB [AR1,P#0.0]
T #Zwischenspeicher


Beim Befehl L P##Basisadresse lädt es immer 85000000
Warum??
Kann es sein, dass das ein Pointer auf den Speicherplatz des Pointers "Basisadresse" im Instanz-DB ist und wenn ja, wie schaffe ich es den eingentlichen Pointer (z.B. P#2.0 ) zu laden?


Noch zum System:
CPU 315-2DP
S7 V 5.1.1 (für Programmentwurf zu Hause)
S7 V5.4 (in der Firma)

MFG

Aendes
 
Hallo Aendes,

hier sind mal zwei kurze Programmbeispiele zur Übergabe von POINTERN:

Code:
FUNCTION_BLOCK FB 100
TITLE =POINTER
//DB-POINTER
//
//BYTE 0  Datenbausteinnummer
//BYTE 1  Datenbausteinnummer
//
//BYTE 2  Bereichszeiger
//BYTE 3  Bereichszeiger
//BYTE 4  Bereichszeiger
//BYTE 5  Bereichszeiger
//   
AUTHOR : KAI
FAMILY : SPSFORUM
NAME : 'POINTER'
VERSION : 1.0
 
VAR_INPUT
  DB_NUMMER : BLOCK_DB ;    
  DB_POINTER : POINTER ;    
END_VAR
BEGIN
NETWORK
TITLE =POINTER
 
      AUF   #DB_NUMMER; // DB öffnen 
 
      L     P##DB_POINTER; // POINTER
      LAR1  ; 
 
      L     D [AR1,P#2.0]; // POINTER Bereichszeiger
      LAR1  ; 
 
NETWORK
TITLE =Daten (WORD) kopieren
 
      L     W [AR1,P#0.0]; 
      T     W [AR1,P#2.0]; 
 
END_FUNCTION_BLOCK

Code:
FUNCTION_BLOCK FB 120
TITLE =DB-POINTER
//DB-POINTER
//
//BYTE 0  Datenbausteinnummer
//BYTE 1  Datenbausteinnummer
//
//BYTE 2  Bereichszeiger
//BYTE 3  Bereichszeiger
//BYTE 4  Bereichszeiger
//BYTE 5  Bereichszeiger
//   
AUTHOR : KAI
FAMILY : SPSFORUM
NAME : 'POINTER'
VERSION : 1.0
 
VAR_INPUT
  DB_POINTER : POINTER ;    
END_VAR
VAR_TEMP
  DB_NUMMER : WORD ;    
END_VAR
BEGIN
NETWORK
TITLE =DB-POINTER
 
      L     P##DB_POINTER; // POINTER
      LAR1  ; 
 
      L     W [AR1,P#0.0]; // POINTER DB-Nummer
      T     #DB_NUMMER; 
 
      AUF   DB [#DB_NUMMER]; // DB öffnen
 
      L     D [AR1,P#2.0]; // POINTER Bereichszeiger
      LAR1  ; 
 
NETWORK
TITLE =Daten (WORD) kopieren
 
      L     W [AR1,P#0.0]; 
      T     W [AR1,P#2.0]; 
 
END_FUNCTION_BLOCK

Gruß Kai
 

Anhänge

  • OB1.pdf
    3,7 KB · Aufrufe: 116
  • FB100.pdf
    2,9 KB · Aufrufe: 103
  • FB120.pdf
    2,9 KB · Aufrufe: 80
  • DB200.pdf
    2,5 KB · Aufrufe: 56
Hi

So eine frage kan mir einer ein Projekt schiken ein geziptes??
dan kan ich das direckt testen.
Was ich erreichen will

Ich will in einen DB was laden z.b. db1.dbd1
und dan will ich den db1 danach auslesen das ich quasi die adresse hochzähle und so mir eine menge qode spare. ich habe die FAQ im forum gelesen aber irgentwie raller ich das nicht .

Bitte hilfe :)
 
Hallo liebe Wissenden

L #akt_Offset
SLW 3
LAR1
L P##Basisadresse
+AR1
L EB [AR1,P#0.0]
T #Zwischenspeicher


Beim Befehl L P##Basisadresse lädt es immer 85000000
Warum??
Kann es sein, dass das ein Pointer auf den Speicherplatz des Pointers "Basisadresse" im Instanz-DB ist und wenn ja, wie schaffe ich es den eingentlichen Pointer (z.B. P#2.0 ) zu laden?

Aendes

Hi,

du hast den Fehler schon erkannt. Du lädst nicht die Adresse die in #Basisadresse steht, sondern den Pointer indem die Adresse der Variable #Basisadresse steht....

L #akt_Offset
SLD 3
LAR1
L #Basisadresse
+AR1
L EB [AR1,P#0.0]
T #Zwischenspeicher



Probier es mal so...


Torsten

Edit: Fehler für die Nachwelt korrigiert...
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Das funktioniert so leider nicht. Das habe ich anfänglich auch probiert. Letztlich hilft hier nur der Code von Kai. (Ich hab's probiert und es geht).

Interessant wäre jetzt noch wie ich einen Pointer an einen FC übergebe.
bzw. wie ich ihn im FC verwenden kann. Hier gibt's dann ja keinen Instanz-DB mehr, den man adressieren kann.

Muss man da dann auf einen CPU-Stapelspeicher (Stack) zugreifen, oder wie geht denn das? :confused:
 
Hi,

dass das oben nicht funktioniert liegt aber nicht an den geposteten Zeilen. Da liegt noch woanders der Wurm drin. Egal...
Edit: Pointer sind Doppelwörter. Es muss also SLD3 heissen.


Wenn du nicht nur eine Byte-Bit-Adresse übergeben willst, kannst du mit nem ANY-Pointer arbeiten, oder aber die DB-Nr. nochmal extra als Word übergeben und dann :
(Also In-Variable DB_Nummer, Typ word...)

Auf DB_Nummer

schreiben.

Zum Any-Pointer findest du was in der Hilfe von Step7 oder ich glaube auch hier im Forum...

Torsten
 
Zuletzt bearbeitet:
Zurück
Oben