![]() |
![]() |
C++ - Bitfelder (2) |
G.Eichelsdörfer - Staatliche Technikerschule Weilburg |
Fortführung des Beispiels:
Die folgende Komponente ist das Steuersignal für den Motor, der das Werkstück in
der Horizontalen (x-Richtung) bewegt. Dafür werden zwei Bits benötigt:
Ein Bit zum Einschalten des Motors, eines für die Dreh- bzw. Transportrichtung.
struct Pos
{
bool RefX : 1;
bool RefY : 1;
int MotX : 2;
};
Hier wird das Vorzeichen im höherwertigen Bit vorteilhaft für die Bewegungsrichtung
eingesetzt.
Werte für diese Komponente und deren Bedeutung:
0 = 002: Motor aus
1 = 012: Motor bewegt das Werkstück vorwärts
-1 = 112: Motor bewegt das Werkstück rückwärts
Alternativ kann man hier zwei Komponenten MotXein (Motor einschalten) und
MotXdir (direction = Transportrichtung) einsetzen:
unsigned int MotXein : 1;
// 0: Motor aus, 1: Motor ein
unsigned int MotXdir : 1;
// 0: vorwärts, 1: rückwärts
Nun ist noch ein weiterer Motor für die andere Richtung (Y) anzusteuern.
struct Pos
{
bool RefX : 1;
bool RefY : 1;
int MotX : 2;
int MotY : 2;
};
Das obige Bitfeld umfasst nur 6 Bit. Ports sind zumeist mindestens 8 Bit breit. Mit Hilfe eines solchen Bitfeldes ist es einfach, die Positionierung per Programm zu steuern. Zugleich ist der Quelltext in hohem Maße selbstdokumentierend.
Beispiel zum Anfahren des Referenzpunktes:
Pos P;
P = einlesen(); // liest die an einem Port liegenden Werte ein
while(!P.RefX) // solange der Referenzsensor in X-Richtung nicht erreicht
{
P.MotX = -1; // X-Bewegung belegen: rückwärts
ausgeben(P); // gibt die Werte in P an einem Port aus
P = einlesen(); // erneut einlesen
}
P.MotX = 0; // Signal zum Abstellen des X-Motors vorbereiten
ausgeben(P); // X-Motor anhalten
// Das Gleiche in y-Richtung:
P = einlesen();
while(!P.RefY)
{
P.MotY = -1; // Y-Bewegung rückwärts
ausgeben(P);
P = einlesen();
}
P.MotY = 0; // Signal zum Abstellen des Y-Motors vorbereiten
ausgeben(P); // Y-Motor anhalten
Die elegantere Alternative fährt den Referenzpunkt schneller an:
Pos P;
P = einlesen();
while(!P.RefX || !P.RefY)
{
if(P.RefX) P.MotX = 0; else P.MotX = -1;
if(P.RefY) P.MotY = 0; else P.MotY = -1;
ausgeben(P);
P = einlesen();
}
Um das Einlesen von einem Port und das Ausgeben an einen Port auf einfache Weise realisieren zu können sind so genannte Varianten erforderlich. Diese werden auf der folgenden Seite beschrieben.