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

Ergebnis 1 bis 9 von 9

Thema: Pointer und Co

  1. #1
    Registriert seit
    19.12.2006
    Beiträge
    185
    Danke
    25
    Erhielt 26 Danke für 21 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo zusammen!

    Ich habe mich heute daran gewagt doch einmal mit Pointern zu arbeiten.

    Folgender Ansatz: Ich möchte an meinem Baustein Eine Startadresse angeben z.B. M50.0 zusätzlich möchte ich die Länge des Auswertebereiches (Bytes) als Int angeben.
    Der Baustein soll mir nun nach seinem Aufruf die Anzahl der Bits mit Status "1" ausgeben.

    Irgendwie verzweifel ich da gerade seit ein paar Stunden


    Hier der Code:

    Code:
    //Initialisieren
    
          L     0
          T     #outy                       //Ausgangs Int
          T     #schleifenindex_2           //Schleifenindex Bit
    
          L     #start                      //Startbyte laden
          T     #schleifenindex_1           //in Schleifenindex Byte Schleife 
    
    //Startbyte + Länge
          L     #start
          L     #anzahl_bytes
          +I    
          T     #bytes
    
          L     #bytes
          INC   1
          T     #bytes
    
    
    
    
    //Hauptschleife  (nxt1)
    nxt1: NOP   0
    
    //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    
    
    //Bit-Schleife
    nxt2: NOP   0
    
          L     #schleifenindex_1           //Byte 0...schleifenindex_1
          SLD   3
          LAR1                              // im ar1 steht p#0.0
          L     #schleifenindex_2           //Schleifenindex 
          +AR1                              // der Schleifenindex wird zum ar1 hinzuaddiert. im ar1 steht jetzt p#0.x
    //Auswertung Bit
          U     E [AR1,P#0.0]               // fragt ex.x ab
          SPBN  ddd
    
          L     #outy
          INC   1
          T     #outy
    
    
    ddd:  NOP   0
          L     #schleifenindex_2           // Schleifenindex hochzählen
          INC   1
          T     #schleifenindex_2
    
    
    //Bit-Schleife verlassen ?
    
          L     #schleifenindex_2
          L     8
          >=I   
          SPB   out2
    
          LOOP  nxt2
    
    out2: NOP   0
    
          L     0
          T     #schleifenindex_2
    
    //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    
          L     #schleifenindex_1           // Schleifenindex hochzählen
          INC   1
          T     #schleifenindex_1
    
    //Byte-Schleife verlassen ?
          L     #schleifenindex_1           //Byteanzahl erreicht ?
          L     #bytes                      //#bytes
          >=I   
          SPB   out1
    
    
    
          LOOP  nxt1
    
    out1: NOP   0
    Sieht noch wild aus, ich weiß.

    Mit der Zeile:

    Code:
    //Auswertung Bit
          U     E [AR1,P#0.0]               // fragt ex.x ab
    frage ich ja jetzt die Eingangsbits ab. Ich gebe jetzt von aussen am Baustein ein Int als Startbyte und ein Int als Länge an.

    Kann mir bitte jeman auf die Sprünge helfen wie ich Als Startadresse z.B. M0.0 + Länge in Bytes angeben kann?

    Danke
    mkd
    Zitieren Zitieren Pointer und Co  

  2. #2
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.220
    Danke
    533
    Erhielt 2.696 Danke für 1.948 Beiträge

    Standard

    Code:
    U     M [AR1,P#0.0]               // fragt Mx.x ab
    oder was meinst du?
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  3. #3
    mkd ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    19.12.2006
    Beiträge
    185
    Danke
    25
    Erhielt 26 Danke für 21 Beiträge

    Standard

    Ist schon klar

    Ich möchte das von aussen am Baustein vorgeben.

    Also z.B. M40.0 oder DB50.DBW10 oder E0.0 ...

  4. #4
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.220
    Danke
    533
    Erhielt 2.696 Danke für 1.948 Beiträge

    Standard

    Hier noch was zum Vergleichen, Ähnliches hatten wir schon einmal, als zusätzliche Anregung für dich:

    http://www.sps-forum.de/showthread.p...ht=Anzahl+Bits
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  5. #5
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.220
    Danke
    533
    Erhielt 2.696 Danke für 1.948 Beiträge

    Standard

    Du könntest einen Any-Pointer oder Pointer außen vorgeben (der hat die Längeninformation gleich mit drin) und diesen dann im FC in seine Bestandteile zerlegen.

    Sieh dir mal das dazu an: http://www.sps-forum.de/showthread.p...=Input+Pointer
    Geändert von Ralle (28.07.2008 um 15:22 Uhr)
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  6. #6
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.220
    Danke
    533
    Erhielt 2.696 Danke für 1.948 Beiträge

    Standard

    Eine ganz einfache Variante mit einem Pointer:

    Variable Testinput als Pointer an IN des FC 200 definieren

    Im FC200:
    Code:
    L P##Testinput
    LAR1
    
    L W [AR1, P#4.0]
    SRW 3
    T MW100
    Aufruf:

    Call FC200
    Testinput:=P#M80.0

    In MW 100 steht dann eine 80

    PS: Aufbau Pointer: http://www.sps-forum.de/showpost.php...48&postcount=3
    Geändert von Ralle (28.07.2008 um 15:53 Uhr)
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  7. Folgender Benutzer sagt Danke zu Ralle für den nützlichen Beitrag:

    mkd (28.07.2008)

  8. #7
    mkd ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    19.12.2006
    Beiträge
    185
    Danke
    25
    Erhielt 26 Danke für 21 Beiträge

    Standard

    Danke Ralle, das hat mir sehr weiter geholfen!

    Dann werde ich mir morgen weiter den Kopf zerbrechen.

    mkd

  9. #8
    Registriert seit
    30.03.2005
    Beiträge
    2.096
    Danke
    0
    Erhielt 673 Danke für 541 Beiträge

    Standard

    Hier ist mal ein kurzes Programmbeispiel mit einem ANY-Pointer als IN-Parameter an einer Funktion:

    Code:
    ORGANIZATION_BLOCK OB 1
    TITLE =Hauptprogramm
    //16
    AUTHOR : KAI
    FAMILY : SPSFORUM
    NAME : BITS
    VERSION : 1.0
     
    VAR_TEMP
      OB1_EV_CLASS : BYTE ; //Bits 0-3 = 1 (Coming event), Bits 4-7 = 1 (Event class 1)
      OB1_SCAN_1 : BYTE ; //1 (Cold restart scan 1 of OB 1), 3 (Scan 2-n of OB 1)
      OB1_PRIORITY : BYTE ; //Priority of OB Execution
      OB1_OB_NUMBR : BYTE ; //1 (Organization block 1, OB1)
      OB1_RESERVED_1 : BYTE ; //Reserved for system
      OB1_RESERVED_2 : BYTE ; //Reserved for system
      OB1_PREV_CYCLE : INT ; //Cycle time of previous OB1 scan (milliseconds)
      OB1_MIN_CYCLE : INT ; //Minimum cycle time of OB1 (milliseconds)
      OB1_MAX_CYCLE : INT ; //Maximum cycle time of OB1 (milliseconds)
      OB1_DATE_TIME : DATE_AND_TIME ; //Date and time OB1 started
    END_VAR
    BEGIN
    NETWORK
    TITLE =Bits zählen
     
          CALL FC   100 (
               STARTADRESSE             := P#M 200.0 BYTE 6,
               ANZAHL_BITS              := MW   220);
          NOP   0; 
     
    NETWORK
    TITLE =Bits zählen
     
          CALL FC   100 (
               STARTADRESSE             := P#DB200.DBX0.0 BYTE 6,
               ANZAHL_BITS              := MW   222);
          NOP   0; 
     
    END_ORGANIZATION_BLOCK
    Code:
    FUNCTION FC 100 : VOID
    TITLE =Bits (TRUE) zählen
    AUTHOR : KAI
    FAMILY : SPSFORUM
    NAME : BITS
    VERSION : 1.0
     
    VAR_INPUT
      STARTADRESSE : ANY ; 
    END_VAR
    VAR_OUTPUT
      ANZAHL_BITS : INT ; 
    END_VAR
    VAR_TEMP
      DB_REGISTER : WORD ; 
      AR1_REGISTER : DWORD ; 
      ANZAHL_BYTES : WORD ; 
      DB_NUMMER : WORD ; 
      BEREICHSZEIGER : DWORD ; 
      SCHLEIFE : INT ; 
      ZAEHLER_BITS : INT ; 
    END_VAR
    BEGIN
    NETWORK
    TITLE =Register sichern
     
          L     DBNO; // DB-Register
          T     #DB_REGISTER; 
     
          TAR1  #AR1_REGISTER; // AR1-Register
     
    NETWORK
    TITLE =Startadresse (ANY)
     
          L     P##STARTADRESSE; // Startadresse (ANY)
          LAR1  ; 
     
          L     W [AR1,P#2.0]; // Anzahl Bytes
          T     #ANZAHL_BYTES; 
     
          L     W [AR1,P#4.0]; // DB-Nummer
          T     #DB_NUMMER; 
     
          L     D [AR1,P#6.0]; // Bereichszeiger
          T     #BEREICHSZEIGER; 
     
    NETWORK
    TITLE =Bits (TRUE) zählen
     
          AUF   DB [#DB_NUMMER]; // DB-Nummer
     
          L     #BEREICHSZEIGER; // Bereichszeiger
          LAR1  ; 
     
          L     0; 
          T     #ZAEHLER_BITS; // Zähler Bits
     
          L     #ANZAHL_BYTES; // Anzahl Bytes
          L     8; 
          *I    ; 
    M01:  T     #SCHLEIFE; // Schleife
     
          U      [AR1,P#0.0]; // Bits (TRUE)
          SPBN  M02; 
     
          L     #ZAEHLER_BITS; // Zähler Bits
          L     1; 
          +I    ; 
          T     #ZAEHLER_BITS; // Zähler Bits
     
    M02:  L     P#0.1; // Bereichszeiger
          +AR1  ; 
     
          L     #SCHLEIFE; // Schleife
          LOOP  M01; 
     
          L     #ZAEHLER_BITS; // Zähler Bits
          T     #ANZAHL_BITS; // Anzahl Bits
     
    NETWORK
    TITLE =Register wiederherstellen
     
          AUF   DB [#DB_REGISTER]; // DB-Register
     
          LAR1  #AR1_REGISTER; // AR1-Register
     
    END_FUNCTION
    Gruß Kai
    Angehängte Grafiken Angehängte Grafiken
    • Dateityp: jpg VAT.jpg (283,6 KB, 25x aufgerufen)
    Angehängte Dateien Angehängte Dateien

  10. Folgender Benutzer sagt Danke zu Kai für den nützlichen Beitrag:

    mkd (31.07.2008)

  11. #9
    mkd ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    19.12.2006
    Beiträge
    185
    Danke
    25
    Erhielt 26 Danke für 21 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Kai,

    einen riesen Dank!
    Mit deinem Beispiel und der Siemens Hilfe (Suchbegriff: "Indirekte Adressierung") bin ich jetzt dahinter gestiegen.
    Bis jetzt bin ich immer ohne dieses Werkzeug ausgekommen.
    Dieses mal nicht. Ergebnis sollte ein Baustein sein, der die Anzahl der High oder Low Bits eines freien Bereiches ermittelt und eine Neu Meldung für ein neues High oder Low Bit ausgibt.
    Als zwischenspeicher nutze ich einen DB den ich per IN am Baustein angebe.

    Alles läuft, nach viel Kopfzerbrechen, rund und ich verstehe sogar was ich gemacht habe

    Gruß
    Daniel

Ähnliche Themen

  1. Pointer?!
    Von tuneit im Forum Simatic
    Antworten: 12
    Letzter Beitrag: 23.09.2008, 09:43
  2. SCL: Pointer
    Von dinner4one im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 06.07.2008, 18:07
  3. Pointer in SCL ?
    Von AndreK im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 27.04.2008, 21:24
  4. DB und Pointer
    Von PhilippL im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 12.09.2007, 07:02
  5. VKE und Pointer im FC...
    Von halorenzen im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 23.07.2004, 13:16

Lesezeichen

Berechtigungen

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