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

Ergebnis 1 bis 7 von 7

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

  1. #1
    Registriert seit
    09.03.2006
    Beiträge
    137
    Danke
    19
    Erhielt 4 Danke für 4 Beiträge

    Standard


    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
    Zitieren Zitieren Einzelne Bits in zusammenhängenden Worten rück-/setzten  

  2. #2
    Registriert seit
    08.08.2007
    Ort
    Dresden
    Beiträge
    9.648
    Danke
    1.059
    Erhielt 2.046 Danke für 1.627 Beiträge

    Standard

    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
    Registriert seit
    22.09.2006
    Ort
    Bodenseeraum
    Beiträge
    1.022
    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
    Zitieren Zitieren Bits bearbeiten..  

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

    HarryH (29.01.2009)

  6. #4
    Registriert seit
    08.08.2007
    Ort
    Dresden
    Beiträge
    9.648
    Danke
    1.059
    Erhielt 2.046 Danke für 1.627 Beiträge

    Standard

    Zitat Zitat von vladi Beitrag anzeigen
    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
    Avatar von HarryH
    HarryH ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    09.03.2006
    Beiträge
    137
    Danke
    19
    Erhielt 4 Danke für 4 Beiträge

    Standard

    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
    Registriert seit
    23.02.2007
    Ort
    Hamburg
    Beiträge
    695
    Danke
    198
    Erhielt 84 Danke für 74 Beiträge

    Frage

    Zitat Zitat von vierlagig Beitrag anzeigen
    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
    Geändert von eYe (30.01.2009 um 08:18 Uhr) Grund: 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
    Registriert seit
    08.08.2007
    Ort
    Dresden
    Beiträge
    9.648
    Danke
    1.059
    Erhielt 2.046 Danke für 1.627 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von eYe Beitrag anzeigen
    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.
    Geändert von vierlagig (29.01.2009 um 23:04 Uhr)
    [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)

Ähnliche Themen

  1. Zugriff auf einzelne bits eines Realwerts
    Von Züttu im Forum Simatic
    Antworten: 9
    Letzter Beitrag: 12.01.2011, 08:22
  2. MW in MB wandeln bezw einzelne bits holen
    Von grünschnabel im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 12.07.2010, 07:34
  3. LinNoDave und einzelne Bits
    Von Lazarus™ im Forum Hochsprachen - OPC
    Antworten: 4
    Letzter Beitrag: 19.01.2009, 13:46
  4. Einzelne Bits ausmaskieren
    Von zwerg77 im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 03.12.2007, 07:14
  5. WinCC 5.1 C-Script einzelne bits abfragen
    Von tarzanhb im Forum HMI
    Antworten: 2
    Letzter Beitrag: 24.10.2006, 10:00

Lesezeichen

Berechtigungen

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