WinCC WinCC TIA V17 .csv auslesen

MaxPower

Level-1
Beiträge
18
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich suche eine Lösung für Folgendes Problem:
Ich möchte über ein VB-Script eine .csv auslesen.
Als Grundgerüst habe ich ein Beispiel genommen siehe Anhang.
Soweit so gut funktionier alles schön wie es soll.
Jetzt möchte ich jedoch das auslesen der Zeile von einer Variable abhängig machen,
habe schon mehrere Versuche gemacht "j" als Variable zu definieren
Jedoch reagiert das Script dann nicht mehr
Hier mein Script wo kann ich anpacken, dass die Zeile aus der die 10 Spalten gelesen werden von einer Variable abhängig ist.

Und ja die Err...... sind noch nicht sauber gemacht, das kommt wenn das Script so funktioniert wie ich mir das vorstelle
 

Anhänge

  • VB-Script-Störungshilfe.png
    VB-Script-Störungshilfe.png
    44,5 KB · Aufrufe: 38
habe schon mehrere Versuche gemacht "j" als Variable zu definieren
j ist doch eine Variable ???

Jedoch reagiert das Script dann nicht mehr
Erhältst Du eine Runtimefehler-Meldung? Mache eine Meldeanzeige in ein Bild, was (auch) Meldungen der Meldeklasse "System" anzeigt, damit Du die Meldungen sehen und lesen kannst.
Deaktiviere mal testweise das On Error Resume Next
Mache in das Skript testweise Debug-Ausgaben mit ShowSystemAlarm

wo kann ich anpacken, dass die Zeile aus der die 10 Spalten gelesen werden von einer Variable abhängig ist.
Von welcher Variable abhängig? Willst Du die Zeilennummer als Aufrufparameter an das Skript übergeben oder aus einer SmartTags lesen?
Warum übernimmst Du nie den ersten Wert vor dem ersten ";" aus der csv-Zeile (aus Field(0) )? Sondern nur den 2. bis 11. ?
Du willst nur eine bestimmte Zeile aus der csv-Datei lesen? Das könnte etwa so funktionieren:
Code:
gewuenschte_Zeile = 3
j = 1

Do While Not f.AtEndOfStream

  MyZf = f.ReadLine

  If j = gewuenschte_Zeile Then
    field = Split(MyZf, ";")
    If UBound(field) >= 10 Then
      SmartTags(...) = Field(1)
      ...
      SmartTags(...) = Field(10)
      Exit Do

    End If
  End If
  j = j + 1
Loop

PS: Tip: Wenn Du in Zukunft wieder mal möchtest, das jemand Deinen Code testet/korrigiert/verbessert, dann kopiere den Code als Text hier in einen Beitrag und nicht als Bild. Nicht jeder der helfen könnte, hat auch Lust den Code von Deinem Bild abzutippen ...

Harald
 
Danke Harald,
hier als erstes mein Code

Dim fsO, f, ts, Path, field, MyZf, i, j, HiField(5000,10)
i=0
j=0
Path = "c:\Siemens\Stoerungshilfe.csv"
On Error Resume Next
Set fso = CreateObject("Scripting.FileSystemObject")
If Err.Number <> 0 Then
Err.Clear
Exit Sub
End If
Set f = fsO.OpenTextFile(Path, 1, 0, -2)
If Err.Number <> 0 Then
Err.Clear
Exit Sub
End If
Do While f.AtEndOfStream <> True
MyZf = f.ReadLine
field = Split(MyZf, ";")
For i=1 To 10
HiField(j, i) = field(i)
Next
SmartTags("Stoerungshilfe_Ursache_1") = HiField(1,1)
SmartTags("Stoerungshilfe_Ursache_2") = HiField(1,2)
SmartTags("Stoerungshilfe_Ursache_3") = HiField(1,3)
SmartTags("Stoerungshilfe_Ursache_4") = HiField(1,4)
SmartTags("Stoerungshilfe_Ursache_5") = HiField(1,5)
SmartTags("Stoerungshilfe_Loesung_1") = HiField(1,6)
SmartTags("Stoerungshilfe_Loesung_2") = HiField(1,7)
SmartTags("Stoerungshilfe_Loesung_3") = HiField(1,8)
SmartTags("Stoerungshilfe_Loesung_4") = HiField(1,9)
SmartTags("Stoerungshilfe_Loesung_5") = HiField(1,10)
j = j + 1
Loop
f.Close
Set f = Nothing
Set fso = Nothing

Wie gesagt das Skript an sich funktioniert,
ich hab nur keinen Plan wegen der Abhängigkeit von der Variable

Was du mir oben empfohlen hast sieht auf den ersten Blick Eindimensional aus, stimmt das? Ich brauch aber eine 2 Dimensionale Abfrage
Ja die Zeile aus der das Skript die 10 Spalten Laden soll, soll Quasi über eine Art "ID" vom "Bediener" festgelegt werden
Idee:
Es kommt eine Fehlermeldung die hat eine ID
Diese ID gibt er in ein EA Feld, angebunden an eine Variable des Typs REAL
Nun Drückt er Enter das Skript wird ausgeführt lädt aber vorher die definierte Variable
damit eben die 10 Spalten aus der richtigen Zeile geladen werden in meinem Beispeil lädt das Skript ja einfach Stumpf die eine Zeile

fG Max und vielen Dank im vorraus
 
Zuviel Werbung?
-> Hier kostenlos registrieren
dann kopiere den Code als Text hier in einen Beitrag
hier als erstes mein Code
und benutze dafür den CODE-TAG:
1677075414812.png

Dann sieht das so aus:
Code:
Dim fsO, f, ts, Path, field, MyZf, i, j, HiField(5000,10)
i=0
j=0
Path = "c:\Siemens\Stoerungshilfe.csv"
On Error Resume Next
Set fso = CreateObject("Scripting.FileSystemObject")
If Err.Number <> 0 Then
Err.Clear
Exit Sub
End If
Set f = fsO.OpenTextFile(Path, 1, 0, -2)
If Err.Number <> 0 Then
Err.Clear
Exit Sub
End If
Do While f.AtEndOfStream <> True
MyZf = f.ReadLine
field = Split(MyZf, ";")
For i=1 To 10
HiField(j, i) = field(i)
Next
SmartTags("Stoerungshilfe_Ursache_1") = HiField(1,1)
SmartTags("Stoerungshilfe_Ursache_2") = HiField(1,2)
SmartTags("Stoerungshilfe_Ursache_3") = HiField(1,3)
SmartTags("Stoerungshilfe_Ursache_4") = HiField(1,4)
SmartTags("Stoerungshilfe_Ursache_5") = HiField(1,5)
SmartTags("Stoerungshilfe_Loesung_1") = HiField(1,6)
SmartTags("Stoerungshilfe_Loesung_2") = HiField(1,7)
SmartTags("Stoerungshilfe_Loesung_3") = HiField(1,8)
SmartTags("Stoerungshilfe_Loesung_4") = HiField(1,9)
SmartTags("Stoerungshilfe_Loesung_5") = HiField(1,10)
j = j + 1
Loop
f.Close
Set f = Nothing
Set fso = Nothing
 
Code:
Dim fso, f, ts, Path, field, MyZf, i, j, HiField(5000,10)
i=0
j=0
Path = "c:\Siemens\Stoerungshilfe.csv"
On Error Resume Next
Set fso = CreateObject("Scripting.FileSystemObject")
If Err.Number <> 0 Then
    Err.Clear
    Exit Sub
    End If
    Set f = fso.OpenTextFile(Path, 1, 0, -2)
    If Err.Number <> 0 Then
    Err.Clear
    Exit Sub
    End If
    Do While f.AtEndOfStream <> True
    MyZf = f.ReadLine
    field = Split(MyZf, ";")
    For i=1 To 10
    HiField(j, i) = field(i)
    Next
    SmartTags("Stoerungshilfe_Ursache_1") = HiField(1,1)
    SmartTags("Stoerungshilfe_Ursache_2") = HiField(1,2)
    SmartTags("Stoerungshilfe_Ursache_3") = HiField(1,3)
    SmartTags("Stoerungshilfe_Ursache_4") = HiField(1,4)
    SmartTags("Stoerungshilfe_Ursache_5") = HiField(1,5)
    SmartTags("Stoerungshilfe_Loesung_1") = HiField(1,6)
    SmartTags("Stoerungshilfe_Loesung_2") = HiField(1,7)
    SmartTags("Stoerungshilfe_Loesung_3") = HiField(1,8)
    SmartTags("Stoerungshilfe_Loesung_4") = HiField(1,9)
    SmartTags("Stoerungshilfe_Loesung_5") = HiField(1,10)
    j = j + 1
    Loop
    f.Close
    Set f = Nothing
    Set fso = Nothing
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Was du mir oben empfohlen hast sieht auf den ersten Blick Eindimensional aus, stimmt das? Ich brauch aber eine 2 Dimensionale Abfrage
Warum? Du brauchst doch nur die Werte aus einer Zeile und nicht aus allen Zeilen. Dafür braucht man keine 2 Dimensionen. Die unbenötigten Zeilen musst Du doch nicht speichern.

damit eben die 10 Spalten aus der richtigen Zeile geladen werden
Was ist "die richtige Zeile"? Ist die Zeilennummer vor Aufruf des Skriptes bekannt oder muß in der csv-Datei die Zeile gesucht werden, wo in einem Wert (dem ersten?) eine bestimmte ID steht? Ist das die ID die der Bediener in eine HMI-Variable eingibt?

Warum ist die ID vom Datentyp REAL?

Harald
 
Zwei Dimensional,
eben lade Zeile und dann Lade 10 Spalten, die einzelnen Spalten "Smarttags" lade ich dann hier rein
1677076498102.png
die Variablen hinter den Smarttags sind vom Typ String da hier in der .csv ein Text drin steht

gerne nehme ich auch einen komplett anderen Lösungsansatz
 
Warum? Du brauchst doch nur die Werte aus einer Zeile und nicht aus allen Zeilen. Dafür braucht man keine 2 Dimensionen. Die unbenötigten Zeilen musst Du doch nicht speichern.


Was ist "die richtige Zeile"? Ist die Zeilennummer vor Aufruf des Skriptes bekannt oder muß in der csv-Datei die Zeile gesucht werden, wo in einem Wert (dem ersten?) eine bestimmte ID steht? Ist das die ID die der Bediener in eine HMI-Variable eingibt?

Warum ist die ID vom Datentyp REAL?

Harald
Warum nicht ist Int besser?
Er muss in der .csv die richtige Zeile benutzen
Also ja das Skript muss er erstmal "anfahren"
ja mit Eingabe der ID der Fehlermeldung ist die Zeile bekannt da ID=Zeile
 
Nein, nicht nötig.

Aha, also steckt die ID im ersten Wert der Zeile (im Field(0) nach dem Split).
Die ID ist immer eine ganze Zahl? ---> nimm Int
Die ID ist immer die Zeilennummer? ---> dann kann man die Zeilen abzählen (und die ID auch weglassen)
Die ID kann Lücken haben und/oder die Zeilen sind nicht nach ID sortiert, also 1 2 3 4 7 10 11 12 20 21 22 ...? Dann muß die Zeile gesucht werden, die die gesuchte ID im ersten Feld enthält, und nur die Werte dieser Zeile werden in die HMI-Variablen für das Bild kopiert. Danach kann die Suche abgebrochen werden. Fertig.
Sieht dann etwa so aus (ungetestet):
Code:
Do While Not f.AtEndOfStream

  MyZf = f.ReadLine

  field = Split(MyZf, ";")
  If UBound(field) >= 10 Then

    If field(0) = SmartTags("Stoerungshilfe_ID") Then 'Zeile mit der ID gefunden, Werte übernehmen

      SmartTags("Stoerungshilfe_Ursache_1") = field(1)
      SmartTags("Stoerungshilfe_Ursache_2") = field(2)
      SmartTags("Stoerungshilfe_Ursache_3") = field(3)
      SmartTags("Stoerungshilfe_Ursache_4") = field(4)
      SmartTags("Stoerungshilfe_Ursache_5") = field(5)
      SmartTags("Stoerungshilfe_Loesung_1") = field(6)
      SmartTags("Stoerungshilfe_Loesung_2") = field(7)
      SmartTags("Stoerungshilfe_Loesung_3") = field(8)
      SmartTags("Stoerungshilfe_Loesung_4") = field(9)
      SmartTags("Stoerungshilfe_Loesung_5") = field(10)
      Exit Do 'Zeile wurde gefunden und übernommen, Suche beenden

    End If
  End If
Loop
Die Variablen i, j, HiField werden nicht benötigt.

Harald
 
Zuletzt bearbeitet:
Nein, nicht nötig.

Aha, also steckt die ID im ersten Wert der Zeile (im Field(0) nach dem Split).
Die ID ist immer eine ganze Zahl? ---> nimm Int
Die ID ist immer die Zeilennummer? ---> dann kann man die Zeilen abzählen (und die ID auch weglassen)
Die ID kann Lücken haben und/oder die Zeilen sind nicht nach ID sortiert, also 1 2 3 4 7 10 11 12 20 21 22 ...? Dann muß die Zeile gesucht werden, die die gesuchte ID im ersten Feld enthält, und nur die Werte dieser Zeile werden in die HMI-Variablen für das Bild kopiert. Danach kann die Suche abgebrochen werden. Fertig.
Sieht dann etwa so aus (ungetestet):
Code:
Do While Not f.AtEndOfStream

  MyZf = f.ReadLine

  field = Split(MyZf, ";")
  If UBound(field) >= 10 Then

    If field(0) = SmartTags("Stoerungshilfe_ID") Then 'Zeile mit der ID gefunden, Werte übernehmen

      SmartTags("Stoerungshilfe_Ursache_1") = Field(1)
      SmartTags("Stoerungshilfe_Ursache_2") = Field(2)
      SmartTags("Stoerungshilfe_Ursache_3") = Field(3)
      SmartTags("Stoerungshilfe_Ursache_4") = Field(4)
      SmartTags("Stoerungshilfe_Ursache_5") = Field(5)
      SmartTags("Stoerungshilfe_Loesung_1") = Field(6)
      SmartTags("Stoerungshilfe_Loesung_2") = Field(7)
      SmartTags("Stoerungshilfe_Loesung_3") = Field(8)
      SmartTags("Stoerungshilfe_Loesung_4") = Field(9)
      SmartTags("Stoerungshilfe_Loesung_5") = Field(10)
      Exit Do 'Zeile wurde gefunden und übernommen, Suche beenden

    End If
  End If
Loop
Die Variablen i, j, HiField werden nicht benötigt.

Harald
 
Hallo nochmal,
also das skript funktioniert, bis auf eine außnahme: die SmartTags("Stoerungshilfe_ID") benutzt er einfach nicht.
Sprich wenn ich aus dieser zeile
If field(0) = SmartTags("Stoerungshilfe_ID")

If field(0) = 1 bzw 2, 3 und so weiter mache
dann liest er die Zeile, aber nicht wenn ich es über die Variable definiere

fG Max
 
Zurück
Oben