AWL-Code Interpretaion

gravieren

Level-1
Beiträge
2.218
Reaktionspunkte
237
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi

Ich habe folgenden Code gefunden.
Leider kann ich ihn NICHT Interpretieren.
(Hat das was mit Multi-Instanz-Fähigkeiten zu tun ?)


Kann mir jemand den Code verständlich machen.
(Bin SCL verwöhnt :ROFLMAO: )


Code:
A7d3: L     P##Achse         ; Lade Pointer #Achse in AKKU 1
         LAR1                       ; Lade Adr.register 1 mit Inhalt von AKKU1
         L     W [AR1,P#0.0]
         T     LW    14           ; Tranf. AKKU 1 in Lokaldatenwort 14
         AUF   DB [LW 14]      ; Oeffne DB[Inhalt von LW14]
         L     D [AR1,P#2.0]
         LAR1                       ; Lade Adr.register 1 mit Inhalt von AKKU1
         L     D [AR1,P#34.0]   ;Range
         T     D [AR1,P#150.0] ;Templ

P.S. Die Kommentare im Code sind alle von mir.
Beinhalten nur Befehlsbeschreibung.
 
Zuletzt bearbeitet:
Hi

Ich habe folgenden Code gefunden.
Leider kann ich ihn NICHT Interpretieren.
(Hat das was mit Multi-Instanz-Fähigkeiten zu tun ?)
..

Mit Multiinstanz hat das nichts zu tun.
Eigentlich ist es doch schon "fast "gut kommentiert:ROFLMAO:
Was für dich hilfreich sein könnte:
Im ersten Befehl lädst du die Adresse von #Achse, da steht dann z.B. 2 drin.
Diese 2 lädt dann der Befehl LAR1 ins Adressregister AR1.
Wenn du jetzt einen Befehl wie z.B.
L W [AR1,P#0.0] hast dann lädst du das Wort 2.0 (AR1=2, P#0.0 -> 2 + 0.0)
oder
L D [AR1,P#2.0] hast dann lädst du das DoppelWort 4.0 ( AR1=2, P#2.0 -> 2 + 2.0)
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi


Könnte das heissen:


Code:
; LW14 ist z.b.  6
 
AUF   DB [LW 14]      ;  Öffne DB[6]
 
 
 ; imDoppelwort könnte ein Offset geladen sein ? z.b.100
; 
L     D [AR1,P#2.0]     ;  L DB6.DD2   ?

LAR1                      
 
 
Dann erfolgt der eigentliche Zugriff aud  DD134 und DD250   ?
L     D [AR1,P#34.0]   ;Range    L db6.dd134  ???
T     D [AR1,P#150.0] ;Templ    T db6.dd250  ???
 
Ich muß nochmal nachhaken. Welches Format hat die Variable #Achse. Die müßte selbst eigentlich das Format Pointer (oder ein Input per Pointer) haben, denn sonst ergibt das m.E. nicht wirklich Sinn.

Ein Pointer besteht aus 3 Word.

1 Word DB, 2 Word Adresse.

Deswegen lädt er zuerst den DB mit Versatz 0.0, dann die Adresse mit Versatz 2.0

Mit dieser Adresse und dem feöffneten DB kann dann das DW aus dem DB geladen werden.

Wenn man mit P##Irgendwas z.Bsp eine Temp-DWord adressiert und dies in AR1 lädt, kann man direkt diese Temp mit L LD[AR1, P#0.0] ansprechen. In diesem Falle ist nur ein DWord mit Versatz 0.0 also die Adresse vorhanden.

Liege ich damit richtig?
Gravieren, kannst du bitte mal mitteilen, was #Achse ist (Input, Format etc.), ist das ein FB oder FC?
 
Zuletzt bearbeitet:
Hi


Könnte das heissen:


Code:
; LW14 ist z.b.  6
 
AUF   DB [LW 14]      ;  Öffne DB[6]
 
 
 ; imDoppelwort könnte ein Offset geladen sein ? z.b.100
; 
L     D [AR1,P#2.0]     ;  L DB6.DD2   ?

LAR1                      
 
 
Dann erfolgt der eigentliche Zugriff aud  DD134 und DD250   ?
L     D [AR1,P#34.0]   ;Range    L db6.dd134  ???
T     D [AR1,P#150.0] ;Templ    T db6.dd250  ???
Wenn in D [AR1,P#2.0] 100 steht, dann stimmt das so wie du das denkst
P.S.Man schreibt DB6.DBD134 und nicht DB6.DD134
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wie Ralle schon sagte ist der Typ von #Achse interessant. Ich bin mal davon ausgegangen das er vom Typ Any ist, da ich mal davon ausgehe, das der Code schon existiert und von jemand anderes geschreiben wurde.
Hi

Ich habe folgenden Code gefunden.
Leider kann ich ihn NICHT Interpretieren.
...

Vielleicht gibts du uns noch ein paar Infos dazu
 
Zuletzt bearbeitet:
Ok ist klar, da wird ein Pointer übergeben das Format ist dann so, wie von mir oben beschrieben. Aber Achtung, das ist kein Any sondern ein Pointer, die sind Pointer ist kürzer. Das ist etwas problematisch bei Siemens, man muß wissen, was da übergeben wird, um das dann richtig auseinander zu legen.
 
Hi

Ich habe folgenden Code gefunden.
Leider kann ich ihn NICHT Interpretieren.
(Hat das was mit Multi-Instanz-Fähigkeiten zu tun ?)


Kann mir jemand den Code verständlich machen.
(Bin SCL verwöhnt :ROFLMAO: )

Ich habs nochmal hingeschrieben, sollte so stimmen:

Code:
A7d3:    L     P##Achse        ; Lade Pointerstartadresse #Achse in AKKU 1 (hier beginnt der Pointer!)
         LAR1                  ; Lade Adr.register 1 mit Inhalt von AKKU1
         L     W [AR1,P#0.0]   ; Lade die DB-Nummer, welche in einem Pointer in Word 1 steht
         T     LW    14        ; Tranf. diese DB-Nummer in Lokaldatenwort 14
         AUF   DB [LW 14]      ; Oeffne DB[Inhalt von LW14]
         L     D [AR1,P#2.0]   ; Lade den 2. Teil des Pointers also Word 2+3
         LAR1                  ; in das Adressregister, das ist jetzt die im Pointer adressierte Adresse innerhalb des DB
         L     D [AR1,P#34.0]  ; Nimm die im Pointer übergebene Adresse + den Offset 34.0 lese den Inhalt
         T     D [AR1,P#150.0] ; Nimm die im Pointer übergebene Adersse + den Offset 150.0 und schreibe das Gelesen dort hinein
 
Zuletzt bearbeitet:
Man kann aber außen am FC eine andere Struct (Anderer DB, andere Adresse der Struct im DB) anlegen und dann werden die Daten entsprechend richtig geholt und zwar nicht aus DBD34 in das DBD150, sondern entsprechend richtig in die Struct, die ja durchaus woanders im DB hingelegt werden kann (z.Bsp. ab DBD100, dann holen aus DBD134 schreiben in DBD 250). Darum ist das wohl so gelöst.
 
Hat das doch was mit Multinstanzen zu tun ?


Z.b
3 verschiedene Motoren Achsdaten in einem DB.

Anstelle von 3 DBs. (Jeder Motor seine eigenen DB)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das ist aber nicht Multiinstanz, sonder nur eine andere Datenaufteilung. Multiinstanz heißt, daß du in einem FB einen weiteren FB (oder mehrere) aufrufst, wobei du diesen FB nicht direkt aufrufst sondern im Stat-Bereich deklarierst und dann diese Deklaration aufrufst. Dadurch landen die Daten beider FB in einem gemeinsamen Instanz-DB.
 
Zurück
Oben