WinCC C-Aktion Text von Schriftfeld und Anzeige ändern

FinnAh

Level-1
Beiträge
47
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

aufgrund von wenig Erfahrung in C habe ich ein paar Fragen bezüglich des Erstellens einer/zweier C-Aktion, um bei einem Statischen Textfeld den Text und die Anzeige (ein-/ausgeblendet) über 2 Variablen (Vorzeichenloser 16-Bit Wert - WordToUnsignedWord) zu steuern.

Ich habe mich darin mal versucht, jedoch weiß ich nicht ob ich nicht sogar einen Denkfehler darin habe, denn eine zusätzliche Hürde ist auch, dass ich aus einem Word das 3.Bit auslesen muss.
Ist die Vorgehensweise zum Ändern des Textes und auslesen des Bitstatus von einem Word richtig?

#include "apdefap.h"
char* _main(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName)
{
// WINCC:TAGNAME_SECTION_START
// syntax: #define TagNameInAction "DMTagName"
// next TagID : 1
#define TAG_1 "Variable1"
#define TAG_2 "Variable2"
// WINCC:TAGNAME_SECTION_END

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


if(GetTagByte(TAG_1) ^0x04 ==1) {
return "Einlagerung über Segment 2 gesperrt";
}
else if (GetTagByte(TAG_2) ^0x04 ==1) {
return "Einlagerung über Segment 4 gesperrt";
}
}



Wie kann ich das Ein- und Ausblenden des Schriftfelds umsetzen?


Grüße
Finn
 
Hallo,

ich denke, Dein Problem ist, daß Du in den den IF-Abfragen auf ==1 abfragst.
Wenn Du aber ein WORD mit 0x04 veroderst, kommt als Ergebnis wieder ein WORD raus - und da Du Bit 3 abfragst, ist auch nur Bit 3 des Ergebnisses 0 oder 1... ich würde an Deiner stelle eher auf <>0 abfragen. Denn da Du nur ein Bit überprüfst, ist das Ergebnis entweder 0 oder eben nicht.

Für die Animation boolescher Eigenschaften gibst Du als Return dann TRUE oder FALSE mit dem Skript zurück an die Eigenschaft.

Ich hoffe, das hilft...

Gruß
JS
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Warum liest Du eine Word-Variable mit GetTagByte?
Warum verknüpfst Du die Variablen mit 0x04 per XOR?

Kann es sein, daß Du eigentlich nur testen willst, ob das dritte Bit der Wordvariablen (x.2) 1 oder 0 ist?
Bits testet man per bitweiser UND-Verknüpfung. Das Ergebnis kann man direkt als TRUE/FALSE auswerten, weil in C implizit jeder numerische Wert <> 0 gleichwertig mit TRUE(wahr) ist.
Code:
  if (GetTagWord(TAG_1) & 0x04) {
    return "Einlagerung über Segment 2 gesperrt";
  }
  else if (GetTagWord(TAG_2) & 0x04) {
    return "Einlagerung über Segment 4 gesperrt";
  }
  else {
    return "";
  }

Bei der Rückgabe von Strings bin ich grade nicht sicher, ob das so einfach geht oder ob der String in eine globale Variable oder Tag kopiert werden muß.

Harald
 
@PN/DP: Natürlich hast Du recht... hab wieder zu flüchtig gelesen...
Ich meine, Strings kann man direkt zurückgeben, wenn das Ziel auch ein String ist.
 
Kann es sein, daß Du eigentlich nur testen willst, ob das dritte Bit der Wordvariablen (x.2) 1 oder 0 ist?
Bits testet man per bitweiser UND-Verknüpfung. Das Ergebnis kann man direkt als TRUE/FALSE auswerten, weil in C implizit jeder numerische Wert <> 0 gleichwertig mit TRUE(wahr) ist.
Code:
if (GetTagWord(TAG_1) & 0x04) {
return "Einlagerung über Segment 2 gesperrt";
}
else if (GetTagWord(TAG_2) & 0x04) {
return "Einlagerung über Segment 4 gesperrt";
}
else {
return "";
}

Ja genau richtig. Ich will abfragen, ob in einem Word das 3.Bit 1 oder 0 ist und dann demensprechend den einen oder anderen Text ausgeben.

Wie löse ich das mit dem Ein-/Ausblenden des ganzen Textfelds, also über die C-Aktion, wieder über die beiden Variablen?



Vielen Dank für die hilfreiche Lösung
Finn
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Dafür brauchst Du eigentlich keine C-Aktion. Dynamisiere einfach die Anzeige des Objektes mit dem Dynamik-Dialog, Auswertung "Bool" mit dem Ausdruck
Code:
'Variable1' & 0x04 || 'Variable2' & 0x04

Harald
 
Zurück
Oben