mit any pointer ein bit schreiben

Limette

Level-2
Beiträge
282
Reaktionspunkte
3
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich würde gern Bit 10.3 auf TRUE setzen. Funktioniert aber nicht so wie gedacht. Habt ihr mir Rat ?

Any Pointer
Code:
      LAR1  P##any_bit         // load pointer on target
 
      L     B#16#10
      T     B [AR1,P#0.0]               //  Syntax-ID
 
      L     B#16#1
      T     B [AR1,P#1.0]               //  Data Type ( 1 = BOOL)
 
      L     1
      T     W [AR1,P#2.0]               //  Repeat Factor(Count)
 
      L     #DBNummer
      T     W [AR1,P#4.0]               / DB number
 
      L     10
      SLD   3
      L     3
      +D    
      T     D [AR1,P#6.0]               // write Offset (HIER 10.3)
 
      L     B#16#84                     //Speicherbereich (hier DB)
      T     LB [AR1,P#6.0]

blkmov ( one(byte) = 1 )



Code:
U(    
      L     1
      T     #one
      SET   
      SAVE  
      CLR   
      U     BIE
      )     
      SPBNB _003
      CALL  "BLKMOV"
       SRCBLK :=#one
       RET_VAL:=#_ret_val
       DSTBLK :=#any_bit
_003: NOP   0
 
Auszug aus S7 Hilfe zum SFC20:

Ist der ANY-Pointer (Quelle oder Ziel) vom Typ BOOL, so muß die angegebene Länge durch 8 teilbar sein, da sonst der Kopiervorgang nicht ausgeführt wird.
 
Ja, aber der SFC20 ist damit gemeint.

Mögliche Alternative:
Vielleicht solltest du mit dem ANY-Pointer das Byte/Wort adressieren, das dein Bit enthält.
Dann mit SFC20 holen (kopieren) und gezielt dein Bit schreiben.
Anschliessend schreibst du das Byte/Wort mit dem ANY-Pointer wieder an seinen Ursprungsort zurück.
 
tut mir leid, verstehe ich im moment nicht. vllt sollte ich dazu sagen dass ich grundsätzlich schon flexibel sein will, also nicht nur fest 10.3 sonder auch andere bits zu schreiben.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
der ANY adressiert auch Bits, aber der SFC20 überträgt Wort/Byte oder auch Bools (deren Anzahl aber durch 8 teilbar sein muss )
wenn du nur 1 Bool-Variable mittels SFC 20 schreiben willst, musst du also mind. 8 bools (=1 Byte) als Länge angeben.
damit beschreibst du aber auch die anderen 7 Bits in dem betreffenden Byte
also holst du dir die gesamten 8 Bits (1 Byte), änderst nur das eine (10.3)
dann schreibst du alle 8 Bits ( = 1 Byte, davon 7 ungeänderte und 1 geändertes Bit) wieder zurück
 
Oder du freundest dich mit folgendem Konstrukt an:

LAR1 p#A 10.0 //Pointer auf A 10.0
S [AR1,P#0.3] //dein Bit A 10.3 zuweisen (10.0 + Offset 0.3)

dann brauchst du auch keinen SFC20 ;)
 
der ANY adressiert auch Bits, aber der SFC20 überträgt Wort/Byte oder auch Bools (deren Anzahl aber durch 8 teilbar sein muss )
wenn du nur 1 Bool-Variable mittels SFC 20 schreiben willst, musst du also mind. 8 bools (=1 Byte) als Länge angeben.
damit beschreibst du aber auch die anderen 7 Bits in dem betreffenden Byte
also holst du dir die gesamten 8 Bits (1 Byte), änderst nur das eine (10.3)
dann schreibst du alle 8 Bits ( = 1 Byte, davon 7 ungeänderte und 1 geändertes Bit) wieder zurück

vllt liegt es am fussballspiel welches nebenher läuft. aber ich verstehs leider nicht wirklich. das mit den "zurückholen" und nur eines ändern. wie soll ich denn nur eines ändern können, wenn ich immer 8 schreiben muss.:confused:
 
mit den Funktionen UW, OW oder XOR kannst du gezielt einzelne Bits verändern. Gib den Befehl mal im S7-Editor ein und die Taste <F1> wird dir weiterhelfen !
 
Zuviel Werbung?
-> Hier kostenlos registrieren
unflexibel?
das ist nur die "Grundfunktion", du kannst doch dein Adressregister AR1 genauso flexibel zusammenbauen, wie du es brauchst.
Hast du doch schon ganz oben mit deinem ANY bereits getan :confused:
 
Ja, so ok.

habe mal deine Beiträge der letzten 12 Monate quergelesen, mit den AR´s und Pointern hast du dich noch nicht so richtig angefreundet, oder ?
 
Limette hat doch eigentlich schon alles, um das entsprechende Bit zu schreiben,
ohne den SFC 20 zu benötigen:
Code:
AUF DB [#DB_Nummer]

L #Byte_Nummer
SLD 3
L #Bit_Nummer
+D
LAR1

U Bedingung
= DBX [AR1,P#0.0]

flexibler geht's doch kaum. Und kürzer ist es auch noch.

Grüße
Gebs
 
Zuletzt bearbeitet:
Zurück
Oben