Any Pointer in multi FB

Farinin

Level-2
Beiträge
352
Reaktionspunkte
4
Zuviel Werbung?
-> Hier kostenlos registrieren
Auch auf die Gefahr hin, dass ich hier gleich gesteinigt werde, ich hab's halt noch nicht verstanden:
Wie bzw. warum funktioniert mein Any Pointer in einem Multiinstanzierten FB nicht? Ich habe irgendwas zu einer Offset Adressierung bei Multiinstanzzugriff gelesen, kriege es aber nicht hin.:confused:
Help me, please!
 

Anhänge

  • Bild 000.jpg
    Bild 000.jpg
    432,3 KB · Aufrufe: 71
LAR1 P##tmp_quell_anypointer
L W#16#10 //SyntaxID. bei S7 immer 10
T LB [AR1,P#0.0]
L W#16#2 //Typ byte
T LB [AR1,P#1.0]
L 16 //Anzahl bytes
T LW [AR1,P#2.0]
L #DBNR_Messdaten //Quell-DB
T LW [AR1,P#4.0]
L #tmp_laufvariable1 //Anfang der Quelle
SLD 3
T LD [AR1,P#6.0]
L B#16#84 //Speicherbereich (hier DB)
T LB [AR1,P#6.0]
versuch das mal du hast da ein paar fehler drinn mit 2 Lade befehlen hinter einander oder bei dir fehlt die Syntax ID vll hilfts dir ja
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Vielleicht habe ich mich noch nicht ganz genau ausgedrückt.

Ich habe einen FB(ist multiinstanziert) mit einem Any Pointer. Dort ist z.B. P#DB100.DBX 36.0 Byte 12 eintragen. Ich möcht nun die DB Nummer öffnen und die Startadresse 36 ins AR1 schreiben.
 
An welcher Stelle:
Code:
      TAR1  #tAR1
      TAR2  #tAR2
 
      LAR1  P##iKopplung
      L     W [AR1,P#0.0]
      T     LW     0
      L     W [AR1,P#2.0]
      T    LW     2
      L     W [AR1,P#4.0]
      T     LW     4
      L     D [AR1,P#6.0]
      T     LD     6
 
      L     LW     4
      T     #tDB_No
 
      AUF DB [tDB_No]
 
      L     D [AR1,P#6.0]
      SLD   8
      SRD   8
      LAR1
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
"IKopplung" ist der schon durchgereichte ANY-Pointer ? Also nicht der, in den du deinen "P#DB100.DBX 36.0 Byte 12" eingetragen hast ?
Wenn ja, so hast du mit "LAR1 P##iKopplung" erstmal den Pointer auf die ANY-Pointer-Daten.

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe einen Eingang names iKopplung vom Typ ANY angelegt und diesen von außen mit einem Pointer P#DB100.DBX 36 Byte 12 beschaltet (siehe Anhang).
 

Anhänge

  • Bild 000.jpg
    Bild 000.jpg
    29,4 KB · Aufrufe: 24
  • Bild 001.jpg
    Bild 001.jpg
    17,9 KB · Aufrufe: 23
... ich muß noch einmal etwas weiter vorher anfangen ...

Du hast einen FB1. Diesem übergibst du direkt den genannten ANY-Pointer (also "P#DB100.DBX 36.0 Byte 12 ? Den ANY-Pointer willst du in dem FB1 auswerten ? Den FB rufst du mit "call FB1, DB100" auf oder hast du ihn in die Instanz eines anderen FB (ich nenne ihn mal FB2) im STAT-Bereich eingelagert ?

Im Falle von "call FB1 , DB100" sollte der Code, so wie du ihn hast funktionieren.
Im anderen Fall mußt du dem "LAR1 P##iKopplung" danach noch den Inhalt des AR2 hinzufügen.

Gruß
Larry
 
Hallo, in Bezug auf deine Rückmeldung:
Im Falle von "call FB1 , DB100" sollte der Code, so wie du ihn hast funktionieren.
Im anderen Fall mußt du dem "LAR1 P##iKopplung" danach noch den Inhalt des AR2 hinzufügen.
Also ich benutze "den anderen Fall" und suche halt die Lösung an welcher Stelle ich das AR2 aufrechnen muss!
 
Hallo Larry. Ich habe das nun so getestet.
Code:
      LAR1  P##iKoppeladresse
      +AR2  
      L     W [AR1,P#4.0]               // Datenbausteinnummer
      T     #tDB
      L     D [AR1,P#6.0]               // Bereichszeiger
      SLD   8
      SRD   8
      LAR1  
      AUF   DB [#tDB]

Der Aufruf des DB's klappt auch, aber die Berechnung der Anfangsadresse nicht. Muß da auch noch ein Offset addiert werden?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
... die Anfangsadresse des ANY-Pointers ist der Bit-Pointer auf deine Ziel-Adresse (also um den Faktor 8 höher) aber für die Indexierung korrekt.
Du solltest also als Zahlenwert Hex120 oder dez. 288 drin stehen haben ...
 
Ich habe es getestet und der Bereichszeiger wird auch beim Aufruf auch korrekt errechnet. Aber beim zweiten Aufruf des DB's errechnet sich die gleiche Adresse, obwohl von außen eine andere übergeben wird.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also genauer:
Multiinstanzierter Aufruf:

OB1
+ FB12 , DB12 // Antriebe
+ ... // Antrieb A (z.B. Motor (FB 200))
+ ... // Antrieb B (z.B. Ventil (FB 230))
+ ... // Antrieb C (z.B. Ventil (FB 230))
+ ... // Antrieb D (z.B. Motor (FB 200))

Die Antriebe werden je Typ mit E/A's & mit einen Koppel DB (DB100) verschaltet. Bislang verfügen die FB's dann über einen Eingang vom Typ Block DB und einer Koppeladresse vom Typ Int.
Code:
AUF iDB_Nr
L iKoppeladresse
SLD 3
LAR1
Das hat aber den Nachteil, dass bei fehlerhafter Progammierung, über die Referenzdaten keine Suche möglich ist. Daher hatte ich die Idee den Any Pointer zu zerlegen und den entsprechenden DB zu öffnen und die Koppeladresse ins AR1 zu laden.
Das hat zwei Vorteile. Zu einem findet man dies in den Referenzdaten und zum Anderen kann man den Pointer symbolisch programmieren.
 

Anhänge

  • Bild 002.jpg
    Bild 002.jpg
    400,2 KB · Aufrufe: 8
  • Bild 004.jpg
    Bild 004.jpg
    359 KB · Aufrufe: 12
  • Bild 005.jpg
    Bild 005.jpg
    221,8 KB · Aufrufe: 9
Ich fasse das jetzt noch mal zusammen - dein Code sieht nun so aus :
Code:
    LAR1  P##iKopplung
      +AR2
      L     W [AR1,P#0.0]
      T     LW     0
      L     W [AR1,P#2.0]
      T    LW     2
      L     W [AR1,P#4.0]
      T     LW     4
      L     D [AR1,P#6.0]
      T     LD     6
 
      L     LW     4
      T     #tDB_No
 
      L     D [AR1,P#6.0]
      SLD   8
      SRD   8
      LAR1                     // hier legst du den übergebenen Pointer ins AR1
      AUF DB [tDB_No]    // hier schlägst du den im Pointer übergebenen DB auf
      L    W [AR1,p#0.0]  // mit den nun folgenden Lade-Befehlen würdest du den ANY-Pointer verwenden
... hast du es so ?
 
Zurück
Oben