Step 7 Adressfehler in AR1 Multiinstanz

volker

Supermoderator
Teammitglied
Beiträge
5.805
Reaktionspunkte
1.027
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo

Ich habe hier ein Problem mit einer indirekte Adresse in einer Multiinstanz
im aufrufendem multiinstanz-fb wird immer der gleiche fb aufgerufen

Bild 1 zeigt den letzten funktionierende zugriff
bild 2 den zugriff wo der fehler auftaucht anstatt 2093362 sollte ja eigentlich 4402 im ar1 stehen
bild 3 den letzten zugriff (3 aufrufe nach dem ersten fehler)

der di ist lang genug

überschreite ich irgendwie einen erlaubten adressbereich?
 

Anhänge

  • Zwischenablage01.jpg
    Zwischenablage01.jpg
    43 KB · Aufrufe: 36
  • Zwischenablage02.jpg
    Zwischenablage02.jpg
    23,7 KB · Aufrufe: 33
  • Zwischenablage03.jpg
    Zwischenablage03.jpg
    40 KB · Aufrufe: 29
Zuletzt bearbeitet:
Die +AR Befehle arbeiten nur auf 16 Bit mit Vorzeichen. D.h. ab einer Byteadresse größer 4096 funktioniert es damit nicht mehr.
Du musst dann mit den Standard 32-Bit Anweisungen arbeiten, vorher jedoch die Bereichskennung (DI, DB, etc.) ausmaskieren, und nachher wieder einsetzen. Dazu sollte es im Forum auch was aufzufinden geben.
 
hab ich mittlerweile auch rausgefunden

habs testweise so gemacht
Code:
      L     P##Fuse                     // Pointer auf Stat Fuse setzen (Struct 226.0)
      SRD   3                           //dint draus machen
      T     MD  1000                    //#pfuse_dint
      TAR2  
      SRD   3                           //dint draus machen
      T     MD  1004                    //#di_anfang
      L     MD  1000                    //#pfuse_dint
      +D                                //beiden dint addieren
      SLD   3                           //wieder einen pointer draus machen
      LAR1                              //ins ar1 transferieren
      L     #Channel_State
      L     5
      T     DIB [AR1,P#0.0]             // State in Fuse tranferieren (Struktur enthält Bitinformation
aber die lösung von blockmove ist schöner
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
dann weiss er nicht wo er hinschreiben soll. du bekommst dann in der Diagnose eine Meldung. ungültiger Bereich oder so ähnlich.

in diesen fall passt das aber
nach dem tar2 wird die bereichskennung (hier 84) entfernt
nach dem laden von p##fuse (hat 85 als bereichskennung)
und dem +d steht der Bereich auf 85 also instanz-db.

ohne Bereich kann man aber, wie ich es zuerst hatte mit
T DBB (aktueller datenbaustein, db-register 1) oder mit
T DIB (aktueller instanzdatenbaustein, db-register 2) machen
 
Was passiert wenn man das mit den Bereichskennungen vergisst?
Dann addiert +D die Bereichskennungen und die Ergebnisadresse enthält eine ungültige Bereichskennung (z.B. 16#84 + 16#85 = 16#09). Die Adresse ist dann nur noch für bereichsinterne Adressierungen nutzbar, wo die Bereichskennung ignoriert wird.

Bei +AR1 und +AR2 braucht man die Bereichskennung nicht ausmaskieren, das machen die Anweisungen selber (weil sie nur die unteren 16 Bit des Versatzes benutzen). Allerdings funktionieren +AR1 und +AR2 nur mit einem Versatz bis max P#4095.7

Hier mal ein Glanzstück ;) von professionellem Beispielprogramm, wie man den Multiinstanzoffset aus AR2 laut Siemens addieren soll:
Siemens FAQ 20443243 schrieb:
Code:
1 TAR2                Die in AR2 (Multiinstanz!) stehende Adresse wird in Akku1 geschrieben
2 UD DW#16#00FF_FFFF  Ausmaskieren unwichtiger Informationen
3 LAR1 P##test        AR1 mit der Adresse von "test" beschreiben
4 +AR1                Die in Akku1 stehende Adresse (von Multiinstanz) wird zur Adresse von "test" addiert
                      und endgültig ins AR1 geschrieben
Als Ergebnis steht die Adresse der Variablen #test im Adressregister AR1. Beachten Sie aber, dass mit "+AR1" nur ein begrenzter Wertebereich zur Erhöhung des Adressregisters 1 zur Verfügung steht (-32768 ... +32767). Das oben beschriebene Beispiel müssen Sie noch an Ihre Applikation anpassen.
Das "Ausmaskieren unwichtiger Informationen" ist in dem Beispiel völlig unnötig - das braucht man nur, wenn man mit +D statt mit +AR1 addiert.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja, die Variablenadressen P##MyVar können direkt in AR1 geladen werden ohne AKKUs zu verändern. Geht allerdings nicht bei Übergabeparametern von FC (P##InVar), da muß die Adresse des Parameters zuerst in den AKKU1 geladen werden.

Harald
 
Zurück
Oben