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

HarryH

Level-1
Beiträge
142
Reaktionspunkte
4
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
 
mit einer schleife und einem pointer :ROFLMAO:

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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bits bearbeiten..

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.
 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
mit einer schleife und einem pointer :ROFLMAO:

Code:
*
      L     0
      LAR1  - [B]Adressregister mit 0 initialisieren[/B]
      AUF   DB   106 - [B]DB106 öffnen[/B]
      L     143 - [B]Anzahl der Schleifendurchgänge[/B]
next: T     MW    20 - [B]Zwischenspeicher?[/B]
      SET - [B]VKE=1[/B]  
      S     DBX [AR1,P#1.3] - [B]AR1=0 + P#1.3 = Setze Bit 1.3 (erster Durchgang) [/B]
      R     DBX [AR1,P#1.2]  
      +AR1  P#2.0 - [B]Adressregister um 2 Byte erhöhen[/B]
      L     MW    20 - [B]???[/B]
      LOOP  next - [B]Springe zum Schleifenanfang[/B]

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
 
Zuletzt bearbeitet:
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.
 
Zuletzt bearbeitet:
Zurück
Oben