Step 7 Zeiger auf Adresse in geöffneten DB

trabajador73

Level-2
Beiträge
112
Reaktionspunkte
5
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo, Ein DB wird mit dem Befehl "AUF" geöffnet in einem FC. Im nächsten Netzwerk steht folgendes.

LAR1 P##TW_DB_zeiger // Adresse von Zeiger "TW_DB_zeiger" laden
L B#16#10 // Kennung 10 laden für ANY-Pointer
T LB [AR1,P#0.0] // und an Lokalstack Offset 0 transferieren
L B#16#2 // Kennung 2 für Datentyp BYTE laden
T LB [AR1,P#1.0] // und an Lokaldatenstack Offset 1 transferieren
L 1246 // Anzahl Bytes im DB als Wiederholungsfaktor laden
T LW [AR1,P#2.0] // und an Lokaldatenstack Offset 2 transferieren
L #zeig_DB_TW // DB-Nummer laden
T LW [AR1,P#4.0] // und an Lokaldatenstack Offset 4 transferieren
L 2#1000010000000000 // Datenbereichstyp DB-Register übergeben
T LW [AR1,P#6.0] // und an Lokaldatenstack Offset 6 transferieren
L P#0.0 // Anfang laden
T LW [AR1,P#8.0] // und an Lokaldatenstack Offset 6 transferieren
CALL "BLKMOV"
SRCBLK :=#TW_DB_zeiger
RET_VAL:=#fehler
DSTBLK :=P#DB400.DBX0.0 BYTE 1246

Ich habe verstanden der Hilfzeiger #TW_DB_zeiger zeigt zuerst auf eine Adresse des geöffneten DB, nämlich auf das 16 Byte oder Bit. Mit der Adressenaufteilung in einem DB habe ich mich noch nicht näher beschäftigt. Denn die Zeile mit "T LB[AR1, P#0.0] bewirkt eine Zeigerzuweisung auf das 16 Byte des geöffneten DB. Danach der Hilfszeiger zeigt auf das Byte 32 und P#2.0 auf Byte 1246 usw. Ich denke ich habe einige Verständnissschwierigkeiten, denn warum wird diese mehreren Zeigerzuweisungen vorgenommen, ohne weitere Ausführungen.
Genauso mir ist auch nicht verständlich die "BLKMOV" Ausführung.
Die Adresse wohin die Daten kopiert werden ist exakt zugewiesen "DSTBLK":=P#DB400.DBX0.0 nämlich ab dieser Adresse die nächsten 1246 Bytes werden beschrieben mit dem kopierten Daten aus der Adressenzuweisung von "SRCBLK". Aber diese Adressenzuweisung des Hilfsmerker reicht nach meinem momentanen Wissensstand nicht aus.

Bei mir funktioniert die Returntaste nicht. Muss irgendeine Einstellung aktiviert werden, damit die Returntaste einen Zeilenumbruch ermöglicht.


Danke für Eure Hilfe.
 
In deinem Programmstück wird lediglich eine Variable vom Datentyp ANY dynamisch zusammengebaut, bzw. das einizg dynamische ist die DB-Nummer.

Die Variable #TW_DB_zeiger wird aller Wahrscheinlichkeit nach eine Temp-Variable von Datentyp Any sein.
Mit LAR1 P##TW_DB_zeiger wird dann die Adresse dieser Variable in das Adressregister AR1 geladen. Mit den folgenden Befehlen kann dann auf AR1 + Offset auf diese Werte zugegriffen werden.
Wenn #TW_DB_zeiger z.B. an Temp-Adresse 10 liegt, wird mit LB [AR1,P#1.0] auf AR1 + Offset 1.0, also auf Adresse LB 11 zugegriffen.

Schau dir mal in der Hilfe des Simatic Managers den Aufbau des Datentyps Any an, da steht was die einzelnen Bytes bedeuten.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
In TEMP gibt es eine ANY-Variable "TW_DB_zeiger"
In dieser wird ein ANY-Pointer DB[#zeig_DB_TW].DBX0.0 BYTE 1246 erzeugt

Dein Baustein bekommt also die (variable) Nummer eines DB übergeben und kopiert dann per BLKMOV die ersten 1246 Bytes (DBB0...DBB1245) aus diesem DB in den DB400 (DBB0...DBB1245)

Der "AUF"-Befehl im Netzwerk vorher hat mit diesem Code nichts zu tun.

Harald
 
Zurück
Oben