Was macht SCL denn da mit dem AR2?

plc_tippser

Level-1
Beiträge
2.500
Reaktionspunkte
308
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
A7f4: CLR   
      U     #tmp_high_actuated
      =     #Timer_high_Fault.IN
      L     #Para.TVZ_high
      T     #Timer_high_Fault.PT
      +AR2  P#46.0
      UC    "TON"
      +AR2  P#8146.0
      U     #Timer_high_Fault.Q
      =     #Status.high
      L     #Timer_high_Fault.ET
      T     #Status.Timer_high_Rest
      U     #tmp_low_actuated
      =     #Timer_low_Fault.IN
      L     #Para.TVZ_low
      T     #Timer_low_Fault.PT
      +AR2  P#68.0
      UC    "TON"
      +AR2  P#8124.0
      U     #Timer_low_Fault.Q
      =     #Status.low
      L     #Timer_low_Fault.ET
      T     #Status.Timer_low_Rest
      U     L      0.3
      SAVE  
      BE

46 und 68 sind die Adr. im Instanz DB. Aber wofür benötigt er dieses und was macht er mit den 8124 und 8146?

Ist es nicht auch gefährlich in einem FB mit dem AR2 rumzuspielen?

:?: pt
 
Hallo pt
Kenne mich mit SCL gar nicht gut aus, weiss aber das das AR2 von Step7 bei multiinstanzen als Basisadressregisterverwendet wird. 46 und 68 scheint, wie du schon geschrieben hast, die Zeiger auf die TONs zu sein. Warum danach die 8000er werte kommen kann ich mir auch nicht vorstellen. Ist den der InstanzDB so groß?

Gruß

Andreas
 
Der Instanz-DB ist 86 Byte lang.


Komischerweise wird das AR2 nicht vorher gesichert. Es taucht das erste mal in dem Frakment auf, das ich oben gepostet habe.

Also kann ich das AR2 schon in einem FB nutzen, sollte es nur vorher temporär speichern und nach der Nutzung wiederherstellen!?

Gruß, pt
 
Hallo SPS-Concept
Ich habe gelesen, dass das AR2 nur bei FBs mit Multiinstanzen gesichert werden muß. Bei "normalen" FBs spielt es keine Rolle. Oder hast du da andere Erfahrung?

Gruß

Andreas
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Werte mit 8xxx ergänzen 46 bzw. 68 zu 8192. Meine Vermutung ist, daß der gesamte addressierbare Bereich hier 8192 Bits=1024 Bytes ist. Die "Addition" von 8146.0 ist dann eigentlich eine Subtraktion, die das Register auf den alten Wert bringt.
Da die Übergabe der Werte an den aufgerufenen Baustein TON über den Lokaldatenstack erfolgt, sollte AR2 auch dahin zeigen. Auf diese Weise bekommt der Baustein TON eine Kopie des Lokaldatenstacks ab 46.0 bzw 68.0 "zu sehen".
 
@Zottel
Du meinst der SCL-Compiler schiebt das AR2 damit wieder auf die Adresse 0.0, oder?

Gruß

Andreas
 
aus einem schlauen buch.


  • s7 verwendet bei multiinstanzfähigen funktionsbausteienen das ar2 als basisadressregister für instanzdaten. beim aufruf einer instanz steht p#dbx0.0 im ar2 und alle zugriffe auf bausteinparameter oder statische lokaldaten im fb verwenden die registerindirekte bereichsinterne adressierung mit dem operandenbereich di über dieses register. ein aufruf eine lokalinstanz erhöht mit +ar2 p#y.x die basisadresse, so dass innerhalb des aufgerufenen fb, der den instanz-db des aufgerufenen fb verwendet, relativ zu dieser adresse zugeriffen werden kann. auf diese weise können fb sowohl als eigenständige instanz als auch als lokalinstanz(und hier an beliebiger stelle in einem fb, auch mehrfach) aufgerufen werden.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Znarf schrieb:
@Zottel
Du meinst der SCL-Compiler schiebt das AR2 damit wieder auf die Adresse 0.0, oder?
Ja so ähnlich. Einige Dinge wären interessant zu wissen:
1. Ob der FB von PLC_tippser multinstanzfähig ist.
2. Wie der Aufruf diese FB aussieht, insbesondere ob der Compiler dort das AR2 auf einen definierten Wert setzt. Das könnte aber auch die Firmware beim Eintritt in einen FB tun.
3. Ob der so von SCL generierte FB als "normaler" FB verwendbar ist.
4. Wie groß der gesamte Bereich der Lokaldaten der CPU ist.
 
Hallo Zottel
zu 1 würde ich sagen, das der FB von pt eine Multiinstanz sein muß, da er ja den SFB3 (TON) aufruft, der ja auch instanziert werden muss.

zu 2 würde ich auf Volker zurückgreifen, der schreibt, dass beim Aufruf einer Instanz P#DBX0.0 ins AR2 geladen wird (Habe übrigens das gleiche Buch wie Volker :) )

zu 3 würde ich sagen, dass wenn pt die TONs weglässt, dann müsste er einen normalen FB haben.

zu 4 habe ich herausgefunden das bei den CPUs bis 317 der L-Stack pro Prioritätsklasse (also pro OB-Aufruf) fest auf 256Bytes eingestellt ist

Gruß

Andreas
 
Znarf schrieb:
Hallo Zottel
zu 1 würde ich sagen, das der FB von pt eine Multiinstanz sein muß, da er ja den SFB3 (TON) aufruft, der ja auch instanziert werden muss.
Ja dann zeigt AR2 wohl auf den Instanz-DB und der Compiler trickst da nicht rum. Jetzt ist die Frage, ob TON P#8192.0 vom AR2 abzieht. Das sollte man durch Beobachten herauskriegen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Der Baustein ist Multiinstanzfähig.

Im AR2 steht nach "+AR2 P#68.0" DB68.0
nach dem "+AR2 P#8124.0" steht das AR2 wider auf DB0

Die Lokaldaten der CPU kann der Compiler nicht kennen, da ich noch keine eingefügt hatte.

pt
 
Hallo plc-tippser

Meines erachtens kann man mit +Ar1 / +Ar2 nur einen 16-Bit grossen Wert dem AR dazu addieren! Somit kann man maximal "+AR2 P#4095.7" dazuzählen.
Ist das 2^15 Bit gesetzt, wird der Wert vom AR abgezogen, wobei bei dynamisch berechneten Pointer kann es vorkommen, dass das AR1 (oder 2) dadurch mit atronomische Werten versorgt wird.

Somit ist es auch möglich, dass das AR plotzlich wieder auch P#0.0 steht ;-).


In den AWL-Online-Hilfe von Step 7 steht auch (Zitat):
+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.

+AR2: Die Ganzzahl (16 Bit), die zum Inhalt von AR2 addiert werden soll, wird durch den Wert in AKKU1-L angegeben. Zulässig sind Werte von -32768 bis +32767.

+AR2 <P#Byte.Bit>: Der Versatz, der addiert werden soll, wird durch den Operanden <P#Byte.Bit> angegeben.
(Zitat Ende)

Wenn man grosse Werte mit dem AR1 (oder 2) manipulieren will, ist die beste Methode, das AR in den Akku zu laden und mittels +D zu addieren um anschliesen wieder ins AR zu schreiben.... oder in AWL:
TAR1
L P#10000.0
+D
LAR1

Gruss Hansruedi
 
ich bins nochmals

Da SCL sich ja nicht an die Syntax-Prüfung vom AWL-Editor halten muss und die Register auch nicht so "sauber" rettet...

hat der folgende Ausdruck die Wirkung einer AR2 Rettung:

+AR2 P#46.0 // +p#40.0
UC "TON"
+AR2 P#8146.0 // -p#40.0

Kaum zu glauben was man mit Step7 so alles anstellen kann... :wink:

Gruss Hansruedi
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hier noch eine Erläuterung zu meinem Gedankengang:
plc_tippser schrieb:
...nach dem "+AR2 P#8124.0" steht das AR2 wider auf DB0
Das ist, was ich vermutet hatte.
Die Lokaldaten der CPU kann der Compiler nicht kennen, da ich noch keine eingefügt hatte.
Hatte übersehen, daß TON ein FB (und keine FC) ist. Daher hatte ich angenommen, daß er seine Werte über den Lokaldatenstack bekäme. In diesem Fall hätte dein FB dann auch ein FC sein müssen, der die Werte für die beiden Aufrufe von TON selbst als Parameter erhält. Wenn der SCL-Compiler so etwas über AR2 abgewickelt hätte (es gibt bei Compilern außerhalb der S7-Welt solcherlei Optimierungen), wäre er vielleicht ziemlich "schlau"; allerdings würde der erzeugte Baustein nur im Kontext des Programms funktionieren.
 
Zurück
Oben