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

Seite 1 von 4 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 32

Thema: Pointer in ein Byte Array umwandeln

  1. #1
    Registriert seit
    13.01.2010
    Beiträge
    158
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,

    brauche kurz mal eure Hilfe.
    Ich habe eine Funktion die hat als Eingangsparameter ein Pointer und eine Länge.

    der Pointer zeigt auf ein Byte Array und die Länge sagt mir wie lang das halt ist. nun will ich jedes Byte einzeln auslesen über eine for schleife.

    for i:= 0 TO länge DO
    byte := BytePointer[i];
    END_FOR;

    so gehts nicht aber irgendwie so was in der art hätte ich gern.

    Vielleicht stehe ich gerade auf dem Schlauch, aber habe gerade keine Idee wie es geht. Bitte kein BlockMov oder irgendwas mit AnyPointern muss auch irgendwie anders gehen.
    Zitieren Zitieren Pointer in ein Byte Array umwandeln  

  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

    Zitat Zitat von kai86 Beitrag anzeigen
    Bitte kein BlockMov oder irgendwas mit AnyPointern muss auch irgendwie anders gehen.
    Hallo,
    ich wntnehme deinem Code-Schnipsel, dass du mit SCL arbeiten möchtest ... ist aber eigentlich auch egal, da es kein abweichendes Vorgehen gibt.
    Du übergibst deinem Baustein via ANY-Pointer das Array. Nun enthält der ANY-Pointer alle benötigten Informationen. Du mußt nun den ANY-Pointer in seine Grundbestandteile zerlegen (das ginge in SCL mit einer AT-Sicht) und kannst damit dann deine Schleife füttern.
    Einen anderen Weg gibt es nicht ...

    Was machen wir da nun ?

    Gruß
    Larry

  3. #3
    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 bekomme keinen Any-Pointer sondern nur einen einfachen Pointer.
    Den kann ich zerlegen und intern immer nach oben zählen. Das ist richtig. Aber wie mache ich aus dem Pointer ein Byte, darauf komme ich gerade nicht, das geht doch sicher irgendwie. Hast du da eine Idee Larry

  4. #4
    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

    ... und du willst das mit SCL machen ?

    Der Pointer ist eine 6 Byte breite Struktur (siehe hierzu auch die Sztep7-Hilfe).
    In Byte 0 und 1 steht die DB-Nummer als Absolutwert oder 0 wenn die Datenquelle kein DB ist.
    In Byte 2 steht die Hex-Kennung des Quell-Speicher-Bereichs. Entsprechend dieser mußt du dann die Adressierung deiner Datenquelle vornehmen.
    In den Bytes 3-5 steht der Bit-Pointer auf die Quell-Adresse. Brauchst du hier die Byte-Adresse so mußt du diesen Wert noch durch 8 dividieren.

    Kannst du das umsetzen ?

  5. #5
    Registriert seit
    13.04.2010
    Beiträge
    12
    Danke
    0
    Erhielt 2 Danke für 2 Beiträge

    Standard

    Zitat Zitat von kai86 Beitrag anzeigen
    Hallo,


    for i:= 0 TO länge DO
    byte := BytePointer[i];
    END_FOR;

    so gehts nicht aber irgendwie so was in der art hätte ich gern.

    Vielleicht stehe ich gerade auf dem Schlauch, aber habe gerade keine Idee wie es geht. Bitte kein BlockMov oder irgendwas mit AnyPointern muss auch irgendwie anders gehen.

    Hallo Kai,

    so wie du das gemachts hast, schreibst du in jedem Schleifendurchlauf den Wert der verschiedenen Byte[i] auf die gleiche Variable. Am Ende steht dann der Wert von Byte[Länge] in dem Byte.

    Wenn du das Ganze umkopieren willst müßte der Code so aussehen:
    For n := i to Länge Do
    Byte1 [i] := byte2[i]
    End_For;

    Oder hab ich was falsch verstanden?

    Gruss,
    Piloti

  6. #6
    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

    @piloti:
    Sprechen du und der TE von der gleichen Sache ?

  7. #7
    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 ich alles in ein byte schreibe ist mir klar.
    War auch nur als Beispiel gedacht.

    @Larry das kriege ich schon hin mit dem AT

    damit kann ich immer den zeiger um 1 Byte erhöhen.

    aber wie bekomme ich wenn der Zeiger nun auf ein Byte in einem DB zeigt den Wert aus dem DB.

    byte := Pointer^; oder wie es auch immer gehtich will gerade einfach nur noch einen Wert haben auf den der Pointer gerade zeigt.

    byte := Pointer; glaube ich nicht das es geht. aber vielleicht ist das auch möglich mal testen.

  8. #8
    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

    also direkt gehts nicht.
    hätte mich auch gewundert.

    byte := Pointer; <---- ich will den Wert worauf der Pointer zeigt.

    muss doch gehen.

  9. #9
    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 Kai,

    wie schon gesagt mußt du den pointer zerlegen. Hast du dir dazu die Step7-Hilfe mal angesehen ?

    Das zerlegen in SCL könnte so in etwa aussehen :
    Code:
       
    FUNCTION_BLOCK FB500     
    //     Bausteinparameter
    VAR_INPUT
       PEW_Adr : POINTER ; 
       a_PEW_Adr AT PEW_Adr : STRUCT
                              DB_Nr   : INT ;
                              Mem_Ptr : DWORD ;
                              END_STRUCT ;
    END_VAR
    
    VAR_IN_OUT
    END_VAR
    
    VAR_OUTPUT
       Mem_Typ : BYTE ;
       Mem_Adr : INT ; 
    END_VAR
    
    VAR_TEMP
       Mem_Ptr : DWORD ; 
    END_VAR
    
    //     Anweisungsteil
    BEGIN
       Mem_Typ := DWORD_TO_BYTE(SHR (IN:=a_PEW_Adr.Mem_Ptr , n:=24)) ;
       Mem_Ptr := a_PEW_Adr.Mem_Ptr AND dw#16#00FF_FFFF ;
       Mem_Adr := DWORD_TO_INT(SHR (IN:=Mem_Ptr , n:=3)) ;
    END_FUNCTION_BLOCK
    Der Code sollte so funktionieren.
    Wenn ich es richtig in Erinnerung habe so kannst du in SCL nur bei einem FB eine AT-Sicht auf einen Pointer machen.

    Probier mal mit dem Code ...

    Gruß
    Larry

  10. #10
    Registriert seit
    08.04.2008
    Ort
    Köln
    Beiträge
    844
    Danke
    39
    Erhielt 244 Danke für 199 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,

    in SCL bin ich überhaupt nicht fit, aber was Kai will würde in AWL ungefähr so aussehen:
    (Nachdem er den Pointer zerlegt hat)

    Code:
    L DBB [#Pointer]
    T DBB xy
    #Pointer = Byteadresse

    vllt. kann Larry das ja übersetzen.

    Grüße
    Gebs
    Geändert von Gebs (03.02.2011 um 13:04 Uhr)

Ä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
  •