Pointer als IN im FC verarbeiten

plc_tippser

Level-1
Beiträge
2.500
Reaktionspunkte
308
Beitrag von unserm registrierten User "Unregistrieter Gast":


Forumsfrage

Genau das ist ja auch der Sinn eines Pointers.
So wie du dein vorgehen beschreibst, würdest du ja keinen Pointer brauchen.
Den Pointer setzt mann ein, um dynamisch die Adresse oder auch nur Adressbereiche (BitNr., Byte, Bereich) zu "verbiegen".

Du musst zunächst den Pointer aus seinem bytearray "zerpflücken", dann kannst du an die einzelnen Adresssegmente ran, siehe hier:


=========== AWL ANFANG ===============

Code:
L P##EINGANSPOINTER      // Andresse des Eingangs- Bits, aus Pointer lesen
LAR1                    // Adresspointer adressieren
L W [AR1,P#0.0]         // erstes Wort eines Pointers enthält DB-Nr.
T #DB_NR
L 0                     // Wenn DB-Nr = 0, dann kein D sondern E/A/M
==I 
SPB noDB
 
AUF DB [#DB_NR]          // Wenn DB-Nr <>0, dann DB öffnen
 
 
noDB: L D [AR1,P#2.0]     // Bereichskennung. Byte u. Bitadresse 
T #Pnt_Bit
LAR1                     // ergibt Zieladresse als Eingangs-Adresse !!!!!!
U [AR1,P#0.0]
= #EINGANG              // Errechnete Bitposition ist das Eingangs-Bit.
 
U #EINGANG
=
=========== AWL ENDE ===============

in der Deklarationszeile der
EINGANGSPOINTER als Pointer (In)
Pnt_Bit als Doppelwort (Temporär)
DB_Nr als Int (Temporär)



Das steht übrigens auch sehr schön in der S7 - Hilfe beschrieben !


Viel Spaß noch mit den Pointern!
 
Zuletzt bearbeitet:
DB-Aufruf überspringen nicht nötig

Code:
L P##EINGANSPOINTER      // Andresse des Eingangs- Bits, aus Pointer lesen
LAR1                    // Adresspointer adressieren
L W [AR1,P#0.0]         // erstes Wort eines Pointers enthält DB-Nr.
T #DB_NR
[COLOR=darkorange][B]L 0                     // Wenn DB-Nr = 0, dann kein D sondern E/A/M[/B][/COLOR]
[COLOR=darkorange][B]==I [/B][/COLOR]
[COLOR=darkorange][B]SPB noDB[/B][/COLOR]
 
AUF DB [#DB_NR]          // Wenn DB-Nr <>0, dann DB öffnen
 
 
noDB: L D [AR1,P#2.0]     // Bereichskennung. Byte u. Bitadresse 
T #Pnt_Bit
LAR1                     // ergibt Zieladresse als Eingangs-Adresse !!!!!!
U [AR1,P#0.0]
= #EINGANG              // Errechnete Bitposition ist das Eingangs-Bit.
 
U #EINGANG
=


Der Vergleich auf 0 ist nicht notwendig, da im folgenden sowieso nicht auf das DB-Register zugegriffen wird, wenn ein E A od. M manipuliert wird.

Bei dem Sprung wird das DB-Register einfach nicht überschrieben, also der alte DB-Eintrag wird erhalten.

pt
 
Zuletzt bearbeitet:
Für die Nutzung dieser Website sind Cookies erforderlich. Du musst diese akzeptieren, um die Website weiter nutzen zu können. Erfahre mehr…