WinCC String in VB-Skript verwenden

ismailocak

Level-2
Beiträge
12
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich habe ein Skript mit folgende Funktion. Es soll in einem Ordnerpfad eine CSV-Datei erstellt werden (Funktion wird ausgeführt). Die Dateiname (Bauteil_ID) wird im Skript geschrieben (es wird dafür ein String von einer DB ausgelesen. Funktion wird ausgeführt). Überschriftzeilen in der Datei werden erstellt. Die Tabelle wird beim ausführen des Skripts befüllt. Alle Variablenwerte in REAL und BYTE werden in die Tabelle zugeordnet. Die Variablen in CHAR und String werden nicht in die Tabelle eingetragen. Sogar eintragen des Zeitstempel's funktioniert. Warum werden die String und Char nicht in die Tabelle eingetragen? Bin für jede Hilfe dankbar.
Mein Skript:



Code:
Sub MEAS_DATA_CSV_EXPORT_1(ByVal Folder_Path)

Dim Object_Way, Object_Write, i, File_name, j


HMIRuntime.Trace("Messdaten abspeichern gestartet" & vbCrLf)
 
''''''''''''Ordner erstellen''''''''''''
Set Object_Way = CreateObject("Scripting.FileSystemObject" )'Zugriff auf PC Ordnersystem
 
If Not Object_Way.FolderExists(Folder_Path) Then 'Erstellt Ordner in Zielpfad
    Object_Way.CreateFolder Folder_Path
    HMIRuntime.Trace("Ordner erstellt" & vbCrLf)
End If

''''''''''''Datei erstellen'''''''''''''

File_name = SmartTags("MEAS_DATA_DB.MEASURES.ARCHIVE[0].BT_ID").Value & ".csv"

If Not Object_Way.FileExists(Folder_Path & "\" & File_name) Then
    Object_Way.CreateTextFile(Folder_Path & "\" & File_name)'Erstelle Datei in Zielpfad; Dateiendung ist in File_Name enthalten
    HMIRuntime.Trace("Datei erstellt" & vbCrLf)
End If
 
 
''''''''''''Typen eintragen''''''''''''
Set Object_Write = Object_Way.OpenTextFile(Folder_Path & "\" & File_name,8) '8 bedeutet an der letzten Stelle schreiben
 
 ' Überschriftszeile
    Object_Write.WriteLine("TEST_STEP_NUMBER ; TEST_METHOD_NUMBER ; TEST_STATUS ; RESULT ; ERROR_CODE ; TEST_TIME ; SET_POINT ; ACTUAL_VALUE ; MAX_LIMIT ; MIN_LIMIT ;  UNIT ; CONDITION ; ACT_CONDITION ; MAX_CONDITION ; MIN_CONDITION ; UNIT_CONDITION ; TEST_STEP_NAME; TIMESTAMP ; BAUTEIL_ID" )
     Object_Write.Write(vbCrLf)


Dim TEST_STEP_NUMBER , TEST_METHOD_NUMBER , TEST_STATUS , RESULT , ERROR_CODE , TEST_TIME , SET_POINT , ACTUAL_VALUE , MAX_LIMIT , MIN_LIMIT ,  UNIT , CONDITION , ACT_CONDITION , MAX_CONDITION , MIN_CONDITION , UNIT_CONDITION , TEST_STEP_NAME, TIMESTAMP, BAUTEIL_ID
  
 ' Schleife für alle Messreihen eines Moduls

For i = 0 To 39
      
            TEST_STEP_NUMBER     = SmartTags("MEAS_DATA_DB.MEASURES.ARCHIVE[0].CELLROW["& i & "].DATA.TEST_STEP_NUMBER").Value
            TEST_METHOD_NUMBER    = SmartTags("MEAS_DATA_DB.MEASURES.ARCHIVE[0].CELLROW["& i & "].DATA.TEST_METHOD_NUMBER").Value
            TEST_STATUS            = SmartTags("MEAS_DATA_DB.MEASURES.ARCHIVE[0].CELLROW["& i & "].DATA.TEST_STATUS").Value
            RESULT                = SmartTags("MEAS_DATA_DB.MEASURES.ARCHIVE[0].CELLROW["& i & "].DATA.RESULT").Value
            ERROR_CODE            = SmartTags("MEAS_DATA_DB.MEASURES.ARCHIVE[0].CELLROW["& i & "].DATA.ERROR_CODE").Value
            TEST_TIME            = SmartTags("MEAS_DATA_DB.MEASURES.ARCHIVE[0].CELLROW["& i & "].DATA.TEST_TIME").Value
            SET_POINT            = SmartTags("MEAS_DATA_DB.MEASURES.ARCHIVE[0].CELLROW["& i & "].DATA.SET_POINT").Value
            ACTUAL_VALUE        = SmartTags("MEAS_DATA_DB.MEASURES.ARCHIVE[0].CELLROW["& i & "].DATA.ACTUAL_VALUE").Value
            MAX_LIMIT            = SmartTags("MEAS_DATA_DB.MEASURES.ARCHIVE[0].CELLROW["& i & "].DATA.MAX_LIMIT").Value
            MIN_LIMIT            = SmartTags("MEAS_DATA_DB.MEASURES.ARCHIVE[0].CELLROW["& i & "].DATA.MIN_LIMIT").Value
          
            UNIT                = SmartTags("MEAS_DATA_DB.MEASURES.ARCHIVE[0].CELLROW["& i & "].DATA.UNIT[0]").Value &_
                                  SmartTags("MEAS_DATA_DB.MEASURES.ARCHIVE[0].CELLROW["& i & "].DATA.UNIT[1]").Value &_
                                  SmartTags("MEAS_DATA_DB.MEASURES.ARCHIVE[0].CELLROW["& i & "].DATA.UNIT[2]").Value &_
                                  SmartTags("MEAS_DATA_DB.MEASURES.ARCHIVE[0].CELLROW["& i & "].DATA.UNIT[3]").Value
                      
            CONDITION            = SmartTags("MEAS_DATA_DB.MEASURES.ARCHIVE[0].CELLROW["& i & "].DATA.CONDITION").Value
            ACT_CONDITION        = SmartTags("MEAS_DATA_DB.MEASURES.ARCHIVE[0].CELLROW["& i & "].DATA.ACT_CONDITION").Value
            MAX_CONDITION        = SmartTags("MEAS_DATA_DB.MEASURES.ARCHIVE[0].CELLROW["& i & "].DATA.MAX_CONDITION").Value
            MIN_CONDITION        = SmartTags("MEAS_DATA_DB.MEASURES.ARCHIVE[0].CELLROW["& i & "].DATA.MIN_CONDITION").Value
          
            UNIT_CONDITION        = SmartTags("MEAS_DATA_DB.MEASURES.ARCHIVE[0].CELLROW["& i & "].DATA.UNIT_CONDITION[0]").Value &_
                                  SmartTags("MEAS_DATA_DB.MEASURES.ARCHIVE[0].CELLROW["& i & "].DATA.UNIT_CONDITION[1]").Value &_
                                  SmartTags("MEAS_DATA_DB.MEASURES.ARCHIVE[0].CELLROW["& i & "].DATA.UNIT_CONDITION[2]").Value &_
                                  SmartTags("MEAS_DATA_DB.MEASURES.ARCHIVE[0].CELLROW["& i & "].DATA.UNIT_CONDITION[3]").Value
            TIMESTAMP             = SmartTags("MEAS_DATA_DB.MEASURES.ARCHIVE[0].CELLROW["& i & "].TIMESTAMP").Value
            BAUTEIL_ID            = SmartTags("MEAS_DATA_DB.MEASURES.ARCHIVE[0].CELLROW["& i & "].BAUTEIL_ID").Value

          
            For j = 0 To 39
          
                TEST_STEP_NAME        = TEST_STEP_NAME & SmartTags("MEAS_DATA_DB.MEASURES.ARCHIVE[0].CELLROW["& i &"].DATA.TEST_STEP_NAME[& j &]").Value
          
             Next
          
          
            ' Werte für Messreihe schreiben
            Object_Write.WriteLine(TEST_STEP_NUMBER & ";" & TEST_METHOD_NUMBER & ";" & TEST_STATUS & ";" & RESULT & ";" & ERROR_CODE & ";" & TEST_TIME & ";" & SET_POINT & ";" & ACTUAL_VALUE & ";" & MAX_LIMIT & ";" & MIN_LIMIT & ";" &  UNIT & ";" & CONDITION & ";" & ACT_CONDITION & ";" & MAX_CONDITION & ";" & MIN_CONDITION & ";" & UNIT_CONDITION & ";" & TEST_STEP_NAME & ";" & TIMESTAMP & ";" & BAUTEIL_ID)

        HMIRuntime.Trace("Messreihe " & i & " geschrieben" & vbCrLf)   

        Object_Write.Write(vbCrLf)

Next
 

''''''''''''Vorgang beendet''''''''''''
Object_Write.Close
Set Object_Way = Nothing
Set Object_Write = Nothing
HMIRuntime.Trace("Daten abspeichern beendet" & vbCrLf)   

End Sub
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Ab hier gehört nicht mehr zum Skript. Haber nur raus kopiert um meine Fehler zu darstellen.
BAUTEIL_ID = SmartTags("MEAS_DATA_DB.MEASURES.ARCHIVE[0].CELLROW["& i & "].BAUTEIL_ID").Value (ist mein String die nicht in die CSV-Datei geschrieben wird)

For j = 0 To 39
TEST_STEP_NAME = TEST_STEP_NAME & SmartTags("MEAS_DATA_DB.MEASURES.ARCHIVE[0].CELLROW["& i &"].DATA.TEST_STEP_NAME[& j &]").Value
Next
UNIT = SmartTags("MEAS_DATA_DB.MEASURES.ARCHIVE[0].CELLROW["& i & "].DATA.UNIT[0]").Value &_
SmartTags("MEAS_DATA_DB.MEASURES.ARCHIVE[0].CELLROW["& i & "].DATA.UNIT[1]").Value &_
SmartTags("MEAS_DATA_DB.MEASURES.ARCHIVE[0].CELLROW["& i & "].DATA.UNIT[2]").Value &_
SmartTags("MEAS_DATA_DB.MEASURES.ARCHIVE[0].CELLROW["& i & "].DATA.UNIT[3]").Value
UNIT_CONDITION = SmartTags("MEAS_DATA_DB.MEASURES.ARCHIVE[0].CELLROW["& i & "].DATA.UNIT_CONDITION[0]").Value &_
SmartTags("MEAS_DATA_DB.MEASURES.ARCHIVE[0].CELLROW["& i & "].DATA.UNIT_CONDITION[1]").Value &_
SmartTags("MEAS_DATA_DB.MEASURES.ARCHIVE[0].CELLROW["& i & "].DATA.UNIT_CONDITION[2]").Value &_
SmartTags("MEAS_DATA_DB.MEASURES.ARCHIVE[0].CELLROW["& i & "].DATA.UNIT_CONDITION[3]").Value
(das sind die Char-Variablen die nicht in die Tabelle eingetragen werden)



mein DB:
1713891494796.png

mein csv-datei:
1713891678646.png
 
Zuletzt bearbeitet:
Zuerst: poste Code bitte in Code-Tags, dann wird er viel besser lesbar. Du kannst deinen Beitrag auch noch nachträglich bearbeiten.
Tag_Code.png

2. Was für eine WinCC Version verwendest du? Auf welchem HMI-Gerät?
3. Du hast ein End Sub im Code stehen, der Code darunter wird dann nicht mehr ausgeführt.
4. Wenn Variablen-Werte nicht oder falsche Werte in der Datei landen, dann kann es daran liegen, dass die Werte noch gar nicht aus der SPS gelesen wurden, wenn im Skript auf die Variable zugegriffen wird. Strings können dann z.B. noch leer sein. Je nach WinCC Runtime muss man ggf. ein Handshake mit der SPS programmieren, um sicherzustellen, dass aktualisierte Werte in die Datei geschrieben werden.
5. Bei (vermeintlichen?) Problemen mit dem Inhalt von csv-Dateien öffne die Datei nicht mit Excel, sondern mit einem normalen Texteditor (z.B. Notepad). Da kannst du sehen, was wirklich in der Datei steht.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Zuerst: poste Code bitte in Code-Tags, dann wird er viel besser lesbar. Du kannst deinen Beitrag auch noch nachträglich bearbeiten.
Anhang anzeigen 77600

2. Was für eine WinCC Version verwendest du? Auf welchem HMI-Gerät?
3. Du hast ein End Sub im Code stehen, der Code darunter wird dann nicht mehr ausgeführt.
4. Wenn Variablen-Werte nicht oder falsche Werte in der Datei landen, dann kann es daran liegen, dass die Werte noch gar nicht aus der SPS gelesen wurden, wenn im Skript auf die Variable zugegriffen wird. Strings können dann z.B. noch leer sein. Je nach WinCC Runtime muss man ggf. ein Handshake mit der SPS programmieren, um sicherzustellen, dass aktualisierte Werte in die Datei geschrieben werden.
5. Bei (vermeintlichen?) Problemen mit dem Inhalt von csv-Dateien öffne die Datei nicht mit Excel, sondern mit einem normalen Texteditor (z.B. Notepad). Da kannst du sehen, was wirklich in der Datei steht.
Danke für den Hinweis.
2. ich benutze WinCC RT Professional auf HMI_RT_Multi_Panel
3. die Codes darunter sind nicht mehr im Skript sondern nur zur Darstellung mein Anliegen
4. die Werte werden vom Archiv ausgelesen die sind im selben DB wie Aktual-Werte (werde den Skript mit einer Zeitverzögerung auslösen um das auszuschließen)
5. Im Notepad fehlen die Werte ebenso.

Vielen Dank für deine Unterstützung
 
.ich benutze WinCC RT Professional auf HMI_RT_Multi_Panel
mit WinCC RT Professional kenne ich mich nicht aus, und wie/wann Variablen da aktualisiert werden

4. die Werte werden vom Archiv ausgelesen die sind im selben DB wie Aktual-Werte (werde den Skript mit einer Zeitverzögerung auslösen um das auszuschließen)
Was meinst du mit "Archiv"?
Was meinst du mit "Zeitverzögerung"?

Erhältst du irgendwelche Fehlermeldungen? Wird das Skript bis zum Ende ausgeführt oder vielleicht vorher abgebrochen?
Lass dir mal die Werte der String-Variablen im Skript ausgeben und die zusammengebastelten Variablennamen, vielleicht werden die Namen falsch zusammengebastelt.
 
Lass dir mal die Werte der String-Variablen im Skript ausgeben und die zusammengebastelten Variablennamen, vielleicht werden die Namen falsch zusammengebastelt.
Guter Ansatz !!!
Ganz oft wird bei der implizierten Int_to_String-Konvertierung, aber auch beim Einsatz von Str, vorne ein Leerzeichen mit angehängt. Aus z.B. 1 als Wert wird dann " 1" ... Das wird dann für die Variable nicht passen ...
 
Zeile 71 ist falsch formuliert, da fehlen 2 Anführungszeichen beim Basteln mit dem Index j
TEST_STEP_NAME = TEST_STEP_NAME & SmartTags("MEAS_DATA_DB.MEASURES.ARCHIVE[0].CELLROW["& i &"].DATA.TEST_STEP_NAME[& j &]").Value

Wie ist TEST_STEP_NAME als HMI-Variable deklariert?

Im DB: TEST_STEP_NAME : Array[1..40] of Char
Im Skript wird (...).TEST_STEP_NAME[..] aber mit Indizes 0..39 verwendet. Das lässt micht vermuten, dass du die HMI-Variable als Array deklariert hast.
Ich weiß nicht, ob das WinCC Professional überhaupt Arrays von Strukturen mit Unter-Arrays kann.
Außerdem werden Arrays in VBS anders adressiert: SmartTags("MyArrayHMIvariable")(index)

Vermutlich müsstest du die HMI-Variable nicht als Array sondern als 40 (oder mehr) einzelne HMI-Variablen deklarieren.
Wobei auch dann für mich noch nicht sicher ist, ob die Variablen vor oder beim Zugriff im Skript aktualisiert werden oder erst danach. Möglicherweise müsstest du mit Rezepturen arbeiten?
 
Erhältst du irgendwelche Fehlermeldungen? Wird das Skript bis zum Ende ausgeführt oder vielleicht vorher abgebrochen?
Lass dir mal die Werte der String-Variablen im Skript ausgeben und die zusammengebastelten Variablennamen, vielleicht werden die Namen falsch zusammengebastelt.
Die Test Plan Name hab ich jetzt vom Skript entfernt.
Ich bekomme an der Stellen (Unit, Unit Condition und Bauteil_Id) im SKript Diagnose folgende Fehlermeldung: HMISmartTag: Unknown Smarttag
Skript wird bis zum Ende durchgeführt (alle 40 Messreihen).

Zeile 71 ist falsch formuliert, da fehlen 2 Anführungszeichen beim Basteln mit dem Index j
TEST_STEP_NAME = TEST_STEP_NAME & SmartTags("MEAS_DATA_DB.MEASURES.ARCHIVE[0].CELLROW["& i &"].DATA.TEST_STEP_NAME[& j &]").Value

Wie ist TEST_STEP_NAME als HMI-Variable deklariert?

Im DB: TEST_STEP_NAME : Array[1..40] of Char
Im Skript wird (...).TEST_STEP_NAME[..] aber mit Indizes 0..39 verwendet. Das lässt micht vermuten, dass du die HMI-Variable als Array deklariert hast.
Ich weiß nicht, ob das WinCC Professional überhaupt Arrays von Strukturen mit Unter-Arrays kann.
Außerdem werden Arrays in VBS anders adressiert: SmartTags("MyArrayHMIvariable")(index)

Vermutlich müsstest du die HMI-Variable nicht als Array sondern als 40 (oder mehr) einzelne HMI-Variablen deklarieren.
Wobei auch dann für mich noch nicht sicher ist, ob die Variablen vor oder beim Zugriff im Skript aktualisiert werden oder erst danach. Möglicherweise müsstest du mit Rezepturen arbeiten?
Die TEST_STEP_NAME hab ich von meiner Skript entfernt. Das war eine Array [40] in Char. Skript kennt die Unit,Unit_Condition und Bauteil_ID nicht (Unknown Smarttag). Müssen die anders deklariert werden?
 
Skript kennt die Unit,Unit_Condition und Bauteil_ID nicht (Unknown Smarttag). Müssen die anders deklariert werden?
Kannst du die Variablen denn in gleicher Weise an irgendwelche Bildelemente anbinden und bekommst dort dann den Wert angezeigt ?
Das solltest du mal als Allererstes ausprobieren ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Kannst du die Variablen denn in gleicher Weise an irgendwelche Bildelemente anbinden und bekommst dort dann den Wert angezeigt ?
Das solltest du mal als Allererstes ausprobieren ...
Die Variablen Unit, Unit_Condition (Array of Char) kann ich im Bild Variable nicht verwenden (Übersetzungsfehler). Bei dem Bauteil_ID (String) konnte ich den Fehler finden (Häckchen Erreichbar aus HMI war nicht gesetzt)
1713991109732.png
 
Wenn du sie nicht an ein Bildelement anbindn kannst dann wird es im Script auch nicht funktionieren. Siehe dazu :

Vermutlich müsstest du die HMI-Variable nicht als Array sondern als 40 (oder mehr) einzelne HMI-Variablen deklarieren.
Wobei auch dann für mich noch nicht sicher ist, ob die Variablen vor oder beim Zugriff im Skript aktualisiert werden oder erst danach. Möglicherweise müsstest du mit Rezepturen arbeiten?
 
Zurück
Oben