Step 7 AWL Verständnisprobem

Bitte ein Bit

Level-2
Beiträge
74
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich habe ein kleines Verständnisproblem mit Any Pointer Laden, folgendes Code:

L P##DB_STA_1 // Lade Pointer auf 1. HMI-DB INPUT: ANY
LAR1 // Lade Adressregister 1
L D [AR1,P#6.0] // Lade DB-Nr aus Pointer
T #BA01_Pointer.DB_No Temp: INT



Der Code Funktioniert auch, aber warum läd es 6.0 statt 4.0?
Oder habe ich den Aufbau des Any Pointers nicht verstanden,
Bitte um Aufklärung.

Und die 2. Frage:
Wenn ich ein Any Pointer (80 Bits) in AKKU1 (32 Bits) Lade, was steht dann in AKKU1 drin?
 
Any siehe Anhang.
Ich hätte die DB Nummer auch in Byte 4 und 5 erwartet aber halt als Word.
Das DWord in Byte 6 bis 9 ist der eigentliche Pointer.
 

Anhänge

  • Any.png
    Any.png
    4,8 KB · Aufrufe: 31
Zuviel Werbung?
-> Hier kostenlos registrieren
Der Code Funktioniert auch, aber warum läd es 6.0 statt 4.0?
Der Code ist definitiv nicht korrekt und dürfte gar nicht funktionieren.
Kann es sein, daß #DB_STA_1 ein Input eines als Multiinstanz aufgerufenen FB ist und der gute original-Programmierer nicht wußte (oder absichtlich ignorierte), wie man den Multiinstanz-Offset aus AR2 korrekt addiert?


Und die 2. Frage:
Wenn ich ein Any Pointer (80 Bits) in AKKU1 (32 Bits) Lade, was steht dann in AKKU1 drin?
Einen ANY-Pointer kann man nicht in AKKUs laden, zumindest nicht komplett. Weil die Akkus 32 Bits groß sind, kann man nur maximal 32 Bit große Daten (z.B. Speicherbereiche) laden. Man kann auch 32 Bit große Teilstücke der ANY-Struktur in den AKKU laden und irgendwie verarbeiten - das ist aber nie der komplette ANY.

Harald
 
Doch der Code ist Korrekt, die Input Variable DB_ST0_1 ist als ANY deklariert, als Aktual Parameter steht dort z.B. DB601.
Langsam habe ich es verstanden, er hätte auch L W [AR1,P#8.0] schreiben können, siehe Any-Format bei Parametertypen!

Bei Parametertypen speichert STEP 7 den Datentyp und die Adresse der Parameter. Der Wiederholfaktor ist immer 1. Byte 4, 5 und 7 sind immer 0. Byte 8 und 9 geben die Nummer der Zeit, des Zählers oder des Bausteins an.

Aber warum ich in einen AKKU 10 Bytes Laden kann, und später weiter verarbeiten kann....
dass muss mir jemand bitte mal aufmalen....
 
OK, der (unschöne) Trick steckt darin, daß ein DWORD von den Bytes 6 bis 9 geladen wird aber nur das niederwertige WORD (was von Byte 8 und 9 stammt) weggespeichert wird.

Wird wenigstens irgendwo geprüft, ob der Datentyp in Byte 1 = B#16#19 ist, sprich: ob tatsächlich ein BLOCK_DB übergeben wurde?


Aber warum ich in einen AKKU 10 Bytes Laden kann, und später weiter verarbeiten kann....
dass muss mir jemand bitte mal aufmalen....
Nochmal: man kann nicht 10 Bytes gleichzeitig in einen Akku laden.
Oder willst Du uns mal zeigen, wie das bei Dir trotzdem geht?

Harald
 
Zuletzt bearbeitet:
"L P##DB_STA_1" lädt die Adresse an der die Variable #DB_STA_1 beginnt.
Code:
L P##DB_STA_1     //lädt die Adresse der Variable #DB_STA_1
LAR1              //lädt die Adresse in AR1
L D [AR1, P#0.0]  //lädt die Bytes 0..3 ab der Adresse
L W [AR1, P#4.0]  //lädt die Bytes 4..5 ab der Adresse
L D [AR1, P#6.0]  //lädt die Bytes 6..9 ab der Adresse

Harald
 
Zurück
Oben