Adressregister direkt beschreiben?

thorsten

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

Habe hier ein kleines Problem, ich möchte innerhalb eines FC´s auf Adressen von verschiedenen DB´s zugreifen.
Nun langt es mir ja nicht ein 32 Bit Doppelwort im Format "84000024" ins Adressregister zu laden, weil damit die DB Nr noch nicht festgelegt ist.
Ich müsste also einen pointer erstellen (6Bytes) und ins Adressregister laden um auch die DBNr übergeben zu können.

Jetzt gibts aber ein Problem:
1. In FC´s gibt es keine pointer als TempVariable
2. Ich weiß nicht wie ich das Adressregister direkt beschreiben kann

Vielen Dank schonmal, mfg Thorsten
 
Halllo warum nutzt du nicht einfach "AUF DBXXX" und springst zu den verschiedenen DB's ueber einen Sprungverteiler?

Mathias
 
Zuviel Werbung?
-> Hier kostenlos registrieren
such mal in der Hilfe von S7 nach Anypointer da ist das schön beschrieben wie das geht... und du kannst sie auch in temporäre Variablen schreiben



ansonsten:

auf db[mwxxx]

und dein AR nur mit dem Offset belegen
 
Hallo,

Zum 1. Einwand: Es ist nicht immer eine Stelle im bereich der Datenbausteine auf die ich verweisen möchte, deshalb geht der "Auf" Befehl nicht.

Zum 2.
Ja bei den Anypointer bin ich auch schon angekommen,
nur wie lade ich einen solchen pointer ins Adressregister?
Auch möchte ich für Wiederholfaktor bzw Datentyp eigentlich nichts angeben, weil ich eben nur auf eine bestimmte Adresse im Db zeigen möchte.
Also keinen Bereich markieren oder einen bestimmten Variablentyp habe.

Danke, mfg Thorsten
 
Such im Forum nach "ANY" ud nach "indirekte Adressierung". Dazu hatte wir schon einige Themen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hab jetzt ein paar dinge ausprobiert,

und mein problem ist, daß ich den Inhalt des Anypointers nicht ins Adressregister bekomme:

Ich habe ne Adresse im Anypointer zb: 10_01_0001_0005_84_000007
(für S7_Bit_1X_DB5_DB_DBX1.1), die möchte ich jetzt ins Adressregisterladen, also in etwa so:

L #Anypointer
Lar1

das akzeptiert der kompiler nicht, ich kann nur nen pointer auf any laden:

L p##Anypointer
Lar1

damit habe ich aber die Adresse des Anypointers im Adress-Speicher (irgendwas in den Lokaldaten mit 87.... als Adresse) und nicht die im Anypointer gespeicherte Adresse!

Jetzt kann ich mir zwar den Innhalt aus dem Anypointer in Lokalvariablen schreiben und diese dann ins Adressregister laden, aber dann hab ich das Problem daß ich nur Variablem bis DWord dafür zur Verfügung habe und damit immer die DB NR verliere!

Also so:
L p##Anypointer
Lar1
L D[6.0,p#0.0]
t #TempVariable_Typ_Dword <-- Nur Dword also kann ich info für DB Nr aus w [4.0,p#0.0] des anypointers nicht mit abspeichern!

.
.
.

L #TempVariable_Typ_Dword
Lar1 <-- weil die TempVariable nur Dword ist verliere ich die Information für die DB Nr
Wie lade ich diese?

mfg Thorsten
 
Zuletzt bearbeitet:
Ich denke, da wirst du die doch die DB-Nummer extra "mitführen" müssen.
Speichern kannst das nur in einem Typ Any, das stimmt. Um dann deine Daten zu laden, mußt du dir die DB-Nummer aus dem ANY auslesen und diesen über AUF DB [...] öffnen. Was Besseres fällt mit dazu auch gerade nicht ein.
 
Ich denke, da wirst du die doch die DB-Nummer extra "mitführen" müssen.
Speichern kannst das nur in einem Typ Any, das stimmt. Um dann deine Daten zu laden, mußt du dir die DB-Nummer aus dem ANY auslesen und diesen über AUF DB [...] öffnen. Was Besseres fällt mit dazu auch gerade nicht ein.
Das sehe ich auch so, zumindest habe ich das bei ähnlichen Fällen auch so gemacht.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

Ja da haste recht, damit versuche ichs auch gerade, klappt auch ist nur nicht besonders elegant. Außerdem muss ich jetzt ne extra Fallunterscheidung machen ob ich Bereiche im Datenbausteinbereich oder im Merker bzw. Peripheriebereich ansprechen mächte, da ich bei denen den DB eben nicht öffnen darf!

Naja, vieleicht fällt einem hier ja noch was ein, ansonsten Danke für eure Hilfe!

mfg Thorsten
 
Hallo,

Ja da haste recht, damit versuche ichs auch gerade, klappt auch ist nur nicht besonders elegant. Außerdem muss ich jetzt ne extra Fallunterscheidung machen ob ich Bereiche im Datenbausteinbereich oder im Merker bzw. Peripheriebereich ansprechen mächte, da ich bei denen den DB eben nicht öffnen darf!

Naja, vieleicht fällt einem hier ja noch was ein, ansonsten Danke für eure Hilfe!

mfg Thorsten
Es wurde hier im Forum mal behauptet, das ein DB "0" geöffnet werden darf...
Wenn das so ist (IMHO ist es NICHT so), dann brauchst du keine Fallunterscheidung, da, wenn kein DB, der entsprechende Eintrag im Pointer eben "0" ist.
 
Hallo Thorsten,

...Außerdem muss ich jetzt ne extra Fallunterscheidung machen ob ich Bereiche im Datenbausteinbereich oder im Merker bzw. Peripheriebereich ansprechen mächte, da ich bei denen den DB eben nicht öffnen darf!
Ja, wenn du die den Pointer selbst zusammenstellst, musst du eine Fallunterscheidung machen. Und zwar bei der Erstellung des Pointers! Im Byte 2 des DB-Pointers, bzw. im Byte 6 des ANY-Pointers muss der Operandenbereich angegeben werden. Dann klappt das auch mit dem (scheinbaren) Öffnen des DB0 wenn der Pointer z.Bsp. auf einen Merkerbereich zeigt.

Beim Zugriff auf die Daten ist keine Fallunterscheidung notwendig und kann immer so aussehen (Bsp. 6byte-Pointer):

Code:
      L     P##POINTER         // Eingangsparameter
      LAR2  
      L     W [AR2,P#0.0]
      T     #TEMP_INT
      AUF   DB [#TEMP_INT]
      L     D [AR2,P#2.0]
      LAR2               // bereichsübergreifender Zeiger in AR2 
 
 
      L     W [AR2,P#0.0]   // Bsp. Zugriff auf Daten

Einfacher ist es, den POINTER oder ANY als Eingangsparameter an die FC zu übergeben. Dann übernimmt Step7 diese Fallunterscheidung. Der Operandenbereich wird sich zur Laufzeit wohl nicht ändern, oder? Die Adresse (Byte 1 bis 3, nicht Byte 0) im bereichsübergreifenden Zeiger kannst du dann in der FC überschreiben.


Gruß, Onkel
 
Zuletzt bearbeitet:
Zurück
Oben