Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Ergebnis 1 bis 9 von 9

Thema: Pointer (NICHT ANY) indirekt erzeugen

  1. #1
    Registriert seit
    09.08.2004
    Beiträge
    101
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Frage


    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
    Zitieren Zitieren Pointer (NICHT ANY) indirekt erzeugen  

  2. #2
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.712
    Danke
    398
    Erhielt 2.397 Danke für 1.997 Beiträge

    Standard

    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

  3. #3
    Registriert seit
    16.07.2013
    Ort
    Emden
    Beiträge
    62
    Danke
    15
    Erhielt 7 Danke für 7 Beiträge

    Standard

    Hallo Thorsten,
    ANY ist ja schon ein Pointer.

    Wenn dieses dein Vorhaben ist:
    Zitat Zitat von thorsten Beitrag anzeigen
    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?

  4. #4
    thorsten ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    09.08.2004
    Beiträge
    101
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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

  5. #5
    Registriert seit
    03.01.2006
    Ort
    Im sonnigen Süden von Österreich!
    Beiträge
    1.377
    Danke
    227
    Erhielt 182 Danke für 167 Beiträge

    Standard

    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.

  6. #6
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.712
    Danke
    398
    Erhielt 2.397 Danke für 1.997 Beiträge

    Standard

    @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

  7. #7
    Registriert seit
    24.05.2006
    Beiträge
    234
    Danke
    14
    Erhielt 77 Danke für 57 Beiträge

    Standard

    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.

  8. #8
    thorsten ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    09.08.2004
    Beiträge
    101
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    @ 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

  9. #9
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.712
    Danke
    398
    Erhielt 2.397 Danke für 1.997 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von thorsten Beitrag anzeigen
    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

Ähnliche Themen

  1. Step 7 ANY-Pointer Indirekt Adressieren
    Von Heini im Forum Simatic
    Antworten: 21
    Letzter Beitrag: 25.09.2013, 15:35
  2. Pointer indirekt zu adressieren
    Von Erich04 im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 26.05.2011, 07:54
  3. Pointer indirekt
    Von smilie108 im Forum Simatic
    Antworten: 19
    Letzter Beitrag: 18.02.2011, 10:19
  4. DB-Pointer indirekt Adressieren
    Von Anonymous im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 19.03.2004, 16:59
  5. ANY-Pointer indirekt adressieren
    Von Anonymous im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 14.02.2004, 15:41

Stichworte

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •