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

Ergebnis 1 bis 3 von 3

Thema: Any-Pointer aus FC zurückgeben

  1. #1
    Registriert seit
    08.09.2014
    Beiträge
    9
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,
    ich habe mal wieder Probleme mit den Any-Pointern. Ich habe eine Funktion geschrieben die die Byteadresse die im Any-Pointer gespeichert ist um eine beliebige Anzahl Bytes erhöht.
    Hier der Quelltext:
    Code:
    
    FUNCTION ANY_ADD : VOID
    
    VAR_INPUT
        NumBytes: INT;
        SrcAny: ANY; 
    END_VAR
    
    VAR_IN_OUT
        DestAny: ANY;
    END_VAR    
                
    VAR_TEMP
        tmpAny: ANY;
        tmpAnyView AT tmpAny: STR_ANY;blen
        byteAddress: INT;
    END_VAR
    
    BEGIN
        tmpAny := SrcAny;   
        
        //Byte Adresse aus Any Pointer holen
        byteAddress := DWORD_TO_INT(SHR(IN:= tmpAnyView.bytePointer, N:= 3));
        
        //Byte Adresse um NumBytes erhöhen
        byteAddress := byteAddress + NumBytes;
        
        //Alte Addresse Löschen
        tmpAnyView.bytePointer := tmpAnyView.bytePointer AND DW#16#FF000000;
        
        //Neuen Addresse Einfügen
        
        tmpAnyView.bytePointer := tmpAnyView.bytePointer OR SHL(IN := INT_TO_DWORD(byteAddress), N:= 3);
        
        
       //Hier tritt das Problem auf!!!    
        DestAny := tmpAny;
    
    END_FUNCTION
    Die Funktion erwarte am Eingang SrcAny einen AnyPointer dessen Byteadresse um die Anzahl Bytes die am Eingang NumBytes übergeben wird erhöht wird. da der Ursprüngliche Pointer nicht verändert werden soll wird noch ein zweiter Any-Pointer an DestAny übergeben. Ich habe die Funktion im TestModus beobachtet, sie macht was sie soll, also um den Code müsst ihr euch nicht kümmern. Einzig und alleine die Rückgabe (rot makiert) ist das Problem.

    Da Any-Ausgangsparameter nicht mit Temporären Variablen versorgt werden können habe ich DestAny als Durchgangparameter deklariert.
    Hier meine 1. Frage? Warum ist die Versorgung eines Any-Ausgangsparameters mit einem temporären Any-Pointer verboten??? Wenn ich dem Any-Ausgang bspw. einen temporären INT zuweise verstehe ich das ganze. Die Funktion beendet sich, der AnyPointer zeigt auf eine Stelle im L-Stack an der aber die INT-Variable nicht mehr vorhanden ist.

    Aber warum wird die Versorgung mit einem lokalen ANY verboten. Weise ich einem Any-Pointer einen anderen Any-Pointer zu wird doch, jedes Feld des ANY einfach kopiert.

    Kleines Beispiel:

    Code:
    VAR_TEMP
    tmpAny1: ANY; tmpAny2: ANY; intTest: INT;
    END_VAR tmpAny1 := intTest; tmpAny2 := tmpAny1;
    tmpAyn2 zeigt in dem Beispiel genauso auf intTest wie tmpAny1. Beide ANY sind identisch von ihrem Inhalt.

    Warum darf ich jetzt nicht DestAny := tmpAny; zuweisen?

    DestAny ist auch nach dem Funktionsaufruf vorhanden, da dies ja eine Variable ist, die von einem anderen Baustein übergeben wurde. Jetzte kopiere ich den tmpAny eins zu eins nach DestAny. Das der tmpAny nach dem sich die Funktion beendet hat nun nicht mehr vorhanden ist, spielt doch keine Rolle. Ich habe ja nur den Inhalt des Pointers kopiert.

    Die 2. Frage wäre dann: Weiß jemand wie man dies Einschränkung umgehen kann und ich den neuen ANY wieder aus meinem FC herausbekomme?

    Grüße


    Jason07

    EDIT: Wichtig wäre noch mein UDT: STR_ANY

    Code:
    TYPE STR_ANY
    STRUCT
    syntaxID: BYTE; dataType: BYTE; dataCount: WORD; dbNumber: WORD; bytePointer: DWORD;
    END_STRUCT;
    Geändert von Jason07 (17.09.2014 um 14:40 Uhr)
    Zitieren Zitieren Any-Pointer aus FC zurückgeben  

  2. #2
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.718
    Danke
    398
    Erhielt 2.399 Danke für 1.999 Beiträge

    Standard

    Hallo,
    Zitat Zitat von Jason07 Beitrag anzeigen
    Warum darf ich jetzt nicht DestAny := tmpAny; zuweisen?
    Das liegt daran, weil dein IN_OUT-Any von "Aussen" kommt. Du würdest jetzt aber durch die Zuweisung den "äußeren" Zeger verschieben - das wird SCL wohl nicht mögen ...

    Zitat Zitat von Jason07 Beitrag anzeigen
    EDIT: Wichtig wäre noch mein UDT: STR_ANY

    Code:
    TYPE STR_ANY
    STRUCT
    syntaxID: BYTE; dataType: BYTE; dataCount: WORD; dbNumber: WORD; bytePointer: DWORD;
    END_STRUCT;
    Was möchtest du damit zum Ausdruck bringen ?

    Gruß
    Larry

  3. #3
    Jason07 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    08.09.2014
    Beiträge
    9
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Genau das war mein Plan, den äußeren zeiger zu Verbiegen. Dachte das wäre genau der Sinn von Durchgangsparametern. Ähnlich wie die Referenzparameter in C. Anstatt mit Kopien arbeitet man mit dem Original. Schade das das nicht funktioniert. Bleibt nur die Möglichkeit den Any-Pointer als Strucktur zurückzugeben richtig?

    Ich wollte damit nichts zum Ausdruck bringen. Ich hatte die Strucktur nur oben in meinem Quellcode genutzt, aber vergessen zu Deklarieren, deswegn hab ich diese noch nachgetragen.

Ähnliche Themen

  1. Antworten: 1
    Letzter Beitrag: 17.07.2014, 14:34
  2. Rockwell License Manager: zurückgeben der Lizenz?
    Von Grimsey im Forum Sonstige Steuerungen
    Antworten: 7
    Letzter Beitrag: 30.10.2013, 15:32
  3. Step 7: Any Pointer aus dem FB führen
    Von KNEFI im Forum PC- und Netzwerktechnik
    Antworten: 21
    Letzter Beitrag: 25.01.2010, 15:03
  4. Speichrzugriff über Adresse aus ANY-Pointer
    Von MarkusP210 im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 24.09.2009, 11:26
  5. Pointer aus Global DB laden
    Von Markus im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 04.11.2006, 09:23

Stichworte

Lesezeichen

Berechtigungen

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