Farbtabelle

cas

Level-2
Beiträge
521
Reaktionspunkte
43
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
Vielleicht hilft Dir folgendes weiter:

Code:
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
 
Zuletzt bearbeitet:
Habe da auch noch was, und zwar die Farben, die im Auswahlfenster der TargetVisu angeboten werden. Erste Ziffer=Spalte, zweite Ziffer=Zeile.
Code:
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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:
Code:
TYPE Type_HSL :
STRUCT
    Hue         :REAL;
    Saturation  :REAL;
    Lightness   :REAL;
END_STRUCT
END_TYPE
Umrechnung BGR nach HSL:
Code:
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:
Code:
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:
Code:
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.
 
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

2019_11_24_11_55_14_CoDeSys_1.24.17.pro_.png
 
Zurück
Oben