Bitzugriff auf Word im FB (Temp oder Stat Bereich)

mwissen

Level-1
Beiträge
111
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Abend,
wie kann ich auf ein einzelnes Bit einer Word-Variable zugreifen, wenn diese lokal im FB angelegt wurde.
Z.B. #Hilfsmerker -> Typ Word
Die Funktion #Hilfsmerker.5 funktioniert bei mir nicht.

Analog:
MW10
Zugriff über M10.5 unproblematisch.

Wäre für eine Lösung des Problems dankbar.
 
Mir ist es nicht klar.
Weil Siemens Mehrbyte-Variablen im Big-Endian im Speicher ablegt: zuerst das höherwertige Byte, danach das niederwertige Byte.
Beispiel: Liegt ein Word in LW0, dann liegen die höherwertigen Bits .8 bis .15 in LB0 und die niederwertigen Bits .0 bis .7 in LB1. Word.5 liegt also an Adresse L1.5

Harald
 
Hallo PN/DP,

wobei die Aussage des TE von #Hilfsmerker.5 und bei MW10 dann M10.5 verwirrend ist.

Guten Abend,
wie kann ich auf ein einzelnes Bit einer Word-Variable zugreifen, wenn diese lokal im FB angelegt wurde.
Z.B. #Hilfsmerker -> Typ Word
Die Funktion #Hilfsmerker.5 funktioniert bei mir nicht.

Analog:
MW10
Zugriff über M10.5 unproblematisch.

Wäre für eine Lösung des Problems dankbar.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Warum nicht einfach ausmaskieren:

Code:
L #Hilfsmerker
L W#16#8000 //Bitmaske für 1000 0000 0000 0000
UW
Hmm, dieser Hinweis auf das Standard-Vorgehen kam doch schon von Thomas_v2.1 gleich die erste Antwort im Beitrag #2.
Und wenn schon Beispiel-Code gezeigt wird, dann sollte er auch korrekt sein:
Code:
L  #Hilfsmerker
UW W#16#0020 //Bitmaske für 0000 0000 0010 0000 für #Hilfsmerker.5
U  <>0

Harald
 
Nicht nur verwirrend, sondern falsch. :cool:
Doch bei TE sind wir da mal nicht so pingelig, immerhin hat er eine klar verständliche Frage formuliert. ;)

Harald

Aber auf Grund dieser unterschiedlichen Aussagen kann ich verstehen, warum es Onkel Dagobert nicht ganz klar ist. Denn wo liegt der Fehler bei der Frage des TE:
- Word #Hilfsmerker und #Hilfsmerker.5 = Bit 5 im Wort (Pointer dann 1.5)
oder
- MW10 und M10.5 = Bit 13 im Wort (Pointer dann 0.5).

Er hat geschrieben, seine Abfrage mit M 10.5 hat das richtige Ergebnis gebracht. Welches Ergebnis wollte er nun? ;)
 
>> Genaues kann nur der TE mwissen sagen, vielleicht meldet er sich ja nochmal?
>> Ich wette, er wollte #Hilfsmerker.5, hat aber leider das Beispiel falsch formuliert.


Moin,

Leutz ihr seid einfach Spitze :ROFLMAO:.

Der Weg ist das Ziel, ich muß immer wieder
staunen, weiter so.

Tschö Peter
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich hätte gerade das selbe Problem...nur umgekehrt ^^

Ich schreibe einen FB für Diagnosemeldungen, wenn ein Zylinder zu lange fährt und der Endschalter nicht kommt z.B.

Ich habe einen "FBx" für die Zylinderabfrage geschrieben, welcher einen Bit-Ausgang (ERROR) hat.
Dieser FB wird für jeden Zylinder 1x in einem anderen FB aufgerufen wird.

Am Ende fasse ich alle Zylinder (und auch normale UND-Verknüpfungen (Motorschutz gefallen, etc.) zu einem WORD zusammen, um dann am WinCCflex eine Meldung auszugeben.


Meine Notlösung war momentan, dass ich ein temp Word "temp_WORD" mit Adresse 0 und ein Stat Word "ERROR_WORD" angelegt habe.

NW1: temp_WORD ablöschen

L 0
T #temp_WORD


NW2:
//Zyl1
CALL FBx
ERROR := L0.0

//Zyl2
CALL FBx
ERROR := L0.1

.
.
.

NW3: übertragen des temp_WORD in Static Bereich

L #temp_WORD
T #ERROR_WORD


Das hab soweit auch gut funktioniert, aber mir gefällt nicht, dass ich Lokale Bits verwende und dazwischen FBs Aufrufe, die mir die Werte überschreiben können.
(Ist bis jetzt noch nicht passiert)





Ist es eine saubere Lösung, wenn ich folgenden Code anwende:
(BZW Funktioniert er überhaupt, hab gerade keine Testumgebung hier...)


NW2:
//Zyl1
CALL FBx
ERROR := #temp_BIT

L P##ERROR_WORD
LAR1

U #temp_BIT
= [AR1,P#0.0]

//Zyl2
CALL FBx
ERROR := #temp_BIT

L P##ERROR_WORD
LAR1

U #temp_BIT
= [AR1,P#0.1]
.
.
.
.
 
Warum legst du deine Störmeldungen nicht in einem DB ab der alle Störmeldungen als Boolvariablen beeinhaltet ? Diesen DB kannst du dann mittels verschiedener Methoden nach gesetzten Bits durchgraben um einen Summenfehler-Auswertung zu machen.
 
mir gefällt nicht, dass ich Lokale Bits verwende und dazwischen FBs Aufrufe, die mir die Werte überschreiben können.
Du brauchst nicht damit rechnen, daß ein aufgerufener Baustein die eigenen TEMP-Lokaldaten überschreibt - damit rechnet kein Baustein. Der aufgerufene Baustein müsste absichtlich auf die Vorgänger-Lokaldaten zugreifen, das geht nur indirekt per Pointer.

Ich würde allerdings die Verwendung der TEMP-Bits symbolisch machen.

Variante (1) mit Bool-Array
Code:
[COLOR="#008000"]TEMP:[/COLOR]
temp_16Bools : ARRAY [0..15] OF BOOL;

[COLOR="#008000"]NW1: temp-Bits ablöschen[/COLOR]
LAR1 P##temp_16Bools
L 0
T LW [AR1,P#0.0]

[COLOR="#008000"]NW2:[/COLOR]
[COLOR="#008000"]//Zyl1[/COLOR]
CALL FBx
 ERROR := #temp_16Bools[0]

[COLOR="#008000"]//Zyl2[/COLOR]
CALL FBx
 ERROR := #temp_16Bools[1]

...

[COLOR="#008000"]NW3: übertragen der 16 temp-Bits in Static Bereich[/COLOR]
LAR1 P##temp_16Bools
L LW [AR1,P#0.0]
T #ERROR_WORD
Variante (2) mit Struktur mit "sprechenden" Bit-Namen
Code:
[COLOR="#008000"]TEMP:[/COLOR]
temp_Errors : STRUCT
  Err01 : BOOL;
  Err02 : BOOL;
  ...
  Err16 : BOOL;
END_STRUCT

[COLOR="#008000"]NW1: temp-Bits ablöschen[/COLOR]
LAR1 P##temp_Errors
L 0
T LW [AR1,P#0.0]

[COLOR="#008000"]NW2:[/COLOR]
[COLOR="#008000"]//Zyl1[/COLOR]
CALL FBx
 ERROR := #temp_Errors.Err01

[COLOR="#008000"]//Zyl2[/COLOR]
CALL FBx
 ERROR := #temp_Errors.Err02

...

[COLOR="#008000"]NW3: übertragen der 16 temp-Bits in Static Bereich[/COLOR]
LAR1 P##temp_Errors
L LW [AR1,P#0.0]
T #ERROR_WORD

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Vielen Dank für die Hilfe!

Variante 1 gefällt mir besser, da man in Strukturen alles mögliche verpacken kann und man beim Array auf einen Blick sieht, dass es nur diesen einen Typen beinhaltet.
(sofern keine speziellen Namen ("sprechende Bits") gewünscht sind)

mfG
Michael
 
In TIA geht es übrigens über den Slicezugriff auf die Variable mit #StaticByte.%X0
Ist aber, finde ich, gut erklärt im SiePortal. Also, wenn ich das verstehe, dann kann es nicht so kompliziert sein ;-)

SieLink


Ich war nämlich kurz davor euch deswegen zu nerven, da hab ich es doch noch gefunden ^^
 
Zurück
Oben