# Farbtabelle



## cas (17 Mai 2011)

Hallo,
gibt es irgendwo eine "Farbtabelle" die ungefähr so aussieht:

Farbe.Rot:=255;
Farbe.Gelb:=123;
Farbe.Schwarz:=0;
Farbe.Weis:=FFFFFF;

usw...

Die Werte sind natürlich mist.
Das ganze als Struktur verpackt wäre toll.

MfG CAS


----------



## zotos (17 Mai 2011)

Vielleicht hilft Dir folgendes weiter:


```
TYPE VisuValueColor_Type :
STRUCT
(*NAME             TYPE        BBGGRR *)
    Black          :DWORD := 16#000000;
    Blue           :DWORD := 16#FF0000;
    BlueDark       :DWORD := 16#A00000;
    BlueLight      :DWORD := 16#FF8080;
    BlueSpecial    :DWORD := 16#FF0000;
    Cyan           :DWORD := 16#FFFF00;
    CyanDark       :DWORD := 16#A0A000;
    CyanLight      :DWORD := 16#FFFF80;
    CyanSpecial    :DWORD := 16#FFFF00;
    Green          :DWORD := 16#00FF00;
    GreenDark      :DWORD := 16#00A000;
    GreenLight     :DWORD := 16#80FF80;
    GreenSpecial   :DWORD := 16#00FF00;
    Grey           :DWORD := 16#C0C0C0;
    GreyDark       :DWORD := 16#5F5F5F;
    GreyLight      :DWORD := 16#C8D0D4;
    GreySpecial    :DWORD := 16#C0C0C0;
    Orange         :DWORD := 16#0099FF;
    OrangeDark     :DWORD := 16#1973DF;
    OrangeLight    :DWORD := 16#008DE2;
    OrangeSpecial  :DWORD := 16#0099FF;
    Pink           :DWORD := 16#FF00FF;
    PinkDark       :DWORD := 16#A000A0;
    PinkLight      :DWORD := 16#FF80FF;
    PinkSpecial    :DWORD := 16#FF00FF;
    Purple         :DWORD := 16#7F007F;
    PurpleDark     :DWORD := 16#2F002F;
    PurpleLight    :DWORD := 16#C900C9;
    PurpleSpecial  :DWORD := 16#7F007F;
    Red            :DWORD := 16#0000FF;
    RedDark        :DWORD := 16#0000AF;
    RedLight       :DWORD := 16#8080FF;
    RedSpecial     :DWORD := 16#0000FF;
    White          :DWORD := 16#FFFFFF;
    Yellow         :DWORD := 16#00FFFF;
    YellowDark     :DWORD := 16#00A0A0;
    YellowLight    :DWORD := 16#80FFFF;
    YellowSpecial  :DWORD := 16#00FFFF;
END_STRUCT
END_TYPE
```


----------



## Perfektionist (17 Mai 2011)

zotos schrieb:


> Vielleicht hilft Dir folgendes weiter:
> ...


grad erwähne ich Dich in einem Beitrag zu "kommt jetzt TIA", denke mir: na, von dem hast ja auch schon lang nicht mehr gelesen ...
muss Gedankenübertragung sein!
jedenfalls: herzlichen guten Abend ...


----------



## Chräshe (17 Mai 2011)

[FONT=Arial, sans-serif]Das könnte das auch interessant sein, zum selber mischen... 
[/FONT][FONT=Arial, sans-serif]ftp://ftp2.3s-software.com/pub/Examples/Projects/CoDeSysV2.3/Visualisation/RGB/[/FONT]

[FONT=Arial, sans-serif]EDIT: Vorher ist bei 3S eine Anmeldung notwendig. Ist mir entgangen, weil der Firefox sich erinnerte...[/FONT]

 [FONT=Arial, sans-serif]Gruß[/FONT]
 [FONT=Arial, sans-serif]Chräshe[/FONT]


----------



## PLEL (18 Mai 2011)

*Rgb*



Chräshe schrieb:


> [FONT=Arial, sans-serif]Das könnte das auch interessant sein, zum selber mischen...
> [/FONT][FONT=Arial, sans-serif]ftp://ftp2.3s-software.com/pub/Examples/Projects/CoDeSysV2.3/Visualisation/RGB/[/FONT]
> 
> [FONT=Arial, sans-serif]Gruß[/FONT]
> [FONT=Arial, sans-serif]Chräshe[/FONT]




leider ist ein Passwort erforderlich !?


----------



## cas (18 Mai 2011)

perfekt.

danke sehr.

MfG CAS


----------



## Chräshe (18 Mai 2011)

PLEL schrieb:


> leider ist ein Passwort erforderlich !?


 [FONT=Arial, sans-serif]Ja, vorher hier anmelden...   3S[/FONT]
 [FONT=Arial, sans-serif]Ist mir entgangen, weil der Firefox sich erinnerte... 
[/FONT]


----------



## StructuredTrash (18 Mai 2011)

Habe da auch noch was, und zwar die Farben, die im Auswahlfenster der TargetVisu angeboten werden. Erste Ziffer=Spalte, zweite Ziffer=Zeile.

```
VAR_GLOBAL CONSTANT

    Colr00:DWORD:=16#8080FF;
    Colr01:DWORD:=16#0000FF;
    Colr02:DWORD:=16#404080;
    Colr03:DWORD:=16#000080;
    Colr04:DWORD:=16#000040;
    Colr05:DWORD:=16#000000;

    Colr10:DWORD:=16#80FFFF;
    Colr11:DWORD:=16#00FFFF;
    Colr12:DWORD:=16#4080FF;
    Colr13:DWORD:=16#0080FF;
    Colr14:DWORD:=16#004080;
    Colr15:DWORD:=16#008080;

    Colr20:DWORD:=16#80FF80;
    Colr21:DWORD:=16#00FF80;
    Colr22:DWORD:=16#00FF00;
    Colr23:DWORD:=16#008000;
    Colr24:DWORD:=16#004000;
    Colr25:DWORD:=16#408080;

    Colr30:DWORD:=16#80FF00;
    Colr31:DWORD:=16#40FF00;
    Colr32:DWORD:=16#808000;
    Colr33:DWORD:=16#408000;
    Colr34:DWORD:=16#404000;
    Colr35:DWORD:=16#808080;

    Colr40:DWORD:=16#FFFF80;
    Colr41:DWORD:=16#FFFF00;
    Colr42:DWORD:=16#804000;
    Colr43:DWORD:=16#FF0000;
    Colr44:DWORD:=16#800000;
    Colr45:DWORD:=16#808040;

    Colr50:DWORD:=16#FF8000;
    Colr51:DWORD:=16#C08000;
    Colr52:DWORD:=16#FF8080;
    Colr53:DWORD:=16#A00000;
    Colr54:DWORD:=16#400000;
    Colr55:DWORD:=16#C0C0C0;

    Colr60:DWORD:=16#C080FF;
    Colr61:DWORD:=16#C08080;
    Colr62:DWORD:=16#400080;
    Colr63:DWORD:=16#800080;
    Colr64:DWORD:=16#400040;
    Colr65:DWORD:=16#400040;

    Colr70:DWORD:=16#FF80FF;
    Colr71:DWORD:=16#FF00FF;
    Colr72:DWORD:=16#8000FF;
    Colr73:DWORD:=16#FF0080;
    Colr74:DWORD:=16#800040;
    Colr75:DWORD:=16#FFFFFF;

END_VAR
```


----------



## zotos (18 Mai 2011)

Ich habe auch noch was. Bei Bestimmten Objekten wollte ich z.B. den Rahmen ein wenig heller oder dunkler als die Fläche darstellen. Jetzt wollte ich nicht für jedes Objekt zwei Farben angeben (also z.B. Gelb und hell Gelb). Um nun aber die Helligkeit einer Farbe zu beeinflussen, ist das RGB Farbschema nicht besonders geeignet. Also Umrechnen von RGB in HSL Helligkeit anpassen und von HSL wieder in RGB zurück rechnen. RGB ist bei CoDeSys übrigens BGR (Blau, Grün, Rot)

Hier mein Vorgehen:

Datentyp:

```
TYPE Type_HSL :
STRUCT
    Hue         :REAL;
    Saturation  :REAL;
    Lightness   :REAL;
END_STRUCT
END_TYPE
```
Umrechnung BGR nach HSL:

```
FUNCTION BGR2HSL : Type_HSL
VAR_INPUT
    BGR_Color   :DWORD;
END_VAR
VAR
    Red         :REAL;
    Green       :REAL;
    Blue        :REAL;
    Minimum     :REAL;
    Maximum     :REAL;
    Delta       :REAL;
    Hue         :REAL;
    Saturation  :REAL;
    Lightness   :REAL;
END_VAR

Red   := DWORD_TO_REAL(SHR(SHL(BGR_Color,24),24)) / 255.0;
Green := DWORD_TO_REAL(SHR(SHL(BGR_Color,16),24)) / 255.0;
Blue  := DWORD_TO_REAL(SHR(    BGR_Color,    16)) / 255.0;

Minimum := Red;
IF (Green < Minimum)
THEN
    Minimum := Green;
END_IF

IF (Blue < Minimum)
THEN
    Minimum := Blue;
END_IF


Maximum := Red;
IF (Green > Maximum)
THEN
    Maximum := Green;
END_IF

IF (Blue > Maximum)
THEN
    Maximum := Blue;
END_IF

Delta := Maximum - Minimum;



(*Saturation := Delta / Maximum;*)
IF (Minimum = Maximum)
THEN
    Hue := 0.0;
ELSE
    IF (Red = Maximum)
  THEN
        Hue := INT_TO_REAL(REAL_TO_INT((60*((Green - Blue) / Delta)) + 0.0) MOD 360);
    ELSIF (Green = Maximum)
    THEN
        Hue := ((60*((Blue - Red  ) / Delta)) + 120.0);
    ELSE
        Hue := ((60*((Red - Green ) / Delta)) + 240.0);
    END_IF
END_IF

IF (HUE < 0)
THEN
    HUE := HUE + 360.0;
END_IF

Lightness := (Maximum+Minimum) * 0.5;


IF (Maximum = Minimum)
THEN
    Saturation := 0;
ELSIF (Lightness <= 0.5)
THEN
  Saturation := (Delta/(Maximum+Minimum));
ELSE
  Saturation := (Delta/(2-Maximum-Minimum));
END_IF

BGR2HSL.Hue        := Hue;
BGR2HSL.Saturation := Saturation;
BGR2HSL.Lightness  := Lightness;

END_FUNCTION
```
Zurück von HSL nach BGR:

```
FUNCTION HSL2BGR : DWORD
VAR_INPUT
    HSL         :Type_HSL;
END_VAR
VAR
    Red         :REAL;
    Green       :REAL;
    Blue        :REAL;
    Minimum     :REAL;
    Maximum     :REAL;
    Delta       :REAL;
END_VAR

IF HSL.Saturation = 0
THEN
HSL2BGR :=     SHL(REAL_TO_DWORD(255 * HSL.Lightness), 16) OR
                     SHL(REAL_TO_DWORD(255 * HSL.Lightness),  8) OR
                     REAL_TO_DWORD(255 * HSL.Lightness);
ELSE

    IF HSL.Lightness <= 0.5
    THEN
    Minimum := HSL.Lightness * (1 - HSL.Saturation);
  ELSE
    Minimum := HSL.Lightness - HSL.Saturation * (1 - HSL.Lightness);
  END_IF

  Maximum := 2 * HSL.Lightness - Minimum;
  Delta   := Maximum - Minimum;

  CASE (REAL_TO_INT(HSL.Hue) / 60) OF
      0: ;
        Red   := Maximum;
      Blue  := Minimum;
      Green := (HSL.Hue / 60) * Delta + Minimum;

    1: ;
        Green := Maximum;
      Blue  := Minimum;
      Red   := Minimum - ((HSL.Hue / 60) - 2) * Delta;

    2: ;
        Green := Maximum;
      Red   := Minimum;
      Blue  := ((HSL.Hue / 60) - 2) * Delta + Minimum;

    3: ;
        Blue  := Maximum;
      Red   := Minimum;
      Green := Minimum - ((HSL.Hue / 60) - 4) * Delta;

    4: ;
        Blue  := Maximum;
      Green := Minimum;
      Red   := ((HSL.Hue / 60) - 4) * Delta + Minimum;


    ELSE
        Red   := Maximum;
      Green := Minimum;
      Blue  := Minimum - ((HSL.Hue / 60) - 6) * Delta;
    END_CASE
HSL2BGR :=     SHL(REAL_TO_DWORD(255 * Blue         ), 16) OR
                        SHL(REAL_TO_DWORD(255 * Green        ),  8) OR
                            REAL_TO_DWORD(255 * RED          );
END_IF

END_FUNCTION
```
Nun noch ein kleines Testprogramm ;o) Das aus Gelb ein hell Gelb zaubert:

```
PROGRAM PLC_PRG
VAR
    Farbe : DWORD := 16#00FFFF;
    ResFarbe : DWORD; (*Resultierende Farbe*)
    HSL_Farbe : Type_HSL;
    Offset : REAL := 0.15;
END_VAR


HSL_Farbe := BGR2HSL(Farbe);
HSL_Farbe.Lightness := HSL_Farbe.Lightness + Offset;

ResFarbe := HSL2BGR(HSL_Farbe);
```
PS: Ja, der Aufwand steht in keinem Verhältnis zum Effekt. Aber voller Spieltrieb voraus.

PPS: @Perfektionist: Auch Dir einen schönen guten Abend.


----------



## christoph.87 (24 November 2019)

Hi Zotos,

der Beitrag ist zwar schon Uralt, dennoch denke ich der Code wird noch ziemlich oft kopiert.

Irgendwas stimmt aber hier nicht ganz (hoffentlich bin nicht nur ich zu blöd dafür).
Den Fehler habe ich auf die Funktion HDL2BGR zurückgerührt, da hier am Schluss schon nicht die richtige Farbe zurück kommt.

Ich hoffe du bist hier noch aktiv und kannst hier helfen.

Vielen Dank schon mal.

MfG Der Chris


----------

