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

Ergebnis 1 bis 10 von 10

Thema: Pointerarithmetik statische Variable offset

  1. #1
    Registriert seit
    20.05.2007
    Beiträge
    301
    Danke
    38
    Erhielt 6 Danke für 6 Beiträge

    Frage


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,

    ich möchte gerne von einem Pointer + Offset = Zielpointer erstellen.

    Ich habe es so versucht, hat jedoch nicht geklappt? (Siehe letzten Codeblock)

    Code:
    LAR1  P##T_RECV_Any; //Anfangsadresse des Ziel-Any-Pointers in AR1 legen
    // Pointers in AR1 laden              
          L     B#16#10; // Syntax-ID in den Any-Pointer eintragen
          T     LB [AR1,P#0.0]; 
    
          L     B#16#2; // Bereichstyp BYTE laden                            
          T     LB [AR1,P#1.0]; // und im Any-Pointer ablegen
    
          L     20; // Anzahl der zu empfangenden Bytes/Worte eintragen
          T     LW [AR1,P#2.0]; 
    
          L     #BUFFER_DI; // Instanz-DB-Nummer eintragen
          T     LW [AR1,P#4.0]; 
    
    
    
          L     P##DataRecv; //Zielspeicher
          L     #ReceiveCount; // + Offset
          SLD   3; // in Pointerformat wandeln
          +D    ;
          T       LD [AR1,P#6.0]; // Zielpointer
    Zitieren Zitieren Pointerarithmetik statische Variable offset  

  2. #2
    Registriert seit
    20.11.2006
    Ort
    Hamburg
    Beiträge
    225
    Danke
    35
    Erhielt 35 Danke für 32 Beiträge

    Standard

    Es fehlt noch der Speicherbereich, der im Byte 6 eingetragen werden muss.

    In diesem Fall:
    L B#16#85 // Instanzdatenbaustein
    T LB[AR1,P#6.0]

    Dieser Eintrag sollte in deinem Fall am Ende stehen, damit er nicht vom Doppelwort überschrieben wird.

  3. #3
    Avatar von Anaconda55
    Anaconda55 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    20.05.2007
    Beiträge
    301
    Danke
    38
    Erhielt 6 Danke für 6 Beiträge

    Standard

    Aber den trage ich doch sowieso schon ein?



    L P##DataRecv; //Zielspeicher
    L #ReceiveCount; // + Offset
    SLD 3; // in Pointerformat wandeln
    +D ;
    T LD [AR1,P#6.0]; // Zielpointer

  4. #4
    Registriert seit
    20.11.2006
    Ort
    Hamburg
    Beiträge
    225
    Danke
    35
    Erhielt 35 Danke für 32 Beiträge

    Standard

    Jetzt verstehe ich was du machen willst.

    Möchtest du einen Pointer oder einen Any Pointer modifizieren?

    Es scheint es soll ein Anypointer sein.
    Ist es P#DataRecv?

    Du lädst nur die Anfangsadresse von P#DataRecv.
    Diesen musst du zuerst zerlegen um daraus den neuen Any Pointer zu bauen.

    Poste mal den gesamten Code incl. Deklaration.

  5. #5
    Avatar von Anaconda55
    Anaconda55 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    20.05.2007
    Beiträge
    301
    Danke
    38
    Erhielt 6 Danke für 6 Beiträge

    Standard

    Ich will den Anypointer "T_RECV_Any" erstellen. Der Speicherbereich soll ein Pointer P#DataRecv + Offset "ReceiveCount" sein.

    DataRecv : ARRAY [0 .. 100] OF BYTE ;
    T_RECV_Any : ANY;


    RECA: LAR1 P##T_RECV_Any; //Anfangsadresse des Ziel-Any-Pointers in AR1 legen
    // Pointers in AR1 laden
    L B#16#10; // Syntax-ID in den Any-Pointer eintragen
    T LB [AR1,P#0.0];

    L B#16#2; // Bereichstyp BYTE laden
    T LB [AR1,P#1.0]; // und im Any-Pointer ablegen

    L 20; // Anzahl der zu empfangenden Bytes/Worte eintragen
    T LW [AR1,P#2.0];

    L #BUFFER_DI; // Instanz-DB-Nummer eintragen
    T LW [AR1,P#4.0];


    L P##DataRecv;
    L #ReceiveCount;
    SLD 3; // in Pointerformat wandeln
    +D ;
    T LD [AR1,P#6.0];

  6. #6
    Registriert seit
    20.11.2006
    Ort
    Hamburg
    Beiträge
    225
    Danke
    35
    Erhielt 35 Danke für 32 Beiträge

    Standard

    so ???

    Code:
    FUNCTION "FC_AnyPointer" : VOID
    TITLE =
    VERSION : 0.1
    
    VAR_INPUT
      DataRecv : POINTER ; 
      ReceiveCount : DWORD ; 
    END_VAR
    VAR_OUTPUT
      T_RECV_An : ANY ; 
    END_VAR
    VAR_TEMP
      DW_AR1 : DWORD ; 
      DW_AR2 : DWORD ; 
      W_DBNr : WORD ; 
      W_DINr : WORD ; 
      DB_Nummer : WORD ; 
      Adresse : DWORD ; 
    END_VAR
    BEGIN
    NETWORK
    TITLE =Save AR1, AR2, DBNr, DINr
          TAR1  ; 
          T     #DW_AR1; 
          TAR2  ; 
          T     #DW_AR2; 
          L     DBNO; 
          T     #W_DBNr; 
          L     DINO; 
          T     #W_DINr; 
    NETWORK
    TITLE =
    // DataRecv zerlegen
          L     P##DataRecv; 
          LAR1  ; 
          L     W [AR1,P#0.0]; 
          T     #DB_Nummer; 
          L     D [AR1,P#2.0]; 
          T     #Adresse; 
    // Any-Pointer erstellen
          L     P##T_RECV_An; 
          LAR1  ; 
          L     B#16#10; // Syntax-ID in den Any-Pointer eintragen
          T     B [AR1,P#0.0]; 
          L     B#16#2; // Bereichstyp BYTE laden 
          T     B [AR1,P#1.0]; // und im Any-Pointer ablegen
          L     20; // Anzahl der zu empfangenden Bytes/Worte eintragen
          T     W [AR1,P#2.0]; 
          L     #DB_Nummer; 
          T     W [AR1,P#4.0]; 
          L     #Adresse; 
          L     #ReceiveCount; 
          SLD   3; 
          +D    ; 
          T     D [AR1,P#6.0]; 
    NETWORK
    TITLE =Restore AR1, AR2, DBNr, DINr
          L     #DW_AR1; 
          LAR1  ; 
          L     #DW_AR2; 
          LAR2  ; 
          L     #W_DBNr; 
          AUF   DB [#W_DBNr]; 
          L     #W_DINr; 
          AUF   DI [#W_DINr]; 
    END_FUNCTION
    p.s. alles ungetestet

  7. #7
    Avatar von Anaconda55
    Anaconda55 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    20.05.2007
    Beiträge
    301
    Danke
    38
    Erhielt 6 Danke für 6 Beiträge

    Standard

    L #Adresse;
    L #ReceiveCount;
    SLD 3;
    +D ;
    T D [AR1,P#6.0];

    So hab ich das ja auch? Bei mir funktioniert das so nicht!
    Ich verwende das für AG_RECV und da stürzt mir immer die Verbindung ab, weil der CP nicht auf den Bereich schreiben kann...


    Das hier muss doch die Zuordnung sein? Adresse + Offset, dieser ist 0 am Anfang. Er addiert also zum Pointer Adresse 0.
    Oder geht das so mit dem Pointer nicht? Wie erhalte ich die Adresse?

    L P##DataRecv;
    L #ReceiveCount;
    SLD 3; // in Pointerformat wandeln
    +D ;
    T D [AR1,P#6.0];
    Geändert von Anaconda55 (15.11.2011 um 08:19 Uhr)

  8. #8
    Registriert seit
    19.06.2005
    Ort
    in Bayern ganz oben
    Beiträge
    1.360
    Danke
    188
    Erhielt 372 Danke für 290 Beiträge

    Standard

    Hi,

    beobachte es einfach mal Online und lasse die Adressregister mit anzeigen.

    Gruss Daniel
    Erfahrung ist eine nützliche Sache. Leider macht man sie immer erst kurz nachdem man sie brauchte...

    OSCAT.lib Step 7

    Open Source Community for Automation Technolgy

    SPS-Forum Chat (Mibbit) | SPS-Forum Chat (MIRC)

  9. #9
    Registriert seit
    19.06.2005
    Ort
    in Bayern ganz oben
    Beiträge
    1.360
    Danke
    188
    Erhielt 372 Danke für 290 Beiträge

    Standard

    Was ist P##DataRecv? Zeige doch bitte mal den ganzen Baustein.

    Gruss Daniel
    Erfahrung ist eine nützliche Sache. Leider macht man sie immer erst kurz nachdem man sie brauchte...

    OSCAT.lib Step 7

    Open Source Community for Automation Technolgy

    SPS-Forum Chat (Mibbit) | SPS-Forum Chat (MIRC)

  10. #10
    Registriert seit
    20.11.2006
    Ort
    Hamburg
    Beiträge
    225
    Danke
    35
    Erhielt 35 Danke für 32 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Anaconda55 Beitrag anzeigen
    So hab ich das ja auch? Bei mir funktioniert das so nicht!
    Ich verwende das für AG_RECV und da stürzt mir immer die Verbindung ab, weil der CP nicht auf den Bereich schreiben kann...


    Das hier muss doch die Zuordnung sein? Adresse + Offset, dieser ist 0 am Anfang. Er addiert also zum Pointer Adresse 0.
    Oder geht das so mit dem Pointer nicht? Wie erhalte ich die Adresse?

    L P##DataRecv;
    L #ReceiveCount;
    SLD 3; // in Pointerformat wandeln
    +D ;
    T D [AR1,P#6.0];
    Der Pointer P##DataRecv ist 3 Word lang. Du benötigst in diesem Fall aber die letzten beiden Wörter. Im ersten Wort steht die DB Adresse. In den beiden folgenden Wörtern der Speicherbereich und die Anfangsadresse.

    Funktioniert das, was ich dir geschrieben habe?

    Gruß

Ähnliche Themen

  1. Indradrive CS Kommutierungs-Offset
    Von Scorch89 im Forum Antriebstechnik
    Antworten: 1
    Letzter Beitrag: 10.06.2011, 16:53
  2. Array Offset
    Von forellengarten im Forum CODESYS und IEC61131
    Antworten: 6
    Letzter Beitrag: 04.04.2011, 22:22
  3. Offset auf S7-Zeit für WinCCflexible (MP377)????
    Von Inbetriebnehmer im Forum HMI
    Antworten: 3
    Letzter Beitrag: 02.02.2011, 19:26
  4. Antworten: 6
    Letzter Beitrag: 11.03.2010, 07:50
  5. Pointer und Offset
    Von SPSTorsten im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 14.01.2009, 21:42

Lesezeichen

Berechtigungen

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