Hintergrund und Schriftfarbe mit C Aktion ändern

A

Anonymous

Guest
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen
Auch ich hab ein problem. Bin seit längerem stiller leser dieses Forums. Hat mir auch schon sher viel geholfen

Ich würde gerne mit einer C Aktion den Hintergrund von grau auf rot und
die Schriftfarbe von schwarz auf weiß setzen, wenn bei einer 32Bit Variablen ein bestimmtes Bit gesetzt ist.

Wäre super wenn ihr mir weiterhelfen könntet

Gruß
Christian
 
wincc kenne ich nicht. bei protool gibt es aber den reiter atribute im eigenschaftendialog. dort kann man über eine steuervariable das aussehen des feldes ändern. ob es das bei wincc auch gibt weiss ich nicht.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
ja das kann ich schon auch anderst einstellen nur ist das viel mehr arbeit und da ich ziemlich viele solcher teile erstellen muß, wäre es in C viel besser einfach reinkopieren und fertig

Wäre echt super wenn ihr mir weiterhelfen könntet
 
Hallo,

Die Schriftfarbe kann man über "ForeColor" ändern und den Hintergrung über "BackColor".
Mit SetPropWord( lpszPictureName, lpszObjectName, lpszPropertyName, lValue);
Wobei lpszPropertyName = "ForeColor" oder "BackColor" ist.

Gruß Speedy
 
Hallo Speedy
Danke für deine Antwort.
Sorry das ich mich nicht gleich gemeldet habe
Woher weiß dann WinCC welche Farbe es nehmen soll.
Bin absoluter C looser :)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Es gibt bei WinCC vordefinierte Farben:
Diese sind

Schwarz CO_BLACK
Weiß CO_WHITE
Rot CO_RED
Dunkelrot CO_DKRED
Grün CO_GREEN
Dunkelgrün CO_DKGREEN
Blau CO_BLUE
Dunkelblau CO_DKBLUE
Gelb CO_YELLOW
Dunkelgelb CO_DKYELLOW
Cyan CO_CYAN
Dunkelcyan CO_DKCYAN
Magenta CO_MAGENTA
Dunkelmagenta CO_DKMAGENTA
Hellgrau CO_LTGRAY
Dunkelgrau CO_DKGRAY

Ansonsten muss man die Farbe die man will "berechnen"
Wenn du ins Farbmenu gehst kann man Farben definieren.
Dabei wird der Farbcode in dezimaler Darstellung nach Rot, Grün, Blau angezeigt. Diese Dezimalzahl in Hex umrechnen und in der Reihenfolge
BlauGrünRot als lValue eintragen.
Beispiel:
Rot 100
Grün 10
Blau 15
-> Rot hex F
Grün hex A
Blau hex 64
also als lValue 0x64AF eingeben und schon kommt ein wunderbares Braun zum Vorschein
8)
 
Es gibt bei WinCC vordefinierte Farben:
Diese sind

Schwarz CO_BLACK
Weiß CO_WHITE
Rot CO_RED
Dunkelrot CO_DKRED
Grün CO_GREEN
Dunkelgrün CO_DKGREEN
Blau CO_BLUE
Dunkelblau CO_DKBLUE
Gelb CO_YELLOW
Dunkelgelb CO_DKYELLOW
Cyan CO_CYAN
Dunkelcyan CO_DKCYAN
Magenta CO_MAGENTA
Dunkelmagenta CO_DKMAGENTA
Hellgrau CO_LTGRAY
Dunkelgrau CO_DKGRAY

Ansonsten muss man die Farbe die man will "berechnen"
Wenn du ins Farbmenu gehst kann man Farben definieren.
Dabei wird der Farbcode in dezimaler Darstellung nach Rot, Grün, Blau angezeigt. Diese Dezimalzahl in Hex umrechnen und in der Reihenfolge
BlauGrünRot als lValue eintragen.
Beispiel:
Rot 100
Grün 10
Blau 15
-> Rot hex F
Grün hex A
Blau hex 64
also als lValue 0x64AF eingeben und schon kommt ein wunderbares Braun zum Vorschein
8)
 
ohh mann ich bin zu doof für das ganze
Hab mich jetzt auch zu nem C kurs angemeldet, aber bis dahin wäre es super wenn ihr mir da nochmal helfen könnt

Wenn ich das ganz so mach wie beschrieben, kommen Fehlermeldungen ohne ende.

Ich habe eine 32Bit Variable bei der ich mit einem bestimmten Bit aus dieser Variable den Hintergrund + Schriftfarbe ändere

So wie geh ich jetz vor.
Brauch eine sehr sehr genaue beschreibung, aber wäre super wenns mir jemand erkärt.

Vielen Dank
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also du erstellt jeweils bei Hintergrund und Schriftfarbe (hoffe die Bezeichnungen stimmen da ich auf englischem WinCC arbeite) ein C Skript.
Das sieht folgendermaßen aus

// WINCC:TAGNAME_SECTION_START
// syntax: #define TagNameInAction "DMTagName"
// next TagID : 1
#define TagName "testtag" // HIER KOMMT DEIN TAG REIN
// WINCC:TAGNAME_SECTION_END

// WINCC:pICNAME_SECTION_START
// syntax: #define PicNameInAction "PictureName"
// next PicID : 1
// WINCC:pICNAME_SECTION_END

DWORD tag;

tag=GetTagDWord(TagName);
// Jetzt muss der Wert maskiert werden um nach dem gesetzten Bit
// abzufragen; Öffne den Rechner in Windows, aktiviert wissenschaftliche
// Ansicht und schreibe in binärer Darstellung überall 0 wo nicht abgefragt // werden soll und 1 bei gewünschtem Bit und zeige es dezimal an.
// Also z.b. Bit 2 ist gesetzt -> 100 -> dezimal 4
if (tag&4)
return CO_BLACK;
else
return CO_RED;

Falls du es nicht hinbekommst dann poste den Variablennamen und das Bit das abgefragt werden soll.
Gruss
 
Suuuper vielen dank. jetzt gehts.

Nur noch eine frage. Kann man das ganze auch so verbinden das ich z.b. diese ganze anweisung (hintergrund + Schriftfarbe) in einen C text reinpacken?
 
Ja geht (finde ich auch wesentlich eleganter)
Die C Aktion in eine der der zu ändernden Eigenschaften z.B. Schriftfarbe
Ändere den Code unten in

if (tag&4)
{
SetPropWord(lpszPictureName,lpszObjectName,"BackColor",CO_BLACK);
return CO_BLACK;
}
else
{
SetPropWord(lpszPictureName,lpszObjectName,"BackColor",CO_RED);
return CO_RED;
}

Fragen? 8)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Maldito schrieb:
Ja geht (finde ich auch wesentlich eleganter)
Die C Aktion in eine der der zu ändernden Eigenschaften z.B. Schriftfarbe
Ändere den Code unten in

if (tag&4)
{
SetPropWord(lpszPictureName,lpszObjectName,"BackColor",CO_BLACK);
return CO_BLACK;
}
else
{
SetPropWord(lpszPictureName,lpszObjectName,"BackColor",CO_RED);
return CO_RED;
}

Fragen? 8)

Fragen hab ich immer. Aber vielen dank das du dich meiner erbarmst
Wie lerne ich den am besten C???? Ist irgendwie so schwierig.

Irgendwie geht das bei mir nicht. Hab das ganze mal in "Hintergrnd Farbe" reinkopiert und es ändert sich nur die hintergrundfarbe
Weiter oben wird noch von Forecolor gesprochen. Kann es nicht sein das dieser auch noch mit eingebunden werden muß??
 
Soweit ich das verstanden habe willst du die Schiftfarbe und die Hintergrundfarbe ändern.
Die Funktion ist jetzt so ausgelegt das du sie als C-Skript unter Schriftfarbe anlegst.
Abhängig von der IF Bedingung wird über SetPropWord mit BackColor die Hintergrundfarbe gesetzt und danach als Rückgabewert die Farbe der Schrift zurückgegeben.

Wenn du es in HintergrundFarbe reinkopiert hast dann muss es so aussehen

if (tag&4)
{
SetPropWord(lpszPictureName,lpszObjectName,"ForeColor",CO_BLACK);
return CO_BLACK;
}
else
{
SetPropWord(lpszPictureName,lpszObjectName,"ForeColor",CO_RED);
return CO_RED;
}

Zum Thema C lernen kann ich dir jetzt keine entscheidenden Tips geben aber ich würde es einfach mal mit Lehrbücher versuchen.
Die Referenz in diesem Gebiet ist das Buch:
Programmieren in C von Kernighan und Ritchie.
Allerdings nicht unbedingt zum lernen geeignet.
Steht bei mir auf dem Tisch zum nachschlagen.
 
Maldito schrieb:
Soweit ich das verstanden habe willst du die Schiftfarbe und die Hintergrundfarbe ändern.
Die Funktion ist jetzt so ausgelegt das du sie als C-Skript unter Schriftfarbe anlegst.
Abhängig von der IF Bedingung wird über SetPropWord mit BackColor die Hintergrundfarbe gesetzt und danach als Rückgabewert die Farbe der Schrift zurückgegeben.

Wenn du es in HintergrundFarbe reinkopiert hast dann muss es so aussehen

if (tag&4)
{
SetPropWord(lpszPictureName,lpszObjectName,"ForeColor",CO_BLACK);
return CO_BLACK;
}
else
{
SetPropWord(lpszPictureName,lpszObjectName,"ForeColor",CO_RED);
return CO_RED;
}

Zum Thema C lernen kann ich dir jetzt keine entscheidenden Tips geben aber ich würde es einfach mal mit Lehrbücher versuchen.
Die Referenz in diesem Gebiet ist das Buch:
Programmieren in C von Kernighan und Ritchie.
Allerdings nicht unbedingt zum lernen geeignet.
Steht bei mir auf dem Tisch zum nachschlagen.

ich habe mir schon ein Buch über C gekauft bin aber noch nicht wirklich dazu gekommen mich wirklich damit zu beschäftigen.
Zumal es keine Anlehnung an WinCC gibt (dinge wie bit setzen usw.)

Kennst du dich auch mit Faceplade aus? Das muß ich auch machen.

Aber danke erst mal. Werd es heute abend sofort testen. Vielen dank
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Bitmaskierung ist nichts WinCC spezifisches.
Wird auch in C verwendet und benötigt.

Mit Faceplates wirst du sehr viel Spaß haben.
Nicht böse sein:
Glaub das wird zeimlich knifflig da dir da wahrscheinlich noch Grundlagen fehlen.
Da wird mit Prefixes, Bildaufschlagsfunk. , Positionierungsfunk. ,... hantiert was nicht immer sofort einsichtig ist.

Aber probieren geht über studieren :wink:

Für Fragen sind ja Foren da
 
Maldito schrieb:
Mit Faceplates wirst du sehr viel Spaß haben.
Nicht böse sein:
Glaub das wird zeimlich knifflig da dir da wahrscheinlich noch Grundlagen fehlen.
Da wird mit Prefixes, Bildaufschlagsfunk. , Positionierungsfunk. ,... hantiert was nicht immer sofort einsichtig ist.

Aber probieren geht über studieren :wink:

Für Fragen sind ja Foren da

Ha habs schon geschft :lol: :lol:
Hab nen Order von Siemens bekommen wo es drin steht.
Bin auch sehr zufrieden.
Nur hab ich jetzt folgendes Problem
Wenn ich auf dem linken Monitor mein Plate aufrufe geht alles wunderbar. Nur wenn ich das gleiche Bild im rechten monitor aufrufe und auf meine Zustandsanzeige klicke pop es im linken monitor auf +*verzeifel*
was ist da wieder falsch??
 
Habe noch nicht mit Dualmonitoring gearbeitet.

Wird das Faceplate an einer definierten Position geöffnet?
Zum Test einfach mal an den Positionswerten feste Werte eingeben.

Wird das Faceplate auf dem ersten Monitor auf jeden Fall geöffnet oder nur wenn auf beiden Monitoren das gleiche Bild angewählt ist?

Poste mal die Funktion die das Faceplate öffnet.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo
Hier mal die Funktion laut dem Siemens Ordner


SetTagPrefix("area_picture","Motor_faceplate","Hauptpumpe_1");
SetPictureName("area_picture","Motor_faceplate","Motor_faceplate.pdl");
SetVisible("area_picture","Motor_faceplate",1);
 
Also arbeitest du mit einem flexiblen Faceplate in das der jeweilige Bildname vor Aufruf geschrieben wird.

Ich würde mal versuchen die Position des Button mit dem das Faceplate aufgerufen wird zu bestimmen und die Faceplate Koordinaten auf z.B. x,y Position+30 festzulegen.
Hier wird ähnlich vorgegangen.
http://www.sps-forum.de/phpBB2/viewtopic.php?t=3446

Damit kannst du erreichen das die Position des Buttons als Anker für das Faceplate genommen wird.

Alternativ kannst du mal testen indem du dem Faceplate eine Y-Koordiante gibst die rechts vom Bildschirm liegt (Bildgröße z.B. 1200x1024) also 1100.
Vielleicht orientiert sich das Faceplate an der Y-Koordinate und diese ist durchgehend für beide Monitore.
Ist aber nur eine Idee.
 
Maldito schrieb:
Also arbeitest du mit einem flexiblen Faceplate in das der jeweilige Bildname vor Aufruf geschrieben wird.

Ich würde mal versuchen die Position des Button mit dem das Faceplate aufgerufen wird zu bestimmen und die Faceplate Koordinaten auf z.B. x,y Position+30 festzulegen.
Hier wird ähnlich vorgegangen.
http://www.sps-forum.de/phpBB2/viewtopic.php?t=3446

Damit kannst du erreichen das die Position des Buttons als Anker für das Faceplate genommen wird.

Alternativ kannst du mal testen indem du dem Faceplate eine Y-Koordiante gibst die rechts vom Bildschirm liegt (Bildgröße z.B. 1200x1024) also 1100.
Vielleicht orientiert sich das Faceplate an der Y-Koordinate und diese ist durchgehend für beide Monitore.
Ist aber nur eine Idee.


Danke
Ja genau. So wirds dort gemacht
Mit dieser positionsbestimmung (habs aus dem thread) gehts leider net.
pop trozdem im ersten Monitor auf. Da das das gleiche Bild ist das auf dem 2. Monitor ist, kann ich keine festen yx werte eintragen.

Hat alles so gut begonnen. Habs jetzt mal ne frage an Siemens gerichtet. Bin mal gespannt. Werds hier dann posten. Vielen dank aber mal
 
Zurück
Oben