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

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 13

Thema: Pointer auf Bits im Datenbaustein

  1. #1
    Registriert seit
    19.06.2012
    Beiträge
    3
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Guten Morgen zusammen!

    Ich möchte gerne mit einer Schleife bestimmte Bits in einem Datenbaustein abfragen. Leider ist mir das trotz der vielfachen Beiträge über Pointer nicht gelungen. Den Pointer auf ein ganzes Wort zu richten ist mir mit http://www.sps-forum.de/showthread.p...iger-FIFO-LIFO gelungen. Mein Datenbaustein besteht übrigens aus zwei Ints.

    Wie muss dann der Zeiger aussehen.

    Gruß Timo
    Zitieren Zitieren Pointer auf Bits im Datenbaustein  

  2. #2
    Registriert seit
    30.10.2009
    Ort
    10 km vom Herzen der Natur
    Beiträge
    1.626
    Danke
    120
    Erhielt 340 Danke für 255 Beiträge

    Standard

    Wenn Du in einer Schleife abfragen möchtest, dann darfst Du keine Schiebeoperation ausführen, sondern musst Deinen Pointer direkt im Format P#Byteadresse.Bitadresse angeben.
    Gruß
    Michael

  3. #3
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.222
    Danke
    533
    Erhielt 2.698 Danke für 1.950 Beiträge

    Beitrag

    Das geht folgendermaßen:

    Code:
          L     P#0.0
          L     #Adr     //als Input INT
          SLD   3
          +D    
          L     #Bit_Nr  //als Input INT
          +D    
          T     #pointer_1   //als Temp DWord
    
          L     #DB_Nr    //als Input INT
          T     #DB_Nr_temp //als Temp Word
          AUF   DB [#DB_Nr_temp]
    
          U     DBX [#pointer_1]
          =     #Bitwert  //als Output Bool
    Wenn du das in einer Schleife abfragen willst, mußt du mit Bit-Nr 0 den Pointer erstellen, also

    L P#0.0
    L #Adr
    SPD 3
    +D
    T #pointer_1

    und dann in der Schleife je Bit pointer_1 um 1 erhöhen.

    Also einfach in der Schleife

    L #pointer_1
    L 1
    +D
    T Pointer_1

    und dann die indirekte Abfrage wie oben.

    Der Pointer enthält im Prinzip immer die direkte Adresse des Bits.
    Will man auf Word oder Dword zugreifen, muß man im Pointer immer die Adresse für Bit 0 stehen haben. Siemens nennt das die Byte- bzw. Wortgrenze.
    Geändert von Ralle (22.06.2012 um 08:14 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

  4. #4
    Registriert seit
    27.12.2009
    Beiträge
    93
    Danke
    4
    Erhielt 20 Danke für 18 Beiträge

    Standard

    Hallo,

    versuchs mal hiermit:
    Code:
          NOP   0                           //Im DB10 ab dbx2.0 suchen
    
          L     P#DBX 2.0
          LAR1  
          AUF   DB    10
    
          L     8                           //Abfrage 8 Bits 
    Loop: T     #Schleife
          SET   
          U      [AR1,P#0.0]                //Abfrage Bit auf TRUE
          SPB   Gef
    
          L     P#0.1                       //Adressregister + 1Bit increment
          +AR1  
    
          L     #Schleife
          LOOP  Loop
    
          SPA   NGef
    
    //Gefunden
    Gef:  L     8
          L     #Schleife
          -I    
          T     #BitNr                      //Bit 0 wird mitgezählt
          BEA   
    
    //Nicht gefunden
    NGef: NOP   0
          BEA
    Gruß
    S7_Programmer

  5. #5
    Registriert seit
    02.02.2012
    Ort
    Kaarst
    Beiträge
    126
    Danke
    10
    Erhielt 7 Danke für 7 Beiträge

    Standard

    Was macht ihr das alle so kompliziert?


    @Omit78
    Das geht einfach mit ein paar zeilen.

    Code:
    // Schleife erstellen
    L #Schleife //Schleife als DWORD im Stat/Merkerbereich ablegen
    L 31 //Maximalwert da du nur 2 INT im DB hast = 0-31Bits
    ==D
    SPBN N1S1 // Wenn kleiner als 31 Zähler erhöhen
    L 0 // ansonsten Zähler zurücksetzen
    SPA N1S2
    TAK // den Wert der Schleife wieder aus AKKU2 in AKKU1 holen
    L 1 // Schrittweite laden
    +D // auf die Schleife addieren
    N1S2: T #Schleife // und den Zähler wegschreiben
    
    
    // Zeiger erstellen
    L #Schleife // Schleifenzähler laden
    L P#0.1 // Konstate für BIT-Zeiger laden
    *D // In BIT-Zeiger wandeln
    T #Zeiger // und abspeichern (als TEMP-Variable anlegen reicht hier aus!)
    AUF DB[schlagmichtot] // Datenbaustein in dem du abfragen willst öffnen
    U P#[#Zeiger] // Und das Bitchen abfragen was du willst
    = [hier Aktion einfügen] // Hier kannst du dann das Bit wegschreiben wohin auch immer du willst!
    Hoffe das ist soweit verständlich!
    Geändert von martin1988 (22.06.2012 um 10:53 Uhr)

  6. #6
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.222
    Danke
    533
    Erhielt 2.698 Danke für 1.950 Beiträge

    Standard

    Zitat Zitat von martin1988 Beitrag anzeigen
    Was macht ihr das alle so kompliziert?
    Braucht doch alles kein Arsch!

    @Omit78
    Das geht einfach mit ein paar zeilen.

    Code:
    // Schleife erstellen
    L #Schleife //Schleife als DWORD im Stat/Merkerbereich ablegen
    L 31 //Maximalwert da du nur 2 INT im DB hast = 0-31Bits
    ==D
    SPBN N1S1 // Wenn kleiner als 31 Zähler erhöhen
    L 0 // ansonsten Zähler zurücksetzen
    SPA N1S2
    TAK // den Wert der Schleife wieder aus AKKU2 in AKKU1 holen
    L 1 // Schrittweite laden
    +D // auf die Schleife addieren
    N1S2: T #Schleife // und den Zähler wegschreiben
    
    
    // Zeiger erstellen
    L #Schleife // Schleifenzähler laden
    L P#0.0 // Konstate für BIT-Zeiger laden
    *D // In BIT-Zeiger wandeln
    T #Zeiger // und abspeichern (als TEMP-Variable anlegen reicht hier aus!)
    AUF DB[schlagmichtot] // Datenbaustein in dem du abfragen willst öffnen
    U P#[#Zeiger] // Und das Bitchen abfragen was du willst
    = [hier Aktion einfügen] // Hier kannst du dann das Bit wegschreiben wohin auch immer du willst!
    Hoffe das ist soweit verständlich!
    Was genau braucht kein A...?
    Ich kann in deinem Code keine höherfliegende Genialität erkennen.

    Oh ich sehe, den Befehl U P#[#Zeiger] kenne ich gar nicht.
    Ups..., mein Step7 kennt den auch nicht, womit programmierst du, Geniestreich V10.0?
    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. #7
    Registriert seit
    02.02.2012
    Ort
    Kaarst
    Beiträge
    126
    Danke
    10
    Erhielt 7 Danke für 7 Beiträge

    Standard

    Zitat Zitat von Ralle Beitrag anzeigen
    Was genau braucht kein A...?
    Ich kann in deinem Code keine höherfliegende Genialität erkennen.

    Oh ich sehe, den Befehl U P#[#Zeiger] kenne ich gar nicht.
    Ups..., mein Step7 kennt den auch nicht, womit programmierst du, Geniestreich V10.0?
    Ich mein damit das ganze Adressregistergeschubse und SLD und was weiß ich nicht alles ... Find das einfach nur unnötig kompliziert.

    Und ja stimmt, die vorletzte Zeiler war fehlerhaft.

    Code:
    U DBX[#Zeiger] // Und das Bitchen abfragen was du willst 
    = [hier Aktion einfügen] // Hier kannst du dann das Bit wegschreiben wohin auch immer du willst!
    So sollte das ohne Probleme klappen.

  8. #8
    Registriert seit
    29.03.2004
    Beiträge
    5.735
    Danke
    143
    Erhielt 1.685 Danke für 1.225 Beiträge

    Standard

    Dafür dass in deinem Code so viele Fehler waren/sind (P#0.0 hast du ja nochmal schnell korrigiert), lehnst du dich aber ganz schön weit aus dem Fenster.

  9. #9
    Registriert seit
    30.10.2009
    Ort
    10 km vom Herzen der Natur
    Beiträge
    1.626
    Danke
    120
    Erhielt 340 Danke für 255 Beiträge

    Standard

    @Ralle
    Da hat Martin aber Recht. Es gibt keine Notwendigkeit, Bit und Byte in separate Schleifen zu legen. Einfach bis 31 hochzählen reicht.

    @Martin
    Mit unnötigem Code bist Du aber auch nicht sparsam:
    Code:
    L #Schleife // Schleifenzähler laden
    L P#0.1 // Konstate für BIT-Zeiger laden
    *D // In BIT-Zeiger wandeln
    Gruß
    Michael

  10. #10
    Registriert seit
    02.02.2012
    Ort
    Kaarst
    Beiträge
    126
    Danke
    10
    Erhielt 7 Danke für 7 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Tut mir leid wenn ich da ein wenig forsch war und auch gerne zwischen durch bin aber ich reagier auf dieses ganze, in meinen augen, any-pointer-zusammen-gebastel-für-jeden-scheiss den ich hier zwischendurch lese allergisch weil ich halt auch so ein Programm hier zu pflegen habe wo sich der Programmierer es meinte sich "einfach" machen zu wollen und alles über pointer über 185123 stellen durchs programmkopiert nur damit nach 30min suche irgendwo ein "=a0.0" steht ...

    Bitte lasst das unter jugendlichem leichtsinn durchgehen.

    Und nen 2. Fehler hab ich noch gefunden, so sollte es nun komplett richtig sein und funktionieren:
    Code:
    // Schleife erstellen 
    L #Schleife //Schleife als DWORD im Stat/Merkerbereich ablegen
    L 31 //Maximalwert da du nur 2 INT im DB hast = 0-31Bits 
    ==D 
    SPBN N1S1 // Wenn kleiner als 31 Zähler erhöhen 
    L 0 // ansonsten Zähler zurücksetzen 
    SPA N1S2 
    N1S1: TAK // den Wert der Schleife wieder aus AKKU2 in AKKU1 holen 
    L 1 // Schrittweite laden 
    +D // auf die Schleife addieren 
    N1S2: T #Schleife // und den Zähler wegschreiben   
    
    // Zeiger erstellen 
    L #Schleife // Schleifenzähler laden 
    L P#0.1 // Konstate für BIT-Zeiger laden 
    *D // In BIT-Zeiger wandeln 
    T #Zeiger // und abspeichern (als TEMP-Variable anlegen reicht hier aus!) 
    AUF DB[schlagmichtot] // Datenbaustein in dem du abfragen willst öffnen 
    U DBX[#Zeiger] // Und das Bitchen abfragen was du willst 
    = [hier Aktion einfügen] // Hier kannst du dann das Bit wegschreiben wohin auch immer du willst!
    Wenn ich sonst noch fehler übersehen habe könnt ihr mich gerne korrigieren, ist ja niemand unfehlbar.

    @M-Ott
    Was meinst du an der stelle mit unnötigem code?
    Bräuchte ich die Zeilen nicht? O_o

Ähnliche Themen

  1. Bits bei Betriebsartumschaltung auf 0 setzen
    Von Servernexus im Forum HMI
    Antworten: 5
    Letzter Beitrag: 20.01.2012, 09:01
  2. Zugriff auf Bits aus MW
    Von Holzbein im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 02.02.2011, 14:21
  3. S7 LAR P##... --- pointer auf pointer
    Von milmu im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 22.11.2010, 17:39
  4. Antworten: 5
    Letzter Beitrag: 02.07.2007, 23:07
  5. S7 200 Bits im Datenbaustein? Gibts nicht?
    Von plc_tippser im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 20.09.2004, 21:23

Lesezeichen

Berechtigungen

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