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

Ergebnis 1 bis 5 von 5

Thema: Länge eines UDT ermitteln

  1. #1
    Registriert seit
    18.07.2007
    Beiträge
    82
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Frage


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo zusammen,

    ich habe mal wieder ein kleines Problem.
    Ich habe ein FB mit einem UDT-Eingang erstellt. Es handelt sich dabei um eine Struktur, die per TCP/IP mit Hilfe des FC5 versendet werden soll. Der FC5 wird innerhalb des FBs aufgerufen. Nun benötigt aber der FC5 auch die Länge der zu übertragenen Daten (LEN). Da sich die Struktur sich auch mal ändern könnte, möchte ich die Länge der Struktur ermitteln und dem FC5 übergeben.
    Bis jetzt versuche ich wie folgt die Länge zu ermitteln:
    Code:
    L     P##SData
    LAR2  
     L     W [AR2,P#2.0]
    T     #t_SLEN
    SData ist vom Typ des UDTs.
    Leider habe ich damit kein Erfolg, da dies nur bei einem ANY-Pointer funktioniert.
    Weiss jemand wie man das machen kann.

    Gruß, Woto
    Zitieren Zitieren Länge eines UDT ermitteln  

  2. #2
    Registriert seit
    11.05.2005
    Ort
    Baden-Württemberg
    Beiträge
    669
    Danke
    113
    Erhielt 153 Danke für 124 Beiträge

    Standard

    Warum so kompliziert?
    Opfer halt ein Wort im IN oder STAT Bereich des FBs.
    Dort schreibst du die Länge der UDT rein und beschaltest damit deinen FC5

    Damit sparst du dir die (unnötige) Auswertung...

    Micha
    "arbeite klug, nicht hart" - deutsches Sprichwort

  3. #3
    Registriert seit
    29.03.2004
    Beiträge
    5.741
    Danke
    143
    Erhielt 1.687 Danke für 1.226 Beiträge

    Standard

    Zitat Zitat von Woto Beitrag anzeigen
    SData ist vom Typ des UDTs.
    Leider habe ich damit kein Erfolg, da dies nur bei einem ANY-Pointer funktioniert.
    Weiss jemand wie man das machen kann.
    Du kannst SData als Parameter vom Typ ANY anlegen, dann funktioniert auch deine Längenauswertung wie du sie oben schon geschrieben hast.

    Nachteil ist, dass dann der Compilier den Typ nicht mehr überprüfen kann.

  4. #4
    Registriert seit
    30.06.2007
    Ort
    Minden (Westf.)
    Beiträge
    178
    Danke
    42
    Erhielt 21 Danke für 21 Beiträge

    Standard

    Hi, ich hab das ganze mal in scl gelöst:

    Erstmal gibt's einen Datentyp für nen Anypointer:
    Code:
    TYPE tAnyPoint                  // Definiere ANY-Parameter in einem UDT
        STRUCT                      // 10 Bytes für ANY Pointer, z.B. P#DBx.DBX y.z BYTE n 
            SyntaxId    : BYTE;     // Immer 10 Hex  
            DataType    : BYTE;     // Code für Datentyp z.B. 01=BOOL,02=BYTE...
            DataCount   : INT;      // Wiederholfakter
            DB_Number   : WORD;     // DB-Nummer
            BytePointer : DWORD;    // Zeiger für Byte- und Bitadresse
        END_STRUCT
    END_TYPE
    Dann den FC:
    Code:
    FUNCTION SizeOfDataStruct : WORD 
    TITLE = 'Pruefe Laenge'
    VERSION : '1.1'
    AUTHOR  : SKSE
    NAME    : PrfLng
    FAMILY  : Lib09
    KNOW_HOW_PROTECT
    VAR_INPUT 
        DataStruct        : ANY      ; // Definierter ANY-Pointer
    END_VAR 
    VAR_OUTPUT
        Lng               : DINT     ; // ermittelte Länge
    END_VAR  
    VAR_TEMP 
        Buffer            : tAnyPoint; // Variable "Buffer" vom Typ UDT: "tAnyPoint"
        TempAny AT Buffer : ANY      ; // Temp. Variable zum Zugriff auf dem Buffer (UDT)
        BitCount          : DINT     ; // Bit-Zähler
        Error             : WORD     ; // Fehler-Rückgabewert
    END_VAR 
        Error := 0 ; // Rücksetze Error-Variable
     
        TempAny := DataStruct ;       // Hier werden die Daten aus der Eingangsvariable "DataStruct" (ANY-
                                      // Pointer) der temporären Variable "TempAny" (ANY-Pointer mit Zugriff auf
                                      // die Buffer-Variable vom Typ UDT "tAnyPoint") übergeben. Somit ist das Lesen 
                                      // und Schreiben der Daten in den Buffer möglich, um den Zeiger zu bilden.
     
        CASE CHAR_TO_INT(BYTE_TO_CHAR(Buffer.DataType)) OF
            1 : BitCount :=  8 * Buffer.DataCount;      // Boolean
            2 : BitCount :=      Buffer.DataCount;      // BYTE, dann multipliziere mit 8
            3 : BitCount :=      Buffer.DataCount;      // CHAR, dann multipliziere mit 8
            4 : BitCount :=      Buffer.DataCount / 2 ; // WORD, dann multipliziere mit 16
            5 : BitCount :=      Buffer.DataCount / 2 ; // INT, dann multipliziere mit 16
            6 : BitCount :=      Buffer.DataCount / 4 ; // DWORD, dann multipliziere mit 32
        ELSE:                                           // Andere Typen vom ANY-Pointer, werden nicht unterstützt!
            Error:=W#16#8001;                           // Typ vom ANY-Pointer wird nicht unterstützt
        END_CASE;
     
        Lng := BitCount ; // Länge ausgeben
        SizeOfDataStruct := Error ;  // Fehlermeldung für die Bausteinausgabe
     
    END_FUNCTION
    Und so kannste das aufrufen (SCL):
    Code:
    IF SizeOfDataStruct (DataStruct := {DEINE STRUKTUR/UDT}, lngth := lngth) = 0 THEN
        {DEINE VARIABLE FÜR DIE LÄNGENANGABE} := DINT_TO_INT (lngth);
    END_IF;
    Zitieren Zitieren hab schon mal so etwas gemacht...  

  5. #5
    Registriert seit
    18.07.2007
    Beiträge
    82
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo zusammen,

    erst einmal vielen Dank für die vielen Antworten.

    Ich habe den Vorschlag von Thomas_v2.1 umgesetzt. Problem war nur, dass der IN-Parameter vom Typ ANYPOINTER nicht direkt an den Parameter SEND vom FC5 angegeben werden kann. Dazu habe ich dann den ANYPOINTER auf eine temporäre Variable kopiert, die dann am FC5 parametriert wird.

    Viel Grüße,
    Woto

Ähnliche Themen

  1. Array länge mit SCL ermitteln
    Von Linowitch im Forum Simatic
    Antworten: 11
    Letzter Beitrag: 08.07.2010, 12:12
  2. SCL DB Länge ermitteln
    Von Dotzi im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 03.07.2010, 20:01
  3. DB-Länge ermitteln
    Von Fliegertiger im Forum Hochsprachen - OPC
    Antworten: 4
    Letzter Beitrag: 18.12.2007, 15:39
  4. SCL Befehl um die Länge eines Datenbausteins zu ermitteln?
    Von 1.0er im Forum Programmierstrategien
    Antworten: 1
    Letzter Beitrag: 13.01.2006, 02:18
  5. Gechwindigkeit aus Länge ermitteln
    Von capri-fan im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 02.02.2005, 15:43

Stichworte

Lesezeichen

Berechtigungen

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