Anfangsadresse einer statischen Variable in einem Multiinstanzaufruf benötigt

LittleJack86

Level-1
Beiträge
44
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich benötige die Anfangsadresse einer statischen Variable in einem Multiinstanz-FB.

Genau geht es darum, dass ich den Kommunikations-FB S_RCV (Receive data from ET200S) in einem Multiinstanz-FB aufrufen möchte und die Empfangsdaten zur genaueren Auswertung in den lokalen Bereich übergeben möchte, hierzu habe ich unter den statischen Variablen ein Array eingefügt.
Der Baustein benötigt allerdings u.a. die Datenbausteinnummer, wollte ich mit DIN0 auslesen, und die Nummer des Anfangsbytes des Datenbereichs wo die Empfangsdaten abgelegt werden sollen (als INT), nur habe ich keine Ahnung wie ich mir diese Adresse beschaffen kann (Absolut eingeben wäre natürlich möglich, wäre mir jedoch anders lieber).

Schon ein mal vielen Dank für eure Hilfe!

Liebe Grüße
LittleJack
 
Stimmt.

Ist übrigens eine Zumutung, dass man so etwas berücksichtigen muss. Genauso wie die "Rettung" der Adressregister...

Das wollte ich schon IMMER mal sagen. :cool:
 
Also entweder habe ich mich etwas ungünstig ausgedrückt, oder ich verstehe den Lösungsansatz nicht so ganz.

Also ich habe einen fertigen FB (von Siemens), den FB-S_RCF, dieser liest mir von einer seriellen-Karte Daten ein und übergibt sie an einen Datenbaustein. Damit der FB-S_RCF weiß in welchem DB ich die Daten haben möchte, übergebe ich einen INT-Wert (DB_NO) mit der Nummer des gewünschten DB's, weiters muss ich dem FB-S_RCF mitteilen ab welchem Byte er die Daten in den DB schreiben soll, dies geschiet wiederum mittels INT (DBB_NO).

Diesen FB-S_RCF möchte ich nun in einen weiteren FB packen, einem Multiinstanzfähigen, dem FB-Multi.
In diesem FB-Multi habe ich im lokalen Bereich ein ARRAY definiert (Adresse 80), in dieses ARRAY sollen die Daten vom FB-S_RCF übergeben werden.

Um dies zu bewerkstelligen muss ich dem FB-S_RCF nun wieder eine DB-Nummer übergeben, welche nun die Nummer des Insrtanzdatenbausteins ist,
weiters auch die Nummer des ersten Bytes im Instazdatenbaustein ab welchem ich die Daten ablegen möchte.
Das ist momentan bei mir Byte 80, ich könnte also einfach immer zum AR2 einen Versatz von 80Byte hinzuaddiren und müsse dann bei einem Multiinstanzaufruf an der richtigen Stelle im IDB sein, oder irre ich da?
Die Adresse ist grundsätzlich fix, könnte nur durch Programmerweiterungen verschoben werden, somit bräuchte ich, glaube ich zumindest, keinen Any-Zeiger bauen, das macht mir das Programm nicht gerade übersichtlicher, was ich hald gern hätte wäre aber eine symbolische Variante.

z.B.
L P##MeinArray
>>mache was, damit ich die Nummer des ersten Datenbytes als INT bekomme<< :D

nur was könnte das sein?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Um dies zu bewerkstelligen muss ich dem FB-S_RCF nun wieder eine DB-Nummer übergeben, welche nun die Nummer des Insrtanzdatenbausteins ist,
weiters auch die Nummer des ersten Bytes im Instazdatenbaustein ab welchem ich die Daten ablegen möchte.
Das ist momentan bei mir Byte 80, ich könnte also einfach immer zum AR2 einen Versatz von 80Byte hinzuaddiren und müsse dann bei einem Multiinstanzaufruf an der richtigen Stelle im IDB sein, oder irre ich da?

Das siehst du fast richtig. Du musst aus AR2 die Byte-Adresse ermitteln und diese zu deinen 80 addieren.

Die Adresse ist grundsätzlich fix, könnte nur durch Programmerweiterungen verschoben werden, somit bräuchte ich, glaube ich zumindest, keinen Any-Zeiger bauen, das macht mir das Programm nicht gerade übersichtlicher, was ich hald gern hätte wäre aber eine symbolische Variante.

Du kannst dir ja den Poiter auf dein Array laden, die Byte-Adresse ermitteln und dann wie bereits erwähnt die Byte-Adresse aus AR2 addieren.
 
Du kannst dir ja den Poiter auf dein Array laden, die Byte-Adresse ermitteln und dann wie bereits erwähnt die Byte-Adresse aus AR2 addieren.

Meinst du ca. so?

Code:
     TAR2  #MemAR2                     //AR2 Sichern

      L     #MemAR2
      SRD   3                           //Bit-Bereich von AR2 entfernen
      T     #ByteAR2

      L     P##MeinArray                //Pointer mit meinem Array laden
      SRD   3                           //Bit-Bereich entfernen
      L     #ByteAR2                    //Byte-Adresse AR2 laden
      +D                                //zur Byte Adresse von MeinArray addieren
      T     #int_out                    //als INT ausgeben

      L     #MemAR2
      LAR2                              //AR2 wiederherstellen

...wäre das o.k., oder gibts da noch was zu beachten?
 
Meinst du ca. so?

Code:
     TAR2  #MemAR2                     //AR2 Sichern

      L     #MemAR2
      SRD   3                           //Bit-Bereich von AR2 entfernen
      T     #ByteAR2

      L     P##MeinArray                //Pointer mit meinem Array laden
      SRD   3                           //Bit-Bereich entfernen
      L     #ByteAR2                    //Byte-Adresse AR2 laden
      +D                                //zur Byte Adresse von MeinArray addieren
      T     #int_out                    //als INT ausgeben

      L     #MemAR2
      LAR2                              //AR2 wiederherstellen

...wäre das o.k., oder gibts da noch was zu beachten?

Beim drüberlesen hab ich keinen Fehler entdecken können. Müsste funktionieren. Schon getestet?
 
Hallo,

habe genau die gleiche Herausforderung. Nur dass ich das Ganze in SCL lösen möchte. Wie sieht es da aus. Hat jemand einen Tipp? Wie bekomme ich da die Lokaladresse raus? Oder benötige ich die gar nicht?

Gruß Hagen
 
Zurück
Oben