zurück weiter

C++ - Bitfelder (2)

G.Eichelsdörfer - Staatliche Technikerschule Weilburg

Fortführung des Beispiels:

  1. 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

  2. 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.