Step 7 Pointer (NICHT ANY) indirekt erzeugen

thorsten

Level-1
Beiträge
105
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute,

Ich stehe hier aktuell vor einem Problem,

ich muss einen Functionsbaustein am Eingang mit einem Pointer Versorgen (kein ANY Pointer nur normales Pointerformat also 6Byte)

N-un weis ich zwar wie man einen Any Pointer erzeugt also:
L P##ANYpointer
LAR1
L W#16#10
T B [AR1,P#0.0]
L W#16#2 //byte
T B [AR1,P#1.0]

usw.


Aber wie geht das für Pointer, es fängt mal schon damit an daß ich in den TEMP Variaben keinen Pointer anlegen kann so wie für ANYPointer möglich,
muss den Pointer aber indirekt erzeugen...

Meis jemand Rat?

Danke schonmal, Thorsten
 
Hallo,
du hast einen FB mit einem IN-Parameter vom Typ Pointer ?
Diesen Pointer willst du nun in dem FB auflösen ?
Oder willst du den FB beim Aufruf beschalten ? Wenn dieses dann einfach die gewünschte Variable (E0.7 , A 4.4, MB10, DB12.DBD20 usw.) daran anlegen.

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Thorsten,
ANY ist ja schon ein Pointer.

Wenn dieses dein Vorhaben ist:
L P##ANYpointer
LAR1
L W#16#10
T B [AR1,P#0.0]
L W#16#2 //byte
T B [AR1,P#1.0]

... sieht es mir auch nach einer Raute zu viel in der ersten Zeile aus.

Vllt kannst du etwas von der Programmstelle an der es hakt zeigen, oder das Problem am konkreten Fall erläutern?
 
Hallo nochmal,


Also es ist eine Funktion aus der Standart Libary "ATH" sie muss am Eingang mit einem Pointer Versorgt werden,
nun ist der DB aus welchem die Wandlerfunktion versorgt wird leider nicht fest so dass ich den Pointer indirekt adressieren müsste, (Also vergleichbar wie bei AnyPointern)
das scheint aber mit STEP 7 nur bei AnyPointern zu gehen.

Hab das Problem nun so gelöst daß ich ein TEMP Array der Grösse des Quellfeldes und eines der Grösse des Zielfeldes angelegt habe, diese befülle ich mit SFC20 "BLKMOV" welchen ich ganz normal mit AnyPointern adressieren kann.
Anschliessend die TEMP Arrays an die ATH Funktion als Pointer übergeben, und nach Abarbeitung wieder einen Blockmov des ZielArrays auf den endgültigen Zielbereich welchen ich hier wieder per ANY pointer bilde.

Ein wenig umständlich, aber es geht...


Codeauszug für die die es nachvollziehen möchten:

CALL "BLKMOV"
SRCBLK :=#EMPFANGSFACH_2 // Über Any Pointer indirekt adressiertes Empfangsfach
RET_VAL:=#RETURN
DSTBLK :=#REC_TELESTRING // Zwischenspeicher selber Grösse im TEMP Bereich

CALL "ATH" // ATH arbeitet mit den TEMP Arrays "REC_TELESTRING" und "REC_LESEFACH"
IN :=P##REC_TELESTRING
N :=W#16#3C
RET_VAL:=#RETURN_W
OUT :=P##REC_LESEFACH

CALL "BLKMOV"
SRCBLK :=#REC_LESEFACH // TEMP Array Lesefach
RET_VAL:=#RETURN
DSTBLK :=#P_RFID_LESEFACH // Über Any Pointer indirekt adressiertes Zielfach
 
Hallo,

dazu gibt es den DB-Zeiger. zB: P#DB1.DBX0.0
In den Bytes n und n+1 steht die Datenbausteinnummer.
In den anderen Bytes (n+2 bis n+5) steht der Bereichszeiger.

Es steht aber auch im Berger, dass dieser Zeiger nicht geladen werden kann und nur an einem Bausteinparameter mit Parametertyp POINTER angelegt werden kann.
STEP7 verwendet dies intern zur Übergabe von Aktualparameter.

Also ob man sich diesen jetzt selbst zusammenbauen kann und dann einen Baustein übergeben werden kann wenn er nicht geladen werden kann, kann ich nicht sagen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@TE:
Ähhh ... in deinem Beispiel kommen (auch am ATH) durchweg nur ANY-Pointer zum Einsatz. Ein Pointer zeigt nur auf Speicher-Adresse. Eine Bereichs-Größenangabe gibt es hier nicht.
Ich verstehe also deinen Ansatz in dem Kontext nicht ...

Gruß
Larry
 
Diesen Pointer-Typ kann man selber nicht dynamisch bauen - das unterstützt der Editor (Simatic / TIA) nicht. Nimmt man sich den MC7-Code mal direkt vor, dann stellt man fest, dass dieser Pointertyp sehr wohl von den CPUs dynamisch gebaut und genutzt werden kann - aber wie schon gesagt: das lässt kein Editor zu. Somit sind diese Pointer nur so nutzbar, wie godi es beschrieben hat.
 
@ Larry,

Das sehe ich nicht so, REC_TELESTRING und REC_LESEFACH sind beide im TEMP Bereich des Bausteins als Arrays of CHAR angelegt mit der Grösse die ich benötige.

Diese Arrays versorge ich mit BLKMOV aus den durch den ANY Poiter "EMPFANGSFACH_2" definierten Speicher (DB) Bereich (der die selbe Grösse hat)

der Funktion ATH übergebe ich nun einen Pointer auf den Anfangsbereich der Arrays ("P##REC_TELESTRING") sowie die Länge am N Eingang, die Funktion beschreibt dann
auf mein TEMP Array "REC_LESEFACH" dessen Anfangsadresse durch den Pointer p##REC_LESEFACH übergeben wird.

Anschliessend muss ich mit BLKMOV aus dem TEMP Array "REC_LESEFACH" in den durch den ANY Pointer "P_RFID_LESEFACH" definierten Zielberech kopieren.


ATH ist eine Standartfunktion der IEC Libary, und akzeptiert nur Pointer für die Eingänge IN und OUT
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das sehe ich nicht so, REC_TELESTRING und REC_LESEFACH sind beide im TEMP Bereich des Bausteins als Arrays of CHAR angelegt mit der Grösse die ich benötige.

Ja ... und da sie auch noch symbolisch übergeben werden wird daraus (einfach mal so) ein ANY-Pointer gebaut.
Ein Pointer kann keine Bereichs-Größe mit übergeben ... aber wir müssen das nun nicht ausdiskutieren. Vor mir aus sind das auch alles stinknormale 6-Byte-Adress-Pointer.

Gruß
Larry
 
Zurück
Oben