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

Seite 3 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 21 bis 30 von 32

Thema: Pointer in ein Byte Array umwandeln

  1. #21
    kai86 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    13.01.2010
    Beiträge
    158
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    @Larry hast wieder recht ich kann das nicht in ner Funktion machen, muss wahrscheinlich in nen FB was mir eigentlich wieder nicht gefällt.
    Jetzt weiß ich warum ich, warum ich das damals gelassen hatte

  2. #22
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.728
    Danke
    398
    Erhielt 2.406 Danke für 2.002 Beiträge

    Standard

    Sorry ... du mußt schon wissen, was du haben willst ...

    Aber vielleicht ist ja auch der andere von mir angedeutete Ansatz etwas sinnvoller ... (Beitrag #14)

  3. #23
    kai86 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    13.01.2010
    Beiträge
    158
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard

    ich arbeite schon mit send und receive, aber wie du dass da gemeint hast habe ich nicht verstanden. bei mir muss auf jedenfall alles in den SendeBuffer rein bevor ich es senden kann.

  4. #24
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.728
    Danke
    398
    Erhielt 2.406 Danke für 2.002 Beiträge

    Standard

    Ich meinte es so :
    Alles, was du schon in SCL hast, das kannst du auch in SCL komfortabel bewurschteln ...
    Du legst dir also in deinem Baustein ein ARRAY_of_Byte in der von dir benötigten Größe an. Außerdem legst du dir im TEMP-Bereich einen ANY-Pointer an. Und dann geht es etwa so :
    Code:
    FUNCTION_BLOCK FB511 
    VAR_INPUT
       CP_ADDR             : INT ;    // Perepherie-Adresse des CP340
    END_VAR
       
    VAR
       Receive        : P_RCV ;
       Send           : P_SEND ;
    (*
    V24_STAT(LADDR := CP_ADDR // IN: INT
             ,DTR_OUT := Status.DTR // OUT: BOOL
             ,DSR_IN := Status.DSR // OUT: BOOL
             ,RTS_OUT := Status.RTS // OUT: BOOL
             
       Receive_Puffer : ARRAY[1..6] OF BYTE ;
       
    END_VAR
      
    VAR_TEMP
       DatenQuelle_Adr : INT ;
       DatenQuelle_Any : ANY ;
       DatenQuelle_struct AT DatenQuelle_Any : STRUCT
                       ID_Code   : BYTE ;   
                       DataTyp   : BYTE ;
                       Anzahl    : WORD ;
                       DB_Nr     : WORD ;
                       SpeicherPtr : DWORD ;
                    END_STRUCT ;
    END_VAR
      
    BEGIN   
       DatenQuelle_Any := Receive_Puffer ;
       DatenQuelle_Adr := DWORD_TO_INT(SHR (IN:=(DatenQuelle_struct.SpeicherPtr AND dw#16#00FF_FFFF) , n:=3)) ;
                       
       Receive  (EN_R   := true           
                ,R      := FALSE                        
                ,LADDR  := CP_ADDR    
                ,DB_NO  := WORD_TO_INT(DatenQuelle_struct.DB_Nr)
                ,DBB_NO := DatenQuelle_Adr 
                ) ; 
    END_FUNCTION_BLOCK
    ... das ist jetzt natürlich ein Auszug aus einem meiner Programme. Es könnte ggf. etwas fehlen (). das Prinzip sollte aber erkennbar sein ...

  5. #25
    kai86 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    13.01.2010
    Beiträge
    158
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard

    hallo larry,

    das kann ich bei mir so leider nicht nutzen. wie gesagt ich habe einen RingPuffer und an den führt kein Weg vorbei.
    Zudem kenne ich die genaue Byte-Array größe nicht.
    Deswegen mit Pointer. Egal ich finde schon einen Weg wie es bei mir klappt.
    Trotzdem vielen Dank an alle für die Hilfe.

  6. #26
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.728
    Danke
    398
    Erhielt 2.406 Danke für 2.002 Beiträge

    Standard

    Du mußt es selbst wissen ...

    allerdings :
    - wie fütterst du einen FB-Send (oder -Receive) mit einem Ring-Puffer ? Die können nur aufsteigend ...
    - wenn du die Puffer-Größe nicht kennst - wie sendest und empfängst du dann jetzt ? Vario gibt es bei Step7 nicht ...
    - wo ein Wille ist, da ist auch ein Weg ...

    Gruß
    Larry

  7. #27
    kai86 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    13.01.2010
    Beiträge
    158
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard

    das senden und empfangen klappt schon seit ner weile problemlos ich wollte nur einen neuen Datentypen hinzufügen bzw. eigentlich 2 die ich senden möchte. Die normalen wie strings timestamps byte bool, reals int usw. geht alles ohne probleme.
    Der neuen Datentyp ist der BLOB und ListenElemente wobei ich letzteres fraglich finde, aber von mir wurde gefordert strukturen über tcp senden zu können. ich muss halt vorher alles in mein Ringbuffer packen. weil alles in der richtigen reihenfolge rausgesendet werden muss.

  8. #28
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.728
    Danke
    398
    Erhielt 2.406 Danke für 2.002 Beiträge

    Standard

    Du könntest ja deinen Ringpuffer (wofür immer du den brauchst) in den gleichen FB packen in dem auch der Sende-Puffer für den FB-Send ist. Nun kannst du alles komfortabel hin und her kopieren (ohne Klimmzüge).

    ...

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

    Standard

    Warum muss es eigentlich über einen Zeiger sein? Zeigerhandling (bzw. die Parametertyp POINTER oder ANY) ist in Siemens-SCL äußerst unkomfortabel.
    Bei einem SPS-Programm stehen die Array-Größen üblicherweise bei der Übersetzung des Programmes fest.

    Wenn der Puffer unbedingt außerhalb der Funktion sein muss, kannst du es auch lösen indem du das Array als Parameter übergibst. In dem Datenbaustein wo der Puffer später angelegt wird, muss dieser den gleichen Datentyp und gleiche Arraygröße wie der Parameter haben.
    Code:
    CONST
        BUFSIZE := 100;
    END_CONST
    
    VAR_IN_OUT
        byteArr : ARRAY[0..BUFSIZE] OF BYTE;
    END_VAR
    Wenn du einen FB verwendest musst du darauf achten den Parameter als VAR_IN_OUT anzulegen, denn nur dann wird dieser intern als Pointer übergeben.
    Nur so kann man SCL dazu bringen das Dereferenzieren des Pointers zu übernehmen.
    Wenn du es unbedingt als Datentyp "Pointer" haben möchtest, musst du dich wohl oder übel mit der aufwändigen Zerlegung wie in den diversen Codebeispielen hier herumärgern.
    Geändert von Thomas_v2.1 (03.02.2011 um 19:34 Uhr)

  10. #30
    kai86 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    13.01.2010
    Beiträge
    158
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    buffer größe steht nicht fest, deswegen muss ich es über Pointer machen. Aber irgendwie kann ich bei den scheiß Pointern kein AT machen in Funktionen. Und Funtkionsbaustein ist tabu für mich, dass muss irgendwie in ne Funktion rein. ich sehe mittlerweile nur noch den weg über any pointer und blockmov. ist zwar nicht das was ich wollte, weil ich meine überwachung umgehen muss aber was anderes fällt mir nicht ein.

Ähnliche Themen

  1. Antworten: 13
    Letzter Beitrag: 24.09.2009, 12:54
  2. Umwandeln von INT nach Byte u Byte + n
    Von Gerold im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 07.04.2009, 10:07
  3. Byte to String umwandeln S7-315 2PN DP
    Von Sunny4251 im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 28.08.2008, 09:31
  4. REAL in BYTE umwandeln
    Von Terence_Hill im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 18.01.2008, 20:03
  5. Bool-Array in Byte-Array
    Von Techniker im Forum Sonstige Steuerungen
    Antworten: 10
    Letzter Beitrag: 13.01.2006, 19:12

Lesezeichen

Berechtigungen

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