TIA .Net Control in WinCC - Chart wird "willkürlich" gezeichnet

Mulas94

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

ich habe in TIA V14 SP1 Upd5 unter WinCC Advanced ein eigenes .net Control eingebunden (entwickelt in VS 2015, C#, Framework 4.0). Dieses soll ein Array aus den HMI-Variablen lesen und danach mit den erhaltenen Daten einen Graphen im Chart-Steuerelement zeichnen.
Die Kommunikation zwischen WinCC und dem Control funktioniert auch ohne Probleme, allerdings wird mein Chart mal korrekt gezeichnet, mal gar nicht (die Daten sind da aber die Visualisierung/das Zeichnen scheint schlichtweg zu fehlen) und manchmal wird eine Exception "Collection was modified; enumeration may not execute" geworfen. Das Irritierende ist, dass es keine Regelmäßigkeit gibt, wann welcher dieser 3 Fälle auftritt.

Außerdem funktioniert der Code einwandfrei, wenn ich ihn durch ein Click-Event eines Buttons des Controls ausführe. Liegt dieser Button oder das Triggerbit, das die Ausführung triggert aber im TIA-Portal tritt das oben beschriebene Verhalten auf.

eventuell auch interessant: Ich füge dem Chart die Punkte in einer For-Schleife hinzu. Wenn ich nach dem Hinzufügen eines jeden Punktes in der For-Schleife eine TextBox mit einem leeren String beschreibe, funktioniert alles zuverlässig (wenn auch deutlich langsamer).

Ich bin für jeden Tipp dankbar und hoffe, dass ich das Problem gut genug beschrieben habe ;)
 
Zuletzt bearbeitet:
Zeig doch einfach mal den Code her, dann könnte man dir sicherlich schneller weiterhelfen?
Gruß
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Zeig doch einfach mal den Code her, dann könnte man dir sicherlich schneller weiterhelfen?
Gruß

Code:
private void ReadArray()
        {
            Array[0] = 1;
            Array[1] = 20;
            Array[2] = 40;
            Array[3] = 60;
            Array[4] = 80;
            Array[5] = 100;
            Array[6] = 120;
            Array[7] = 140;
            Array[8] = 160;
            Array[9] = 180;
            Array[10] = 200;
            Array[11] = 180;
            Array[12] = 160;
            Array[13] = 140;
            Array[14] = 120;
            Array[15] = 100;
            Array[16] = 80;
            Array[17] = 60;
            Array[18] = 40;
            Array[19] = 20;
        }

 private void showTestSerie()
        {
            if (TestSerie.Points.Count >= 1)
            {
                TestSerie.Points.Clear();
            }
            for (int j = 0; j < 20; j++)
            {
                //Punkt nur hinzufügen, wenn es kein Defaultwert ist
                if (Convert.ToInt32(Array[j]) != 0)
                {
                    TestSerie.Points.AddXY(Array[j], j);
                    //txtBox_Performance.Text = "";                    //die angesprochene Textbox
                }
            }
        }

//Wenn Button auf dem Control gedrückt wird...
        private void button1_Click(object sender, EventArgs e)
        {
            ReadArray();
            showTestSerie();
            this.TagService.WriteTag(m_RegisterCookie, m_Trigger, false);
        }

//Wenn Trigger aus dem TIA-Portal übereinstimmt dann...
        if (arrTagNames[0] == m_Trigger)
        {        
            ReadArray();
            showTestSerie();
            this.TagService.WriteTag(m_RegisterCookie, m_Trigger, false);
         }
 
Hallo Mulas,
mit eigenen .Net-Controls im TIA-Poirtal habe ich auch schon "ein bißchen" herum-experimentiert.
Ich vermute, dass dein Hauptproblem darin besteht, dass TIA sich mit dem nachträglichen instanzieren/allozieren von Speicher schwer tut.
Dass dein Control auf seine eigenen Events reagiert ist logisch - aus dem Code ersehe ich aber im Augenblick nicht, wie du deinem Control aus dem TIA-Portal einen Refresh (Invalidate) aufoktruierst.
Ich hatte übrigens auch festgestellt, dass manche Formen von Properties bei deren Benutzung sogar TIA in die Knie zwingt.
Es sind halt (leider Gottes) zwei verschiedene Welten (TIA und .Net).

Gruß
Larry
 
Hey Larry,

dein Hauptproblem darin besteht, dass TIA sich mit dem nachträglichen instanzieren/allozieren von Speicher schwer tut

Was meinst Du damit? Wofür wird noch Speicher belegt, wenn ich mein Array bereits in ein internes Array kopiert habe? Für das Zeichnen?

ich hatte auch mal versucht mit der Methode Chart.Refresh() ein Neuzeichnen zu erzwingen, aber auch das war nicht von Erfolg gekrönt. Allerdings sollten die einzelnen hinzugefügten Punkte auch ohne ein erneutes Laden angezeigt werden oder meinst Du eine Aktualisierung des WinCC-Bildes?

Meine Idee mich über ein Button.PerformClick() fast ausschließlich im Control zu bewegen hat auch nicht funktioniert.

Auf jeden Fall schon einmal vielen Dank für die Antwort!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wofür wird noch Speicher belegt, wenn ich mein Array bereits in ein internes Array kopiert habe? Für das Zeichnen?

Naja ... das Chart-Control selbst macht das dann ja auch noch mal (ich nehme mal an, dass du den MSChart o.ä. am Start hast - ist aber eigentlich auch nicht von Relevanz).
Die Unter-Methode 'AddXY' für z.B. einer dem Chart zugehörigen List(of Point) ein neues Element (also die Instanz eines Point-Elementes) hinzu.
Das Gegenteil macht die 'Clear'-Methode. Hier wird deine List gelöscht.
Im Grunde ist es so, dass es dir tierisch schwer fallen wird unter .Net irgend etwas zu basteln, das schon alles Benötigte 'an Bord' hat. Aber es geht ... du wirst z.B. mit einem Button oder einem Label, selbst wenn es 'customized' ist nicht diese Probleme haben.

Im Grundsatz ist hier aber Siemens das eigentliche Problem ...

Gruß
Larry
 
Was anderes wie soll denn bitte sowas funktionieren dahinter verbirgt sich ja kein event ?
Code:
[COLOR=#333333][FONT=Courier]//Wenn Trigger aus dem TIA-Portal übereinstimmt dann...[/FONT][/COLOR]        if (arrTagNames[0] == m_Trigger)
        {        
            ReadArray();
            showTestSerie();
            this.TagService.WriteTag(m_RegisterCookie, m_Trigger, false);  }[COLOR=#222222][FONT=Verdana]
[/FONT][/COLOR]
 
@Larry Laffer
Im Grunde ist es so, dass es dir tierisch schwer fallen wird unter .Net irgend etwas zu basteln, das schon alles Benötigte 'an Bord' hat

Das verstehe ich nicht. Was muss ich denn basteln? Wenn ich meine Daten aus dem TIA-Portal habe, wird alles andere doch über den VisualStudio-Code (im TIA-Portal) laufen. Wo ist der Unterschied, ob ich das selber zusammenbaue oder ob es der fertige Code für MS-Chart von Visual Studio ist?


@jok3r
Was anderes wie soll denn bitte sowas funktionieren dahinter verbirgt sich ja kein event ?

so fragt man über eine spezielle Methode der ITag-Schnittstelle von Siemens, die über die diese implementiert wird, seine registrierten und zyklisch abgefragten Trigger aus dem TIA-Portal ab (hier m_Trigger).
 
eventuell auch interessant: Ich füge dem Chart die Punkte in einer For-Schleife hinzu. Wenn ich nach dem Hinzufügen eines jeden Punktes in der For-Schleife eine TextBox mit einem leeren String beschreibe, funktioniert alles zuverlässig (wenn auch deutlich langsamer).

Evtl ist das Updaten dann zu schnell. Lösche doch mal die Textbox und, und erzeuge ein kleines Delay zb. mit einer Schleife von 1 bis 100? Diese problemchen gibts im VBS im WinCC auch ab und an mal.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn ich meine Daten aus dem TIA-Portal habe, wird alles andere doch über den VisualStudio-Code (im TIA-Portal) laufen. Wo ist der Unterschied, ob ich das selber zusammenbaue oder ob es der fertige Code für MS-Chart von Visual Studio ist?

Es läuft zawr unter VB-Script, nicht aber unter .Net.
Das ist ein "klitzekleiner" Unterschied ...
Ansonsten : es nützt dir, wie du festgestellt aber nicht registriert hast, auch nichts, das der MSChart (mal egal in welcher Ausprägung) als Control an sich funktioniert. Das Control allein nützt dir nichts wenn du es nicht mit Daten versorgen kannst ... und wie ich dir zu erklären versucht habe : damit werden dann sofort wieder Objekte instanziert und somit Speicher belegt, von dem TIA selbst nichts mitbekommt und der sich möglicherweise sogar mit TIA "beharkt" ...

Gruß
Larry
 
Ich habe es lösen können: Das Problem lag daran, dass Visual Studio meinen Code anscheinend hin und wieder im falschen Thread aufgerufen hat.
https://msdn.microsoft.com/de-de/library/system.windows.forms.control.invokerequired(v=vs.110).aspx

Code:
        delegate void ShowTestSerieCallback();

        private void showTestSerie()
        {
            if (_chart.InvokeRequired)
            {
                this.Invoke(new ShowTestSerieCallback(showTestSerie));
            }
            else
            {
                if (TestSerie.Points.Count >= 1)
                {
                    TestSerie.Points.Clear();
                }

                for (int j = 0; j < 20; j++)
                {
                    //Punkt nur hinzufügen, wenn es kein Defaultwert ist
                    if (Convert.ToInt32(Array[j]) != 0)
                    {
                        TestSerie.Points.AddXY(Array[j], j);
                    }
                }
            }
        }


Trotzdem danke für eure Hilfe!
 
Hallo alle zusammen,

letzter Beitrag zum Thema ist zwar schon älter, aber hat jemand das Thema WinCC Variablen lesen und schreiben so wie im Handbuch
https://support.industry.siemens.com/cs/mdm/91479053?c=61033682059&lc=de-WW beschrieben weiter verfolgt?

@Mulas94
Ist es wirklich möglich im WinCC V14 auf die Variablen zu zugreifen?
Wenn es bei dir mit V14.0 funktioniert, würdest du bitte den Zugriff auf ITag-Schnittstelle beschreiben?
Leider waren meine Bemühungen dies nach der Beschreibung in V13.0 zu gestallten erfolglos.

Im Handbuch WinCC Advanced V14 ist das Kapitel "Customer Controls" nicht mehr zu finden...

Vielen Dank im Voraus.
 
Zurück
Oben