Step 7 symbolische Adressierung eines DB als IN Parameter einer Funktion

joru_sps

Level-1
Beiträge
16
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Experten,
Ein FC soll Ausschnitte aus einer (Global DB)Tabelle kopieren auf die Instanzdaten eines FB.
Ich will nun den Quell DB, der die Tabelle enthält symbolisch adressieren. Deswegen ist der In Parameter
"in_Nu_Daten_DB" kein Integer, sondern vom Typ Any Zeiger.

Beim Aufruf des FCs (Tabelle kopieren) kann ich den symbolischen Namen bei "in_Nu_Daten_DB" ("EinsNeunNeun") eingeben.
i2MYTsllRUAAA2MDXjDj8kCUFBQAAgBQoKAAAwBZQUAAAgC2goAAAAFtAQQEAALaAggIAAGwBBQUAANjCf1IdU0ucTabsAAAAAElFTkSuQmCC


Der folgende Programmcode schreibt mir aber nicht die DB Nummer (199) in "#DB_No_Foreign":

Code:
    L     P##in_Nu_Daten_DB
    LAR2
//DB ermitteln
      L W [ AR2 , P#4.0 ]
     T     #DB_No_foreign

Was mache ich falsch?
 
Hallo,
ich habe das so in Erinnerung, dass hier ein Pointer steht, der auf die Adresse zeigt, die den Inhalt des ANY-Pointers wiedergibt. Du mußt das dann also auch genau so handhaben ...

Es ginge aber auch einfacher : Du machst als IN_Parameter einen Typ Block-DB. In der steht der DB dann also echte Zahl drin (also 198 für DB 198).

Gruß
Larry
 
..und wie greife ich auf den Block DB zu?
Wenn ich ihn als IN Parameter am FC deklariere wie "verwandelt" sich die symblische Adresse in einen Integer?
Code:
L "in_Nu_Daten_DB" // nun vom Typ "Block_DB"
t MW200
wird als Code nicht akzeptiert.
Gruß Joru_sps
 
Hi.

Ich habe grade ein ähnliches Problem.
Ich habe einen IN Parameter vom Typ INT wo ich die DB Nummer übergebe.
Dann kann ich mir damit einen Pointer bauen, um mit der SFC14 Daten vom DP Slave da rein zu schieben.
Soweit so gut, aber jetzt möchte ich aus dem DB auch wieder einzelne Daten auslesen.

Da steh ich grade total auf dem Schlauch...
Hab schon einiges probiert, aber das Brett vorm Kopf geht grad nicht weg.
Code:
      LAR1  P##DatenDB_Auma

      U     DBX [AR1,P#0.0]             // Endlage Auf WÖL
      =     #S_Endschalter_Auf
Code:
      L     #DatenDB_Auma
      SLD 3
      LAR1

      U     DBX [AR1,P#0.0]             // Endlage Auf WÖL
      =     #S_Endschalter_Auf

Wenn ich den IN als Block_DB nehme, kann ich die Zahl nicht mehr als INT verwenden.?.??
Wäre natürlich schöner an der Stelle mit AUF DB zu arbeiten, aber dann kann ich meinen Pointer für die SFC14 nicht mehr bauen, da da ja ein INT gebraucht wird.
Kann ich aus dem Block DB irgendwie die DB Nummer auslesen?
Hat jemand ne andere Idee?

Hier noch der Pointerbau:
Code:
      L     B#16#10                     //10h für s7
      T     LB    14
      L     B#16#2                      //Typ Byte 
      T     LB    15
      L     32                          //Anzahl (Wiederholungsfaktor) 32 Byte
      T     LW    16
      L     #DatenDB_Auma               //Datenbaustein Nummer
      T     LW    18
      L     0                           //Anfangsadresse Byte 0
      SLD   3                           //Pointer bauen
      T     LD    20
      L     B#16#84                     //Speicherbereich (hier DB)
      T     LB    20
 
Kann ich aus dem Block DB irgendwie die DB Nummer auslesen?

Code:
L P##IN_Parameter_Block_DB // IN Parameter
T MB100 // zurück kommt ein BYTE!!!!
[\QUOTE]

Hier noch der Pointerbau:
Code:
      L     B#16#10                     //10h für s7
      T     LB    14
      L     B#16#2                      //Typ Byte 
      T     LB    15
      L     32                          //Anzahl (Wiederholungsfaktor) 32 Byte
      T     LW    16
      L     #DatenDB_Auma               //Datenbaustein Nummer
      T     LW    18
      L     0                           //Anfangsadresse Byte 0
      SLD   3                           //Pointer bauen
      T     LD    20
      L     B#16#84                     //Speicherbereich (hier DB)
      T     LB    20

Warum bastelst du dir den Pointer so zusammen? 10h für s7
z.B. macht doch S7 alleine!
Gruß joru_sps
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das funktioniert irgendwie nicht so ganz.
Code:
L P##IN_Parameter_Block_DB // IN Parameter
T Temp_Int // zurück kommt ein BYTE!!!!
Wenn ich im IN DB104 angebe, gibt die SFC14 die Meldung dass der DB nicht geladen ist. Also stimmt bei der Wandlung von Block_DB in INT irgendwas nicht.
Irgendwas versteh ich da noch nicht richtig...

Das mit dem Pointer habe ich so aus der Anleitung hier im Forum übernommen.
Mag sein, dass das anders geht, aber so weit bin ich noch lange nicht... ;) Solange nenne ich mich noch COPPY/PASTE-Programmierer... ;)

Gruß
Thomas
 
Zuletzt bearbeitet:
... ich wußte nicht, dass das so problematisch ist und das ich mich nicht verständlich ausgedrückt hatte.
Jedenfalls meinte ich (nur dser Vollständigkeit halber) :
Code:
L p#Name_IN_Parameter_Block_DB
LAR1
L w [AR1 , p#0.0]
T #meine_INT_Variable

Gruß
Larry
 
FUNCTION "FCNumDB" : VOID
TITLE =DB-Nummer ermitteln
VERSION : 0.1
AUTHOR :


VAR_INPUT
Sym: BLOCK_DB;
END_VAR

VAR_IN_OUT
Num: INT;
END_VAR


BEGIN
NETWORK
TITLE =

L P#Sym;SRD 16; T #Num;

END_FUNCTION
 
Zurück
Oben