Adressberechnung +AR2

Onkel Dagobert

Level-3
Beiträge
5.813
Reaktionspunkte
1.441
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Abend,

irgendetwas mache ich hier verkehrt (siehe Anlage). Die Abbildung bedarf keiner weiteren Erläuterung. Bei kleineren Adressen funktioniert es. Wie umgehe ich den Fehler bei größeren Adressen?


Gruß, Onkel
 

Anhänge

  • AR2.jpg
    AR2.jpg
    32,7 KB · Aufrufe: 126
spontan würde ich nur sagen da fehlt ein "ITD" vor dem SLD 3

Pointer sind 32Bit
 
aus der Hilfe zu +AR2:
+AR2 (Addiere zu AR2) addiert einen Versatz, der entweder in der Anweisung oder in AKKU1-L angegeben wird, zum Inhalt von AR2. Die Ganzzahl (16 Bit) wird zunächst vorzeichenrichtig auf 24 Bit erweitert und danach zu den niederwertigsten 24 Bit von AR 2 (Teil der relativen Adresse in AR2) addiert. Der Teil der Bereichskennung in AR2 (Bits 24, 25 und 26) wird nicht verändert. Die Operation wird ausgeführt, ohne die Statusbits zu berücksichtigen oder zu beeinflussen.

EDIT: und da sehe ich auch schon das Problem: "vorzeichenrichtig erweitert" sind die bei Siemens bescheuert??? Also meine Theorie: ab 32768 geht es schief ...
 
Zuletzt bearbeitet:
Wenn man den Pointer in einem MW speichert und sich den Inhalt des MW in der VAT ansieht, sieht eigentlich alles richtig aus.

Gruß Kai
 

Anhänge

  • FC200.jpg
    FC200.jpg
    285,5 KB · Aufrufe: 50
  • VAT.jpg
    VAT.jpg
    120,3 KB · Aufrufe: 40
Bei ner Speed7 hätte ich das ja verstanden. Die zeigen manchmal Mist im Status an :confused: .
 
Mensch, jetzt war ich woanders so vertieft dass ich meine eingenen Probleme vergessen hatte. Wenn das immer so einfach wäre :D .

Also das mit ITD und *D hatte ich schon probiert. AR2 wird natürlich vorher geladen und zeigt auf DB0.0. Ich muss jetzt erst noch mal eure Tipps aufmerksam durchlesen. Besten Dank erst mal bis hierher.


Gruß, Onkel
 
also dann komm ich nochmal auf das Vorzeichen"richtige" erweitern auf 24 Bit zurück:

51200dez sind 1100100000000000bin
erweitert auf 24bit: 111111111100100000000000bin = 16762880dez

und weil die drei LSB noch hinter das Komma wandern, durch acht dividiert: 2095360

kommt nun der DB2095360.0 bekannt vor?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bei größeren Adressen steht tatsächlich eine falsche Adresse im AR2, wenn man mit +AR2 arbeitet.

Gruß Kai
 

Anhänge

  • FC200_1.jpg
    FC200_1.jpg
    288,4 KB · Aufrufe: 24
  • VAT_1.jpg
    VAT_1.jpg
    120 KB · Aufrufe: 18
  • FC200_2.jpg
    FC200_2.jpg
    290,2 KB · Aufrufe: 19
  • VAT_2.jpg
    VAT_2.jpg
    120,4 KB · Aufrufe: 16
Entschuldigung, in der Abbildung in meinem Anhang war durch Rumprobieren noch die Zeile "+I" zu viel. Das ändert aber nichts an der Tatsache.

..EDIT: und da sehe ich auch schon das Problem: "vorzeichenrichtig erweitert" sind die bei Siemens bescheuert??? Also meine Theorie: ab 32768 geht es schief ...
Ja, genau so ist es! Man kann mit +AR? also max 32767 Bits addieren. Naja, Schleife mit +AR2?

Danke für die schnellen Antworten.


Gruß, Onkel


Oder so? Muss das morgen noch mal nüchtern durchgehen :confused: .
Code:
//   AR2 ist bereits auf "Grundadresse" geladen
 
//*** AR2 auf Anfangsadresse Datensatz "NR"
      L     #NR                         // 1..n
      L     #LOOP                       // Anzahl Bytes pro Datensatz
      *D                                // Byte-Startadresse Datensatz "NR"
      SLD   3                           // Bit-Adresse auffuellen
      TAR2                              // !!! WICHTIG
      +D                                // !!! SO
      LAR2                              // !!! VORZUGEHEN, +AR2 addiert nur Integer !!!
 
Zuletzt bearbeitet:
Ist aber schon recht interessant. Bin ich noch nie drüber gestolpert, weil ich Adressen immer als Int berechne und erst ganz zum Schluß in einen Pointer wandle. Schlimm ist, daß man das mitunter lange Zeit gar nicht merkt, bis die Adresse mal "richtig" paßt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja Ralle, ich dachte auch ich hätt's begriffen, tausendmal angewendet - man lernt halt nie aus. Habe meinen letzten Beitrag übrigens ergänzt. Vielleicht geht es so, ich check das heute nicht mehr.


Gruß, Onkel
 
hab mal einen test im simu gemacht.
das prob liegt auf jedem fall im bit 15 (vorzeichenbit)
sobald das 1 ist kommt der 'fehler'. die operation +ar2 ist, so wie es aussieht, auf int begrenzt.
kann man recht gut im bild sehen

EDIT:
ich machs auch immer so wie ralle und arbeite mit int/dint und bilde mir später meinen pointer daraus.
 

Anhänge

  • Zwischenablage02.gif
    Zwischenablage02.gif
    26 KB · Aufrufe: 32
Zuletzt bearbeitet:
Vielleicht bringt es was, mit SRD 3 wieder eine Int aus dem Pointer vom AR2 zu machen, dann die beiden INT addieren und mit SLD 3 wieder einen Pointer erzeugen, anschließend LAR2. Für "gerade" Adressen auf Wörter sollte das auch gehen.

Code:
//   AR2 ist bereits auf "Grundadresse" geladen
 
//*** AR2 auf Anfangsadresse Datensatz "NR"
      TAR2
      SRD 3
      T #diTemp
     
      L     #NR                         // 1..n
      L     #LOOP                       // Anzahl Bytes pro Datensatz
      *D                                // Byte-Startadresse Datensatz "NR"
      L #diTemp
      +D
      SLD   3                           // Bit-Adresse auffuellen
      LAR2

PS: Besser gleich DINT als diTemp.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Naja, dur bei SRD 3 geht die Bitadresse verloren. Gut, man braucht sie eher selten. Allerdings ergibt es auch keinen Vorteil gegenüber der DINT-Addition, wie oben beschrieben.


Gruß, Onkel
 
in diese richtung tendiere ich auch.
das +ar2 (+ar1 ist ja das gleiche prob) sollte man also bei hohen adressen (über 4095.7) vermeiden und mit lar arbeiten.

ob die rückrechnung zum int nötig ist, ist natürlich eine frage des progs.
besser erst gar nicht so aufbauen.
 
Jo, das ist wahr, dann ist es aber auch unnötig, das AR2 überhaupt erst mit einer "Grundadresse" zu laden. Das kann man dann gleich als "Offset" z.Bsp. in die Integer-Rechnung mit reinnehmen.
 
Zurück
Oben