Siemens
Siemens

Digital Industries, Motion Control, Machine Tool Systems

B_OR / B_AND

Beitrag 25.03.2025, 16:11 Uhr
fonsi
Level 2 = Community-Facharbeiter
**
Hallo zusammen,
wir benutzen "TDM" um die Werkzeuge auf die Maschine zu laden und auch zum entladen.
Folgendes Entladeprogramm wird generiert:

state = ($TC_TP8[GETT("49409",1)] B_OR 1024) B_AND 63487
$TC_TP8[GETT("49409",1)] = state

Die Programme sehen immer gleich aus, ausser die T-Nummer. Die wechselt natürlich immer.
Mir ist auch klar was GETT und $TC_TP8 machen

Was ist aber mit B_OR und B_AND?
Kann mir das jemand genau erklären was die in diesem Programm machen?

Gruss
Sérgio


--------------------
Gentoo-user
   
Beitrag 25.03.2025, 21:17 Uhr
CNCFr
Level 7 = Community-Professor
*******
Hier werden ganze Wörter verodert bzw. verundet. D.h., jedes der 16 verwendeten Bits in dem Wort links vom Operator (z.B. B_OR) wird mit dem Bit an der gleichen Stelle in dem Wort (der Zahl) auf der rechten Seite des Operators verknüpft.
Im konkreten Fall sieht das so aus:
$TC_TP8[GETT("49409",1)] liefert einen (beliebigen) Wert, d.h. einige der 16 Bits werden 0 sein, die anderen 1.
Dieser Wert wird mit der Zahl 1024 verodert. In dieser Zahl ist nur ein Bit gesetzt, nämlich das 10 (Zählung beginnt bei Null), denn 2^10 ist 1024.
Durch die Odervereknüpfung wird das 10. Bit auf 1 gesetzt, gleichgültig ob $TC_TP8[GETT("49409",1)] an dieser Stelle eine 0 oder eine 1 geliefert hat.
Danach wird dieses Ergebnis mit der Zahl 63487 verundet. In dieser Zahl sind alle Bits gesetzt, mit Ausnahme des 11. Das bedeutet, dass dass 11 Bit gelöscht (auf 0 gesetzt) wird. Alle anderen Bits bleiben unverändert.
Gesamtergebnis: In der Variablen "state" steht der Wert, den $TC_TP8[GETT("49409",1)] geliefert hat, der aber so modifiziert wurde, dass das 10. Bit immer gesetzt und das 11 Bit immer gelöscht ist.

Bit 10 bedeutet Werkzeug ist zu entladen
Bit 11 bedeutet Werkzeug ist zu beladen
D.h das Werkzeug soll entladen werden

Der Beitrag wurde von CNCFr bearbeitet: 25.03.2025, 21:22 Uhr
   
Beitrag 25.03.2025, 21:29 Uhr
fonsi
Level 2 = Community-Facharbeiter
**
ZITAT(CNCFr @ 25.03.2025, 21:17 Uhr) *
Hier werden ganze Wörter verodert bzw. verundet. D.h., jedes der 16 verwendeten Bits in dem Wort links vom Operator (z.B. B_OR) wird mit dem Bit an der gleichen Stelle in dem Wort (der Zahl) auf der rechten Seite des Operators verknüpft.
Im konkreten Fall sieht das so aus:
$TC_TP8[GETT("49409",1)] liefert einen (beliebigen) Wert, d.h. einige der 16 Bits werden 0 sein, die anderen 1.
Dieser Wert wird mit der Zahl 1024 verodert. In dieser Zahl ist nur ein Bit gesetzt, nämlich das 10 (Zählung beginnt bei Null), denn 2^10 ist 1024.
Durch die Odervereknüpfung wird das 10. Bit auf 1 gesetzt, gleichgültig ob $TC_TP8[GETT("49409",1)] an dieser Stelle eine 0 oder eine 1 geliefert hat.
Danach wird dieses Ergebnis mit der Zahl 63487 verundet. In dieser Zahl sind alle Bits gesetzt, mit Ausnahme des 11. Das bedeutet, dass dass 11 Bit gelöscht (auf 0 gesetzt) wird. Alle anderen Bits bleiben unverändert.
Gesamtergebnis: In der Variablen "state" steht der Wert, den $TC_TP8[GETT("49409",1)] geliefert hat, der aber so modifiziert wurde, dass das 10. Bit immer gesetzt und das 11 Bit immer gelöscht ist.

Bit 10 bedeutet Werkzeug ist zu entladen
Bit 11 bedeutet Werkzeug ist zu beladen
D.h das Werkzeug soll entladen werden


Wow. Genau so eine Antwort habe ich gebraucht. Vielen Dank spitze.gif super.gif danke.gif


--------------------
Gentoo-user
   
Beitrag 26.03.2025, 07:58 Uhr
CNCFr
Level 7 = Community-Professor
*******
Noch eine Ergänzung: Nachträglich habe ich in der Doku (Stand 2019) gesehen, dass bei dieser Systemvariablen mehr als 16 Bit (nämlich 18) belegt sind.
Dabei ist das 17. (also Index 16) wohl unkritisch, denn es ist als reserviert gekennzeichnet.
Das nächste Bit ist aber belegt (Werkzeug ist auf einem gesperrten Magazinplatz).

Mit der Programmzeile, um die es geht, werden auch diese beiden (und alle weiteren Bits) gelöscht. Wenn das nicht sein soll, muss man die Zahl 63487 entsprechend ersetzten durch 63487 + 196608 = 260095 oder aber gleich durch 2^32 - 2049 = 4294965247. Und wegen der besseren Lesbarkeit vielleicht doch eher hexadezimal 0xFFFFF7FF.
   
1 Besucher lesen dieses Thema (Gäste: 1)
0 Mitglieder: