TIA Auslesen von Arrays in Schleife - Laufzeit

MSP

Level-2
Beiträge
210
Reaktionspunkte
21
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Morgen Zusammen,

ich bin gerade dabei in WinCC Professional v16 eine f(x)-Anzeige mit insgesamt 8 Kurven darzustellen.
Der Zugriff erfolgt hierbei auf 8 Arrays mit jeweils 490 Werten, die ich in meinem Fall mit VB in einer Schleife auslese.

In der Simulation erfolgt hierbei der Aufbei der Ansicht sehr langsam, es wird hier das Script optisch sehr langsam durchlaufen, was ich mit der Trace-Anweisung beobachten kann.

Gibt es hier eventuell Verbesserungspotential was die Laufzeit angeht oder vielleicht einen eleganteren Weg die Daten auszulesen und darzustellen?

Hier der aktuelle Code (für 2 Kurven, das ist schon recht langsam...)

Code:
Sub VB_ReadOutCurves(ByRef TrendControl, ByRef ScaleXAxis, ByRef Array_1, ByRef Array_2)
'Tip:
' 1. Verwenden Sie die Tastenkombination <CTRL+SPACE> oder <CTRL+I>, um eine Liste aller Objekte und Funktionen zu öffnen
' 2. Schreiben Sie den Code unter Verwendung des HMI Runtime Objekts.
'  Beispiel: HmiRuntime.Screens("Screen_1").
' 3. Verwenden Sie die Tastenkombination <CTRL+J>, um eine Objektreferenz zu erstellen.
'Schreiben Sie den Code ab dieser Position:

Dim i                   ' Schleifenzähler
Dim dblAxisX(491)       ' Werte-Array für X-Achse
Dim dblAxisY_C1(491)    ' Werte-Array für Kurve #1
Dim dblAxisY_C2(491)    ' Werte-Array für Kurve #2
Dim objTrendControl     ' f(x) Kurvenanzeige
Dim objCurve1           ' Kurve #1 in der Kurvenanzeige
Dim objCurve2           ' Kurve #1 in der Kurvenanzeige

Set objTrendControl = ScreenItems(TrendControl)  ' Name der f(x)-Kurvenanzeige
Set objCurve1 = objTrendControl.GetTrend("Curve1")      ' Name der Kurve in der f(x)-Kurvenanzeige
Set objCurve2 = objTrendControl.GetTrend("Curve2")      ' Name der Kurve in der f(x)-Kurvenanzeige

' Ab hier Test ein Array anzeigen
For i = 0 To 30
  dblAxisX(i) = CDbl(i * 5)
  dblAxisY_C1(i) = SmartTags(Array_1 & "[" & i & "]")
  HMIRuntime.Trace "Array-Element (1) = " & i & "; Array-Wert = " & SmartTags(Array_1 & "[" & i & "]") & vbNewLine
  dblAxisY_C2(i) = SmartTags(Array_2 & "[" & i & "]") * 2
  HMIRuntime.Trace "Array-Element (2) = " & i & "; Array-Wert = " & SmartTags(Array_2 & "[" & i & "]") & vbNewLine
Next
objCurve1.InsertData dblAxisX, dblAxisY_C1
objCurve2.InsertData dblAxisX, dblAxisY_C2
End Sub

Hinweis zum Code:
Es handelt sich noch um einen Test der bereits funktioniert. Ich lese aktuell zum Testen nur 30 Werte je Kurve aus, aber das dauert schon recht lange.. Wenn ich dann auf 8x490 Werte hoch gehe läuft das Script ja gefühlt eine Ewigkeit...

Gruss,
Michael
 
Hallo,
ich würde sagen, dass dein Problem nicht dein Code ist sondern das Control (Steuerelement) an das du die Werte übergibst.
Mal unabhängig davon, sehe ich diese Aufgabe schon als grenzwertig (für WinCCProf.) an ...

Du könntest möglicherweise die Daten erst im Script aus den SmartTags in ein lokales Array umkopieren und dies dann dem Control zuweisen - ich denke aber, dass das wenig bringt ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Larry,

das Script funktioniert so ja, die Werte werden aktualisiert.
Das Problem sehe ich halt in der Laufzeit der Schleife, wenn ich zum Test jeden Datenpunkt in der Schleife anzeigen lasse, wird die Kurve halt "Live" aufgebaut in der Control, aber halt sehr langsam.
Wenn ich in der Schleife nur die Temp-Variable einlese und nach der Schleife alles per Block in der Anzeige aufrufe, dann dauert es bis zur Anzeige halt auch sehr lange.
Durch den Trace kann ich der Schleife ja beim Arbeiten Zusehen, das ist schon recht gemütlich...

Gruss,
Michael
 
Mit TIA WinCC Professional kenne ich mich nicht aus. Doch für mich sieht das sehr ungeschickt aus, daß Du die Variablenamen von jedem einzelnen Array-Member zusammenbastelst und einzeln aus der CPU lädst und wieder zu einem Array zusammenbastelst. Kann man da nicht das Array am Stück einlesen?
Kann das WinCC Professional V16 Rohdaten? Da könntest Du die Arrays am Stück aus der CPU ins WinCC RT einlesen.

Harald
 
Guten Morgen Zusammen,

danke erstmal für Eure Hinweise / Einwände.

Es ist so, dass es die Möglichkeit der Rohdaten auch bei WinCC Prof.. (Dürfen die das eigentlich guten Gewissens so nennen? Frage für einen Freund :ROFLMAO: ) auslesen kann, dann muss ich aber mit C-Scripten arbeiten. Leider habe ich im Moment nicht die Zeit mich da einzuarbeiten da es nächste Woche auf die IBN geht.

Siemens gibt ja in seinem FAQ zur Scripterstellung den Hinweis, Arrays auf lokale Daten zu kopieren, macht das selber aber mit einer Schleife über die Elemente, so wie ich es auch mache.
Das Schreiben eines Arrays geht dann aber als Block... muss man nicht verstehen...

Ich habe mal den Bildzyklus auf 250ms reduziert, da dieser versehentlich auf 2s stand im Bild wo ich meine Kurvenanzeige projektiert habe, allerdings bringt das auch nicht viel, die Kurve baut sich halt gemütlich auf.

Wir haben uns jetzt Entschieden das erstmal so zu lassen, da die gesamte Visualisierung in Professional eh träge ist im Vergleich zu einer Advanced Visualisierung....
Vielleicht habe ich Zeit mich anschließend mit C auseinander zu setzen und mal zu schauen ob es dann besser/schneller geht...

Gruss,
Michael
 
Zuviel Werbung?
-> Hier kostenlos registrieren
... ich möchte behaupten, dass dein Problem hier nicht die Programmiersprache sondern viel mehr das Verhalten des Controls ist - also wie es intern arbeitet und mit "Neuzugängen" umgeht ...
 
Zurück
Oben