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

Results 1 to 7 of 7

Thread: Einzelne Bits in zusammenhängenden Worten rück-/setzten

  1. #1
    Join Date
    09.03.2006
    Posts
    137
    Danke
    19
    Erhielt 4 Danke für 4 Beiträge

    Default


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo zusammen,

    Ich möchte folgendes mit einer S7-300 erledigen:

    Ich habe ein DB106 mit 143Worten. In diesem DB möchte ich bei einem Reset in jedem dieser Worte ein Bit setzten und ein weiteres Bit rücksetzen. Es sind bezogen auf das Wort immer die gleichen Bits. Alle anderen Bit sollen nicht verändert werden und können beliebige Zustände annehmen. Bisher habe ich das so gelöst (es ergibt eine ellenlange Liste und ist irgendwie unschön):

    Code:
          U     #Reset
          SPBN  M001
    
          SET   
          S     DB106.DBX    1.3
          R     DB106.DBX    1.2
    
          S     DB106.DBX    3.3
          R     DB106.DBX    3.2
    
          S     DB106.DBX    5.3
          R     DB106.DBX    5.2
         
          ... --> usw.
    
          S     DB106.DBX  285.3
          R     DB106.DBX  285.2
      
          S     DB106.DBX  287.3
          R     DB106.DBX  287.2
    
    M001: NOP 0
    Frage: Kann man das irgendwie eleganter lösen? Z.B. in einer Schleife, mit Pointer, etc. Bin für jede Anregung dankbar!

    Gruß HarryH
    Reply With Quote Reply With Quote Einzelne Bits in zusammenhängenden Worten rück-/setzten  

  2. #2
    Join Date
    08.08.2007
    Location
    Dresden
    Posts
    9,882
    Danke
    1,064
    Erhielt 2,056 Danke für 1,632 Beiträge

    Default

    mit einer schleife und einem pointer

    Code:
    *
          L     0
          LAR1  
          AUF   DB   106
          L     143
    next: T     MW    20
          SET   
          S     DBX [AR1,P#1.3]
          R     DBX [AR1,P#1.2]
          +AR1  P#2.0
          L     MW    20
          LOOP  next
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

  3. Folgender Benutzer sagt Danke zu vierlagig für den nützlichen Beitrag:

    HarryH (29.01.2009)

  4. #3
    Join Date
    22.09.2006
    Location
    Bodenseeraum
    Posts
    1,024
    Danke
    61
    Erhielt 136 Danke für 122 Beiträge

    Beitrag

    Hi,
    klar, die Lösung von 4L, oder alternativ auch mittels OW, UW:

    Code:
          L     MW    20
          OW    W#16#0010
          T     MW    20 // damit setzt man das fünfte Bit in MW20 auf 1, Rest unverändert
    
    
          L     MW    20
          UW    W#16#FFEF
          T     MW    20  // damit setzt man das fünfte Bit auf 0, Rest unverändert
    das Ganze dann in einer Schleife mit Pointeradr. verpackt.

    Gruss: V.
    ______________________________________
    relax, take it easy
    Reply With Quote Reply With Quote Bits bearbeiten..  

  5. Folgender Benutzer sagt Danke zu vladi für den nützlichen Beitrag:

    HarryH (29.01.2009)

  6. #4
    Join Date
    08.08.2007
    Location
    Dresden
    Posts
    9,882
    Danke
    1,064
    Erhielt 2,056 Danke für 1,632 Beiträge

    Default

    Quote Originally Posted by vladi View Post
    Hi,
    klar, die Lösung von 4L, oder alternativ auch mittels OW, UW
    da er jeweils setzen und rücksetzen will ... also man einmal UW und einmal OW braucht, ist diese lösung nicht zykluszeitoptimal ...aber trotzdem schön!
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

  7. #5
    HarryH's Avatar
    HarryH is offline Erfahrener Benutzer
    Themenstarter
    Join Date
    09.03.2006
    Posts
    137
    Danke
    19
    Erhielt 4 Danke für 4 Beiträge

    Default

    Danke vierlagig und vladi für die schnellen Lösungen!

    Habe es wie vierlagig realisiert, da es für wenig schleifen-/ und pointererfahrenen Programmierern (wie mir) leichter zu verstehen ist. Muss es nur noch testen.

    Gruß HarryH

  8. #6
    Join Date
    23.02.2007
    Location
    Hamburg
    Posts
    759
    Danke
    198
    Erhielt 84 Danke für 74 Beiträge

    Frage

    Quote Originally Posted by vierlagig View Post
    mit einer schleife und einem pointer

    Code:
    *
          L     0
          LAR1  - Adressregister mit 0 initialisieren
          AUF   DB   106 - DB106 öffnen
          L     143 - Anzahl der Schleifendurchgänge
    next: T     MW    20 - Zwischenspeicher?
          SET - VKE=1  
          S     DBX [AR1,P#1.3] - AR1=0 + P#1.3 = Setze Bit 1.3 (erster Durchgang) 
          R     DBX [AR1,P#1.2]  
          +AR1  P#2.0 - Adressregister um 2 Byte erhöhen
          L     MW    20 - ???
          LOOP  next - Springe zum Schleifenanfang
    Ich war mal so frei und habe mit meinem Halbwissen Kommentare geadded und habe nun noch ein paar Fragen dazu
    Ist mal das erste Beispiel wo ich annähernd verstehe was man sinnvolles mit Pointern anstellt und das würde ich nun gerne ganz verinnerlichen^^

    1) Ist das noch AWL code?
    2) Wird das MW hinter "next:" automatisch dekrementiert?
    3) Wozu ist das "L MW 20" am Ende gut, ist es vielleicht so dass die folgende LOOP Anweisung nur ausgeführt wird solange MW 20 ungleich Null ist?
    4) Kann ich das gleiche auch mit kompletten MBs, MWs, MDs machen?

    Thx, eYe
    Last edited by eYe; 30.01.2009 at 08:18. Reason: LAR1 Kommentar war Müll ;)
    Siemens: Step7, WinCC Flexible, Logo
    Schneider: PL7, Unity Pro, Vijeo Look, Vijeo Designer, XBTL1000, Premium, M340, Twido, Zelio
    Moeller: Galileo, EASY
    B&R: Automation Studio 3.0

  9. #7
    Join Date
    08.08.2007
    Location
    Dresden
    Posts
    9,882
    Danke
    1,064
    Erhielt 2,056 Danke für 1,632 Beiträge

    Default


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Quote Originally Posted by eYe View Post
    Ich war mal so frei und habe mit meinem Halbwissen Kommentare geadded
    das AR1 wird nicht mit eins, sondern mit 0 beladen ... 0tes byte, 0tes bit

    1) Ist das noch AWL code?
    jopp und alles global

    2) Wird das MW hinter "next:" automatisch dekrementiert?
    nein, LOOP dekrementiert (siehe 3.)
    3) Wozu ist das "L MW 20" am Ende gut, ist es vielleicht so dass die folgende LOOP Anweisung nur ausgeführt wird solange MW 20 ungleich Null ist?
    LOOP dekremtiert den wert von AKKU1 und springt bei >0 zur angegebenen sprungmarke.
    4) Kann ich das gleiche auch mit kompletten MBs, MWs, MDs machen?
    du meinst ohne indirekte adressierung? klar! auch mit indirekter auf merker und E/As (letzteres gibt backpfeifen)

    nochmal zum schleifenkonstrukt: es ist eine fußgesteuerte while-schleife. oben laden wir die anzahl der durchläufe, die wir unten (LOOP) dekrementieren. ist unser schleifenzähler =0 verlassen wir die schleife.
    Last edited by vierlagig; 29.01.2009 at 23:04.
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

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

    eYe (30.01.2009)

Similar Threads

  1. Einzelne Bits löschen
    By otti121 in forum CODESYS und IEC61131
    Replies: 2
    Last Post: 15.03.2016, 23:21
  2. Step 7 Einzelne Bits negieren
    By bbse30 in forum Simatic
    Replies: 11
    Last Post: 22.04.2015, 11:56
  3. Einzelne Bits in eine Zahl umwandeln
    By GBat in forum Simatic
    Replies: 12
    Last Post: 01.05.2013, 13:20
  4. LinNoDave und einzelne Bits
    By Lazarus™ in forum Hochsprachen - OPC
    Replies: 4
    Last Post: 19.01.2009, 13:46
  5. Einzelne Bits ausmaskieren
    By zwerg77 in forum Simatic
    Replies: 1
    Last Post: 03.12.2007, 07:14

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •