Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Ergebnis 1 bis 7 von 7

Thema: WinCC C-Aktion Text von Schriftfeld und Anzeige ändern

  1. #1
    Registriert seit
    20.08.2014
    Beiträge
    44
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard


    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
    Zitieren Zitieren WinCC C-Aktion Text von Schriftfeld und Anzeige ändern  

  2. #2
    Registriert seit
    03.02.2015
    Ort
    Hatten
    Beiträge
    183
    Danke
    16
    Erhielt 32 Danke für 29 Beiträge

    Standard

    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

  3. #3
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.192
    Danke
    925
    Erhielt 3.292 Danke für 2.661 Beiträge

    Standard

    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
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  4. #4
    Registriert seit
    03.02.2015
    Ort
    Hatten
    Beiträge
    183
    Danke
    16
    Erhielt 32 Danke für 29 Beiträge

    Standard

    @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.

  5. #5
    FinnAh ist offline Benutzer
    Themenstarter
    Registriert seit
    20.08.2014
    Beiträge
    44
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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

  6. #6
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.192
    Danke
    925
    Erhielt 3.292 Danke für 2.661 Beiträge

    Standard

    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
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  7. #7
    FinnAh ist offline Benutzer
    Themenstarter
    Registriert seit
    20.08.2014
    Beiträge
    44
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Super, vielen Dank. Funktioniert

Ähnliche Themen

  1. Antworten: 0
    Letzter Beitrag: 28.01.2011, 14:42
  2. Text in Schaltfläche durch Bitbefehl ändern
    Von Lebenslang im Forum HMI
    Antworten: 4
    Letzter Beitrag: 14.07.2010, 16:31
  3. Farbe mit C-Aktion ändern in WinCC
    Von Cococabana im Forum HMI
    Antworten: 3
    Letzter Beitrag: 28.10.2009, 10:50
  4. Antworten: 1
    Letzter Beitrag: 29.11.2005, 14:31
  5. Antworten: 19
    Letzter Beitrag: 23.05.2005, 11:18

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •