Lösungsansätze für eine "STRING_TO_ENUM"-Funktion

AlbertDerKleine

Level-1
Beiträge
1
Reaktionspunkte
0
Hallo zusammen,

ich arbeite mit TwinCAT 3 und habe einen Farbtyp als Enumeration definiert. Nun habe ich einen String (z.B. "rot") und möchte diesen direkt in den entsprechenden Enum-Wert (E_COLOR_TYPE.rot) umwandeln. Meine Lösung wäre eine Funktion mit einer einfachen IF-ELSIF-Anweisung, die jeden Enum-Wert (umgewandelt in einen String) mit dem gegebenen String vergleicht (siehe unten). Ich denke, das ist nicht die eleganteste Lösung. Gibt es in TwinCAT 3 eingebaute Funktionen, die dies ermöglichen, oder was wäre der beste Workaround eurer Meinung nach?


Also so etwas wie:
eColor := STRING_TO_ENUM(sColorExample);

Vielen Dank im Voraus für eure Unterstützung!




My Current Solution:

Code:
// DUT_ENUM
{attribute 'qualified_only'}
{attribute 'strict'}
TYPE E_COLOR :
(
    none := 0,
    blue    := 1,
    red := 2,
    green := 3

);
END_TYPE
Code:
// POU_FUN
FUNCTION STRING_TO_eColor : E_COLOR
VAR_INPUT
    sColor    : STRING;
END_VAR
------------------------------------------------------------

IF sColor = TO_STRING(E_COLOR.green) THEN
    STRING_TO_eColor := E_COLOR.green;
ELSIF sColor = TO_STRING(E_COLOR.red) THEN
    STRING_TO_eColor := E_COLOR.red;
ELSIF sColor = TO_STRING(E_COLOR.blue) THEN
    STRING_TO_eColor := E_COLOR.blue;
ELSE
    STRING_TO_eColor := E_COLOR.none;
END_IF

 
Der Compiler kennt hier keine Text/Strings. Insofern kann man von einem Wert auch nicht auf den String/Text umformen.
Es verbleiben somit nur "Bastellösungen". Deine Variante passt soweit für mich.
Wenn es komplizierter aufgebaut wird würde ich allerdings einen Case nutzen.
 
{attribute 'qualified_only'}
{attribute 'strict'}
{attribute 'to_string'}
TYPE E_COLOR :
(
none := 0,
blue := 1,
red := 2,
green := 3
);
END_TYPE

PROGRAM MAIN
VAR
eCol : E_COLOR := E_COLOR.red;
sCol: STRING;
nCol: DINT;
END_VAR

sCol := TO_STRING(E_COLOR.red);
nCol := TO_DINT(E_COLOR.red);

Der Compiler kennt doch schon eine ganze Menge? String und Wert in dem Fall als DINT.
 
Zurück
Oben