Multiinstanz FB Zugriff auf Instanz DB von aufrufenden FB

Hab das mit dem Speicherwert korrigiert.
jetzt steht im Stack:

Adr.-Reg.1: 12.0 Adresse
Adr.-Reg.2: DB 78.0 Adresse

Somit wären wir ja schonmal bei der 0.
 
Ist der Instanz db vom aufrufenden FB. ist der DB dann vom Multiinstanz FB auch aufrufbar mit L DIW xy? weil der Multiinstanz Db ist ja wieder im Db des aufgerufenen integriert?

Aufgerufen soll dann werden: DB1100 Wort 6.
 
OK dann sollte in deinem Adressregister auch der Wert DI 6.0, oder zumindest 6.0 erscheinen.

Wenn ich dich richtig verstanden habe, liegen deine Sollwerte in der Instanz des aufrufenden FB, dass heist aber auch, dass du den Ofset aus AR2 nicht addieren brauchst.
Wenn du jetzt mit irgend einer Berechung auf 6 für das DBW 6 kommst und das in deiner Variable Speicherbereich stehen hast wirds ja schon einfacher.

Übrigens deutet der Variablenname Speicherbereich an dass du vorgeben möchtest ob du von Eingängen, Ausgängen Merker usw. sprichtst. Ist also nicht ganz trefend.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Meinte mit Speicherbereich nur dass im InstanzDB bei Station 2 zb Bereich 78+ genutzt werden soll.
Wann müsste man den Offset addieren? Habe den Code aus mehreren Themen zusammengeflickt. Zumindest soweit verstanden.
 
Den Offset musst du addieren wenn du in deiner aufgerufenen Instanz indirekt adressiert. Das kommt daher, dass der FB ja nicht weil ab welcher Adresse im Instanz-DB (des Aufrufenden FB) seine Instanz beginnt.

Du möchtest ja auf die Daten des aufrufenden FB zugreifen (wobei ich das doch als etwas seltsam erachte) darfst du den Offset nicht addieren, da ja sonst bei jedem deiner drei Multiinstanzen eine andere Aresse berechtet würde.
 
Wie würdest du das dann umsetzen? wollte halt alle Sollwerte in einem DB ablegen, so dass man nicht viele hat. So kann man dann auch alle auf einmal einsehen.

Also soweit ich das verstehe wird aber indirekt in der aufgerufenen Instanz adressiert. Die nachfolgende Schleife soll ja so lange durch die sollwerte (per Pointer) hüpfen bis der Schleifenzähler gleich ist wie die Positionsanwahl. Und dann den entsprechenden Sollwert übergeben.
Oder braucht man den Offset dann nur wenn ich indirekt in dem Pseudo-DB des aufgerufenenen FB adressieren will? So verstehe ich das.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich würde einen Global-DB mit Sollwerten anlegen.

Die Aresse würde ich auch direkt berechen und nicht wie du über eine Schleife und jedes mal vergleichen.

Vereinfacht:

10. Position würde wahrscheinlich in DBW 18 liegen (Integer)

also rechnest du (10 - 1) * 2 und schiebst das Ergebnis um 3 nach links.

10 weil das 10 Wort
- 1 weil du bei 0 zu zählen beginnst
* 2 weil ein Wort 2 Byte hat
SLD 3 weil das ganze in die Byte-Adresse muss

Alternativ kannst du anstatt * 2 und SLD 3 auch gleich SLD 4 machen.
 
Joar, klingt auch nicht blöd. werde dem mal nachgehen.

habe gerade noch etwas rumprobiert, und nicht verstanden warum er folgenden Befehl nicht aufnimmt:

Code:
      L     #Speicherbereich
      SLD   3
      T     #SpeicherW
  l diw [p##speicherw]
den letzten Ladebefehl nimmt er nicht. weiß jedoch nicht warum. weil über das SLD 3 sollte ja die Byte und Bitadresse definiert werden.
vielleicht kannst mir das abschließend noch erklären.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Naja, hab jetzt mal wieder alles neu gestartet. Und jetzt stegt se wieder mit einem Lesefehler aus. Aber....... Im Stack steht jetzt:
OB1 --- -- DB1100
FB1100 -- DB1100 DB1100
FB1101 -- DB1100 DB1100
Falls das einem weiterhilft. Ansonsten lesefehler. FB1100 ist aufrufender FB. FB1101 soll auf Instanzdb von Fb1100 zugreifen (DB1100).
Hallo Freki,
ich habe die Vermutung das deine CPU das 4-Stellige Nummernband der FB und DB Bezeichnung nicht unterstützt. Aus den Technischen Daten der CPU 314 gehen die Adressbereiche hervor. Mein Lösungsansatz für dein Problem wäre die Verwendung von 3-Stelligen Bezeichnungen oder Verwendung einer S7-400.

Gruß Hummel
 
Zuletzt bearbeitet:
Joar, klingt auch nicht blöd. werde dem mal nachgehen.

habe gerade noch etwas rumprobiert, und nicht verstanden warum er folgenden Befehl nicht aufnimmt:

Code:
      L     #Speicherbereich [COLOR=#FF0000]--->ist dieser Wert eine temp. Variable vom Typ DWord oder DINT??[/COLOR]
      SLD   3
      T     #SpeicherW
  [COLOR=#ff0000]l diw [#SpeicherW] Probier es mal so[/COLOR]
den letzten Ladebefehl nimmt er nicht. weiß jedoch nicht warum. weil über das SLD 3 sollte ja die Byte und Bitadresse definiert werden.
vielleicht kannst mir das abschließend noch erklären.

Vielleicht funtioniert es so ;-)
 
Zuletzt bearbeitet:
Hallo Freki,
ich habe die Vermutung das deine CPU das 4-Stellige Nummernband der FB und DB Bezeichnung nicht unterstützt. Aus den Technischen Daten der CPU 314 gehen die Adressbereiche hervor. Mein Lösungsansatz für dein Problem wäre die Verwendung von 3-Stelligen Bezeichnungen oder Verwendung einer S7-400.

Gruß Hummel

Ne doch nicht war ein Schnellschuss. Nummernband der verwendeten CPU ist von 1- 16000
 
Nein, hatte damals auch nicht funktioniert. die Variable Speicherbereich war aber auch ein IN, kein Temp. Falls das ein unterschied machen sollte.
 
Zurück
Oben