Verständnisfrage zu ENUM in TwinCat 3

Jörn

Level-1
Beiträge
58
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin,

ich hab, wie der Titel schon andeutet, eine Verständnisfrage zu ENUMs in TwinCat 3. Ich habe ein ENUM für eine Schrittkettensteuerung angelegt:

Code:
TYPE ENM_Sequence :
(
    search,
    empty,
    infeed,
    outfeed,
    error
);
END_TYPE

In meinem Programm lege ich nun eine Variable dieses Type an und initialisiere sie mit dem Wert search.

Code:
VAR
    Sequence: ENM_Sequence := ENM_Sequence.search;
END_VAR

Im Programm möchte ich nun anhand des aktuellen Zustandes der Schrittkette was tun und zwischen den Schritten hin- und herspringen können. Etwa so:

Code:
CASE Sequence OF
    ENM_Sequence.search:
        IF NOT ixPartSensor THEN
             Sequence := ENM_Sequence.empty;
        END_IF

    ENM_Sequence.empty:
        qxMotorOn := FALSE;
        qxMotorOff := TRUE;
        IF ixButtonPressed THEN
             Sequence := ENM_Sequence.infeed;
        END_IF

    ENM_Sequence.infeed:
        qxMotorOff := FALSE;
        qxMotorOn := TRUE;
        //...
END_CASE

Was mich gerade sehr verwirrt, ist, daß ich z.B. bei der Initialisierung ENM_Sequence.search angeben muss. Die Sequence ist doch vom Typ ENM_Sequence. Warum muss ich ihm bei der Zuweisung noch explizit angeben, daß search aus dem ENUM ENM_Sequence ist, wenn Sequence doch eben dieses ENUM ist?

Das Gleiche beim case. Ich möchte abfragen, welchen der Werte Sequence gerade hat. Warum muss ich da explizit abfragen, ob es ENM_Sequence.search ist, statt einfach nur search abfragen zu können. Ebenso bei den Zuweisungen. Warum muss ich explizit Sequence := ENM_Sequence.empty zuweisen, statt nur Sequence := empty? So also:

Code:
CASE Sequence OF
    search:
        IF NOT ixPartSensor THEN
             Sequence := empty;
        END_IF
     empty:
        //...

    infeed:
        //...
END_CASE

Kann mich diesbzgl. vielleicht jemand erhellen? Danke schonmal. :)

Gruß
Jörn
 
Für den Kompiler sind ENUMS einfache Integer Werte. Der Text den du mit den Werten zuweist, kennt der Kompiler nicht. Und da du search in mehreren ENUMs verwenden kannst, mit jeweils anderen Werten, muss du dem Kompiler mitteilen auf welchen sich dein search bezieht.
In TwinCAT 2 konnte man das nicht tun, mit dem Resultat dass ein ENUM Wert global nur einmal vorkommen durfte. Das war echt blöd, da ist die Lösung mit dem Prefix wesentlich besser, auch wenn es etwas mehr Text im Code bedeutet.

Code:
ENUM1
{bli,
bla,
blub}

ENUM2
{bla,
blub,
bli
}

ENUM1.bli = 0
ENUM2.bli = 2

ENUM1.bli != ENUM2.bli
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn ich den ENUMs keine Werte zuweise, macht er das ja selbstständig. Ich könnte schreiben:

Code:
ENUM1
{eins,
zwei,
drei
}

... oder ...

Code:
ENUM1
{eins := 1,
zwei := 2,
drei := 3
}

Da ich keine zuweise bin ich davon ausgegangen, daß er selbstständig eineindeutige Werte vergibt, sodaß sich keine Kollision ergibt, wie Du sie aufgezeigt hast. Wenn ich die Werte gemäß des zweiten Beispiels selber zuweise, würde ich annehmen, daß TwinCat danach schaut, daß es keine Überschneidung gibt - oder zumindest eine Warnung ausgibt. Das scheint aber offensichtlich nicht der Fall zu sein, wenn ich Dich richtig verstehe. Dann wird das Verhalten auch verständlich.

Ich hab zwischenzeitlich herausgefunden, daß ich das von mir gewünschte erreiche, wenn ich das Attribut qualified_only lösche, welches, neben dem Attribut strict, beim Anlegen automatisch eingefügt wird:

Code:
{attribute 'qualified_only'}
{attribute 'strict'}
TYPE ENM_Sequence :(
    search,
    empty,
    infeed,
    outfeed,
    error
);
END_TYPE

Vielen Dank. :)

Gruß
Jörn
 
Moin Fusel,

ich bein ein großer Freund von verständlichem, aufgeräumtem, und damit wartbarem, Code. Ich kannte nur ENUMs Hintergrund nicht. Und die von Dir verlinkte Seite auch nicht. :s1:

Gruß
Jörn
 
Zurück
Oben