Fehlinterpretation Pointer??

sventek

Level-2
Beiträge
98
Reaktionspunkte
8
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute!

Kann es sein, dass Step7 einen Pointer falsch interpretiert, oder habe ich einen Denkfehler?
Code:
      L     #HW_Konfig_E_A_Adresse      // Adresse laut HW-Konfig
      SLD   3                                     // Konvertierung ins Pointerformat
      LAR1                                        // Adresse in Doppelwort
 
      L     P##FU_REC                        //Statische Bausteinstruktur
      LAR2  
 
 
      L     ED [AR1,P#4.0]              // 1. Doppelwort Prozessdaten laden
      T     DID [AR2,P#4.0]             // Und in statische Struktur kopieren

Der Code ist, glaube ich zumindest, selbsterklärend.

Wenn jetzt aber in der Bausteinschnittstelle im Eingangsbereich an der Adresse 4.0 eine Variable mit 32 Bit Länge (DInt, DWord, Real) deklariert ist, z.B. Soll_Wert : Real;, dann wandelt der Editor nach dem Speichern obigen Code folgendermaßen um:

Code:
      L     ED [AR1,P#4.0]              // 1. Doppelwort Prozessdaten laden
      T     #Soll_Wert             // Und in statische Struktur kopieren

Das kann (darf) doch nicht sein, oder?

Kann mir das bitte jemand erklären?

Danke

mfg
sventek
 
it's not a bug, it's a feature ... würdest du bereichsübergreifend zugreifen, würde es nicht geändert werden ...

ich glaube/vermute/würde suchen ...in den einstellungen gibt es eine option code-optimieren oder ähnliches - kann es aber nicht garantieren, da kein sepp7 greifbar
 
das ist doch ein bereichsübergreifender zugriff, da der pointer eine information über den speicherbereich enthält.
code optimieren gibt es nur im scl editor.

sventek
 
speicherbereich(E,A,DB,...) ist nicht gleich datentyp (int,real,...). speicherübergreifend deshalb, weil von einem speicherbereich in einen anderen. hat nix zu tun mit einem datentyp.

aber ich glaube wir kommen vom thema ab.

noch mal meine frage:

warum interpretiert der editor einen indirekten speicherzugriff l xx[AR2, Px.0] nicht als einen zugriff auf eine adresse die im AR2 steht, plus einen Versatz, sondern als einen zugriff auf das instanzdatenwort 0 + versatz?

sventek
 
Das liegt daran dass du diesen Zugriff in einem Multiinstanz-fähigen Funktions-Baustein machst. In einem MI-fähigen Baustein sieht der symbolische Zugriff eben so aus, dass immer mit dem Adressregister 2-Offset gearbeitet wird.
In einem MI-FB wird dein Baustein auch nur funktionieren, wenn du ihn niemals in einer MI nutzt, weil dann dein Zugriff auf das DID in die Hose geht.

Legst du deinen FB als nicht Multiinstanz-fähig an, dann wird der Zugriff auch nicht in das Symbol umgewandelt. Und dann kann auch keiner auf die Idee kommen, diesen wirklich als Multiinstanz einzusetzen.
 
Man könnte auch die Funktion von AR1 und AR2 tauschen:
Code:
      L     ED [[COLOR="Red"]AR2[/COLOR],P#4.0]              // 1. Doppelwort Prozessdaten laden
      T     DID [[COLOR="red"]AR1[/COLOR],P#4.0]             // Und in statische Struktur kopieren

Harald
 
Hallo Thomas_2.1!

Noch ein Zusatz:

In einem MI-FB wird dein Baustein auch nur funktionieren, wenn du ihn niemals in einer MI nutzt, weil dann dein Zugriff auf das DID in die Hose geht.

Ich habe diesen Zugriff auch schon in einer MI gemacht, und es funktioniert. Ich habe in meinem Codeausschnitt "unwichtiges" weggelassen, wie z.B. Adressregister retten, Konvertierung in das Pointerformat, Adressregister wiederherstellen.

Mit ist das nur aufgefallen, da ich zufällig an der Adresse 4.0 einen 32Bit Datentyp deklariert habe. Steht an dieser Adresse z. B. ein Int funktioniert alles wunderbar.

sventek
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe in meinem Codeausschnitt "unwichtiges" weggelassen
OK, und hierfür:
Code:
      L     P##FU_REC                        //Statische Bausteinstruktur
      LAR2
hast Du hoffentlich original sowas stehen:
Code:
      L     P##FU_REC                        //Statische Bausteinstruktur
      [COLOR="Red"]+AR2[/COLOR]
wenn es in einem MI-FB funktionieren soll?

Harald
 
ist es nicht so das in "temp_AR2" unter umständen einen Bereichszeiger
hast und dann diesen wieder ins AR2 mit den Offset von AR1 zurück-
schreibst. Dann mit dieser Anweisung "T DID [AR2,P#4.0]" wieder
den Bereichszeiger zuweist. Versuche doch mal wenn du das AR2 addierst
den Bereichszeiger auszumaskieren.
 
Zurück
Oben