Pointer als IN im FC verarbeiten

plc_tippser

Level-1
Beiträge
2.500
Reaktionspunkte
308
Zuviel Werbung?
-> Hier kostenlos registrieren
Beitrag von unserm registrierten User "Unregistrieter Gast":


Forumsfrage
Hallo!
Wie kann ich einen FC Eingang der als Pointer deklariert ist, weiterverarbeiten?
Am Eingang des FCs ist jetzt z.B. P#E0.0 angelegt. Wenn ich aber jetzt im
FC den Aufruf 'L P##Eingang' mache, dann habe ich ja nur die Pointeradresse von der Variable "Eingang" und nicht von P#E0.0

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:
Zurück
Oben