TIA String - Array(S/-1200) in WinCC Advanced (KTP400) in VBS auslesen (Syntax)

Tommy89k

Level-2
Beiträge
23
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Morgen Kollegen,

ich benötige mal bitte eure Hilfe.
Ich stecke seit einigen Tagen vor ein Problem, wo ich leider nicht weiter komme.

Grundproblem:
Die im HMI eingegeben Variablen (durch Bediener) abspeichern und diese gespeicherten Werte, per Tastendruck, als Excel (auf USB-Stick im HMI) exportieren.

Meine Idee:
Die eingegebenen Werte (von HMI) werden als Array (of Struct) hintereinander, in einem DB abgespeichert.
Nun wird per Tastendruck ein VBS gestartet, welches auf den DB zugreift, und die dort gespeicherten Daten in eine Excelliste exportiert.

Das exportieren funktioniert auch ganz gut.

Nun zu meinem Hauptproblem:
Ich möchte in dem VBS dieses "Array of Struct" durchschleifen, nur leider weiß ich nicht wie die Syntax ist.



Hier ein Snippet aus dem Code:

[I]Sub WriteData(ByRef ts, ByRef k) Dim Index Index= CStr(k) ts.WriteLine("Datum; " & SmartTags("FB_Auftragsdaten_DB_Data [COLOR=rgb(250, 197, 28)]{"& Index &"}[/COLOR].Datum")& ";") ts.WriteLine("Uhrzeit; " & SmartTags("FB_Auftragsdaten_DB_Data [COLOR=rgb(250, 197, 28)]{("& Index &")}[/COLOR].Uhrzeit") & ";") ts.WriteLine("Auftragsnummer; " & SmartTags("FB_Auftragsdaten_DB_Data [COLOR=rgb(250, 197, 28)]{["& Index &"]}[/COLOR].Auftragsnummer") & ";") ts.WriteLine("Behälternummer; " & SmartTags("FB_Auftragsdaten_DB_Data{1}.Behälternummer") & ";") ts.WriteLine("Werkernummer; " & SmartTags("FB_Auftragsdaten_DB_Data{1}.Werkernummer") & ";") ts.WriteLine("i.O.; " & SmartTags("FB_Auftragsdaten_DB_Data{1}.i_O_")& ";") ts.WriteLine("n.i.O." & SmartTags("FB_Auftragsdaten_DB_Data{1}.n_i_O_")& ";") ts.WriteLine("Gesamt- i.O.; " & SmartTags("FB_Auftragsdaten_DB_Data{1}.i_O_ Gesamt") & ";") ts.WriteLine("Gesamt- n.i.O." & SmartTags("FB_Auftragsdaten_DB_Data{1}.n_i_O_ Gesamt") & ";") End Sub [I][/I][/I]

Wenn ich die Variablen ohne die "Index" aufrufe, also Statisch (z.B. "{1}" ) funktioniert es.
Dann werden die Werte in die Excel geschrieben.
Mit der "Index" - Variable wird gar nichts geschrieben, ich vermute mal, der Compiler erkennt die Variable nicht.

Aber ich möchte diese mit einer "Index" -Variable durchschleifen, um mir Schreibarbeit zu ersparen.
Ich habe auch schon sämtliche Varianten aus dem Internet probiert.

Nun zu meiner Frage:
Funktioniert das Überhaupt mit einer "Index-Variable", wenn ja was mache ich dann hier falsch?

Im Anhang noch n paar Screenshots.

Vielen Dank schon mal im Voraus!

Gruß Tommy
 

Anhänge

  • DB-Struct.PNG
    DB-Struct.PNG
    58 KB · Aufrufe: 18
  • Script.PNG
    Script.PNG
    112 KB · Aufrufe: 21
  1. Du schreibst keine Excel-Datei sondern eine csv-Datei. Wenn man die korrekten Fachbegriffe in der Forums-Suche verwendet, dann werden auch die richtigen hilfreichen Beiträge gefunden.
  2. Dein Problem wurde schon zig-mal erörtert. Verwende die Forumssuche mit dem Suchbegriff GetDataRecordTagsFromPLC und schau in diese FAQ Protool/WinCCflex/TIA Daten lesen / schreiben mit VB-Script
  3. auf Arrays greift man so zu:
    SmartTags("MeineHMIVariable")(index)
    Geht aber nur, wenn die HMI-Variable auch wirklich als Array projektiert ist. Achtung: jeder Zugriff auf ein Array löst das Lesen oder Schreiben des gesamten Arrays aus.
  4. versucht man den Name einer HMI-Variable im Skript zusammenzubasteln, dann weiß die WinCC RT nichts von der Verwendung dieser Variable und man erhält meistens nicht den aktuellen Wert der Variable.
  5. mache in ein Bild eine Meldeanzeige für Meldeereignisse der Meldeklasse System, damit Du die Runtime-Fehlermeldungen sehen kannst, wo Dein Skript abschmiert. Für's Debuggen sind Testausgaben mit ShowSystemAlarm möglich.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Harald,

1. Danke erstmal für die Rückmeldung, natürlich meinte ich eine csv-Datei:).

2. Danke für den Link

3. Thema Array:
Leider hat dies nicht so funktioniert da der Compiler die Syntax:
smartTags("Struct{index1}.Variable")(index2)
nicht anerkennt, da ich ja auf die "Einzelvariable" in dem Struct zugreifen möchte.

Wenn ich aber die Variable statisch aufrufe, also:

smartTags("Struct{1}.Variable")
smartTags("Struct{2}.Variable")
.
.
funktioniert dies.

Da ich aber ein Speicher von 1000 Structs habe, möchte ich aber auch nur die Struct in eine csv exportieren, in der ich auch Werte beinhalten (dynamisch über ein index durchschleifen).
Ich möchte nicht alle 1000 exportieren, nur die ersten 10 Structs beschrieben wurden.

4. klingt logisch

5. Der Script wird ohne Probleme ausgeführt.

Ich habe es in nun doch anders gelöst:

Im HMI betätige ich den Export-Button, der einen While-Schleife aufruft.
In dieser While-Schleife passiert folgendes:

HMI fordert Daten an, SPS meldet daten übergeben.
HMI erhöht PLC-Index-Variable um 1 und "wartet" bis SPS dies geschnackelt hat (wegen Aktualiserungszeit) und forder erneut von der SPS die Daten an.

Ist zwar unsauber und es dauert aber funktioniert und dem Kunde reicht das so aus.
Das HMI hat keine weitere Aufgabe, als den aktuellen Datensatz an zu zeigen und per Tastendruck zu exportieren.

Hier der Code-Snippet:
SPS:

IF "HMI_COM"."FileTrans_HMI->PLC" = true THEN // Transfer beginnen (von HMI) "HMI_COM"."FileTrans_PLC->HMI" := true; // Transfer begonnen (an HMI) #Q_Archiv := #Data["HMI_COM".Index]; // Indizierte Daten "HMI_COM".Sequenz := "HMI_COM".Index; // "Zyklusssynchronisation" "HMI_COM"."FileTrans_HMI->PLC" := FALSE; // Transfer abgeschlossen END_IF;

HMI:

SmartTags("HMI_COM_Index")=1 tmp = 1 While SmartTags("HMI_COM_Index") <= SmartTags("FB_Auftragsdaten_DB_Index") ' Neue Daten vorhanden SmartTags("HMI_COM_FileTrans_HMI->PLC")= True 'Kommunikation zur SPS starten If SmartTags("HMI_COM_FileTrans_PLC->HMI") = True And SmartTags("HMI_COM_Sequenz") = SmartTags("HMI_COM_Index") Then' WriteData ts,i 'Write SmartTags("HMI_COM_Index")=SmartTags("HMI_COM_Index")+1 End If Wend


Die Variante mit GetDataRecordTagsFromPLC versuche ich auch noch.
 
Zurück
Oben