Blockmove...
Hallo FrankW.
Also, ich habe eine FC programmiert mit einem Input-Parameter udtTest vom Typ UDT 920. Sonst hat der FC keine weiteren Parameter.
Die UDT 920, mit Trallalla-Daten, hat 32 Byte. Im DB 1 gibt es eine Struktur udtTest vom Typ UDT 920.
Diese FC habe ich im OB 1 aufgerufen. Als aktualparameter an udtTest habe ich "dbTest".udtTest parametriert, eine Struktur vom Typ UDT 920. Sonst ist im OB1 kein weiterer Aufruf. Der OB1 enthält nur seine Standard-Lokalvariablen (20 Byte).
Im FC 1 habe ich folgende Befehle eingefügt:
L P##udtTest
LAR1
L W [AR1,P#0.0]
L W [AR1,P#2.0]
L W [AR1,P#4.0]
So. Dann habe ich das Miniprogramm im PLCSIM gestartet und mir die FC 1 online angesehen.
Der erste Befehl liefert 870000a8 (hex). Das ist ein Pointer! Er bedeutet Lokalvariablen des Vorgängers (die 87) und die BIT-Adresse dieser Variablen. Man mus also a8 durch 8 dividieren und erhält dann 15 (hex) oder 21. Der In-Parameter verweist also auf eine Lokalvariable des Vorgängers (des OB1) die ab Adresse 21 steht. Und das ist korrekt.
Mit dem 2. Befehl wird dieser Pointer in das Adressregister 1 geladen.
Die Befehlszeilen 3 - 4 liefern den Inhalt der Lokalvariablen, nämlich den eigentlichen Pointer auf meine Struktur im DB 1.
Online kann man lesen:
Befehlszeile 3 -> eine 1. Das ist DB 1
Befehlszeile 4 -> 8400 (hex). Das bedeutet Speicherbereich DB (die 84) und ein Teil der Adresse, welche hier null ist.
Befehlszeile 5 -> 01b0 (hex). Das ist die Bitadresse im DB 1 der Struktur udtTest. 1bh umgerechnet ergibt Byte 54, das Startbyte meiner Struktur.
Ein besonderer Hinweis für alle, die sich mit Pointern und Co etwas schwer tun. In der Simatic-Onlinedokumentation (Titel: STEP 7 - Programmieren mit STEP 7) im Anhang A3 findet ihr alles über Speicherbereiche, Pointer, Anypointer, Datenformate... Das sind die wichtigsten 30 Seiten des Handbuches, die man lesen sollte. Der Rest des Buches, na ja.
Gruß Puddl