florianhe
Goto Top

VB-Script zum Lesen eines bereichs aus einer Textdatei

Hallo. ich habe ein Problem.
Ich habe eine Maschine mit einem Panel auf dem Windows CE läuft. die Software zur visualisierung kann VB-Scripte verarbeiten.

mit einem programm lese ich bestimmte Fehlernummern aus.
Von Siemens gibt es ein handbuch das zu jeder Fehlernummer eine genaue beschreibung hat. Dieses handbuch habe ich in eine TXT kopiert.

hier ein ausschnitt der TXT:

F01000               Softwarefehler intern
Meldungswert:        %1
Antriebsobjekt:      Alle Objekte
Reaktion:            AUS2
Quittierung:         POWER ON
Ursache:             Ein interner Softwarefehler ist aufgetreten.
                     Störwert (r0949, hexadezimal interpretieren):
                     Nur für Siemens-interne Fehlerdiagnose.
Abhilfe:             - Störpuffer auswerten (r0945).
                     - POWER ON bei allen Komponenten durchführen (Aus-/Einschalten).
                     - Firmware auf neuere Version hochrüsten.
                     - Hotline kontaktieren.
                     - Control Unit austauschen.

F01001               FloatingPoint Ausnahme
Meldungswert:        %1
Antriebsobjekt:      Alle Objekte
Reaktion:            AUS2
Quittierung:         POWER ON
Ursache:             Es ist eine Ausnahme bei einer Operation mit dem Datentyp FloatingPoint aufgetreten.
                     Der Fehler kann durch das Grundsystem oder eine OA-Applikation (z. B. FBLOCKS, DCC) verursacht werden.
                     Störwert (r0949, hexadezimal interpretieren):
                     Nur für Siemens-interne Fehlerdiagnose.
                     Hinweis:
                     Weitere Informationen zu dieser Störung können r9999 entnommen werden.
                     r9999: Störungsnummer.
                     r9999[1]: Programmzähler in dem Zeitpunkt, als die Ausnahme aufgetreten ist.
                     r9999[2]: Ursache für die Ausnahme bei FloatingPoint.
                     Bit 0 = 1: Operation ungültig
                     Bit 1 = 1: Division durch Null
                     Bit 2 = 1: Überlauf
                     Bit 3 = 1: Unterlauf
                     Bit 4 = 1: Ergebnis ungenau
Abhilfe:             - POWER ON bei allen Komponenten durchführen (Aus-/Einschalten).
                     - Projektierung und Signale der Bausteine bei FBLOCKS prüfen.
                     - Projektierung und Signale der Pläne bei DCC prüfen.
                     - Firmware auf neuere Version hochrüsten.
                     - Hotline kontaktieren.

F01002               Softwarefehler intern
Meldungswert:        %1
Antriebsobjekt:      Alle Objekte
Reaktion:            AUS2
Quittierung:         SOFORT
Ursache:             Ein interner Softwarefehler ist aufgetreten.
                     Störwert (r0949, hexadezimal interpretieren):
                     Nur für Siemens-interne Fehlerdiagnose.
Abhilfe:             - POWER ON bei allen Komponenten durchführen (Aus-/Einschalten).
                     - Firmware auf neuere Version hochrüsten.
                     - Hotline kontaktieren.

mein Ziel ist es einem Script die Fehlernummer zu übergeben. Das Script soll dann aus der großen TXT Datei die Erklärung zum Fehler ausgeben.

das bedeutet:
würde jetzt "F01000" übergeben werden soll eine TXT erzeugt werden mit dem inhalt:

F01000               Softwarefehler intern
Meldungswert:        %1
Antriebsobjekt:      Alle Objekte
Reaktion:            AUS2
Quittierung:         POWER ON
Ursache:             Ein interner Softwarefehler ist aufgetreten.
                     Störwert (r0949, hexadezimal interpretieren):
                     Nur für Siemens-interne Fehlerdiagnose.
Abhilfe:             - Störpuffer auswerten (r0945).
                     - POWER ON bei allen Komponenten durchführen (Aus-/Einschalten).
                     - Firmware auf neuere Version hochrüsten.
                     - Hotline kontaktieren.
                     - Control Unit austauschen.

sozusagen muss der bereich zwischen F01000 und F01001 in eine neue TXT geschrieben werden.

Ich habe auch schon ein programmbeispiel gefunden das genau das kann:
Führe ich dieses Script in EXCEL aus macht es aber schonmal genau das was ich will.

Sub import()
 Dim Zeile As String
 Dim start As String
 Dim ende As String
 Dim ausgabe As String
 Dim i As Long
  

  start = "F01000"  
  ende = "F01001"  
  
  Open "C:\Users\Florian\Desktop\vbstest\Fehlerliste_neu.txt" For Input As #1  
  Open "C:\Users\Florian\Desktop\vbstest\output.txt" For Output As #2  

  i = 0
  While Not EOF(1)
    Line Input #1, strZeile
    
    If i Then
    Print #2, strZeile
    End If
    
    If InStr(strZeile, start) Then
    Print #2, strZeile
    i = 1
    End If
    If InStr(strZeile, ende) Then
    i = 0
    End If
  Wend
  Close #1
  Close #2
End Sub

leider ist das aber kein VB-Script und somit für mich unbrauchbar.

Villeicht ist ja jemand da draußen der mir einen Tipp geben kann das das Programm in ein VB-Script umschreiben kann.

Content-ID: 647689

Url: https://administrator.de/contentid/647689

Ausgedruckt am: 21.11.2024 um 22:11 Uhr

FlorianHe
FlorianHe 04.02.2021 aktualisiert um 09:10:36 Uhr
Goto Top
Habe mittlerweile eine lösung gefunden.

Allerdings kommen jetzt weite probleme

Aber erstmal der Code:

Const ForReading = 1, ForWriting = 2
Dim FSO, FileIn, FileOut
Dim Line
Dim Vorname, Nachname, GebDatum, GebOrt, Land

Set FSO     = CreateObject("Scripting.FileSystemObject")  
Set FileIn  = FSO.OpenTextFile("Fehlerliste_neu.txt", ForReading)  
Set FileOut = FSO.OpenTextFile("output2.txt", ForWriting, True)  

'Start-Werte  
Zeile = ""  

Do Until FileIn.AtEndOfStream
        Line = FileIn.ReadLine

 If Left(Line, 6 ) = "F01000" And  Zeile = "" And Not Left(Line, 6 ) = "F01002" Then  
 		Do Until Left(Zeile, 6 ) = "F01001"  
 			Zeile = Trim(FileIn.ReadLine)                                     
      	 	FileOut.WriteLine Zeile

      	Loop
 End If 
Loop
FileIn.Close
FileOut.Close
MsgBox "Fertig"  


Die ausgegebene Textdatei sieht dann so aus :

Meldungswert:        %1
Antriebsobjekt:      Alle Objekte
Reaktion:            AUS2
Quittierung:         POWER ON
Ursache:             Ein interner Softwarefehler ist aufgetreten.
Störwert (r0949, hexadezimal interpretieren):
Nur für Siemens-interne Fehlerdiagnose.
Abhilfe:             - Störpuffer auswerten (r0945).
- POWER ON bei allen Komponenten durchführen (Aus-/Einschalten).
- Firmware auf neuere Version hochrüsten.
- Hotline kontaktieren.
- Control Unit austauschen.

F01001               FloatingPoint Ausnahme

jetzt mein probem:
- was kann ich machen das die letzte zeile nicht ausgegeben wird? (eine idee von mir ist nicht nach "F01001" zu suchen sondern nach der nächsten leeren Zeile )
- was muss ich machen das man nur nach der zahl suchen kann ( statt F01000 nur 01000) da msste ich vermutlich in der: If Left(Line, 6 ) = "F01000" zeile was ändern. aber was ?

kann mir jemand helfen ?
FlorianHe
FlorianHe 04.02.2021 um 10:01:45 Uhr
Goto Top
Habs hinbekommen!

Const ForReading = 1, ForWriting = 2
Dim FSO, FileIn, FileOut
Dim Line
Dim Zeile, leere_Zeile, Suchstring1, Suchstring2

Set FSO     = CreateObject("Scripting.FileSystemObject")  
Set FileIn  = FSO.OpenTextFile("Fehlerliste_neu.txt", ForReading)  
Set FileOut = FSO.OpenTextFile("output2.txt", ForWriting, True)  


'Start-Werte  
Zeile = " "  
leere_Zeile = ""  

Suchstring1 = "07434"  
'Suchstring2 = vbCrLf  


Do Until FileIn.AtEndOfStream
        Line = FileIn.ReadLine
 'If Left(Line, 6 ) = "F01000" And  Zeile = "" And Not Left(Line, 6 ) = "F01002" Then  
 If instr(1,Line, Suchstring1, 0) Then
 		Do Until Not 0 < Len(Zeile)
      	 	 Zeile = Trim(FileIn.ReadLine) 
      	 	 FileOut.WriteLine Zeile
      	Loop
      	
 End If
Loop

FileIn.Close
FileOut.Close
MsgBox "Fertig"  
147323
Lösung 147323 04.02.2021 aktualisiert um 23:28:14 Uhr
Goto Top
Mit Regex noch effizienter
' Eingabedatei  
Const FILEIN = "D:\florianhe\test.txt"  
' Ausgabedatei  
Const FILEOUT = "D:\florianhe\result.txt"  
' Objekte erstellen  
Set regex = CreateObject("vbscript.regexp")  
Set fso = CreateObject("Scripting.FileSystemObject")  
' Regex Optionen festlegen  
regex.Global = False: regex.IgnoreCase = True: regex.MultiLine = True
' Regex Pattern zum extrahieren des gewünschten Fehlers festlegen  
regex.Pattern = "^(" & wscript.Arguments(0) & "\s+[\s\S]+?)^\s+$"  
' Inhalt der Eingabedatei in Variable einlesen  
inhalt = fso.OpenTextFile(FILEIN,1).ReadAll()
' regex auf Inhalt der Eingabedatei ausführen  
set matches = regex.Execute(inhalt)
' wenn die Fehlernummer gefunden wurde dann ...  
If matches.count > 0 Then
        ' schreibe den extrahierten Inhalt in die Auagabedatei  
	fso.OpenTextFile(FILEOUT,2,True).Write matches(0).submatches(0)
End If
Aufrufen dann mit Nummer als Parameter
script.vbs "F01001"  
FlorianHe
FlorianHe 04.02.2021 um 16:58:19 Uhr
Goto Top
Danke für die Antwort. ich werde das Script morgen mal auf arbeit testen. Weil mein Script funktioniert zwar auf meinem Windows PC aber auf dem Bedienpanel nicht. Wieso auch immer. es kommt leider kein Fehler.

Was ich noch fragen wollte:

Wie müsste das Script von jokari aussehen wenn ich die Nummer in einer variable habe und nicht als Parameter?
Wäre es eventuell möglich das Script zu kommentieren? Das würde mir sehr helfen den Inhalt zu verstehen.
147323
147323 04.02.2021 aktualisiert um 23:59:10 Uhr
Goto Top
Zitat von @FlorianHe:
Wie müsste das Script von jokari aussehen wenn ich die Nummer in einer variable habe und nicht als Parameter?
Wäre es eventuell möglich das Script zu kommentieren? Das würde mir sehr helfen den Inhalt zu verstehen.
Wenn du das unbedingt willst, Zeile 6 das wscript.arguments(0) durch deine Variable ersetzen. Dieser Ausdruck bedeutet, füge den Inhalt des ersten an das Script übergebenen Parameter ein, und das ist die Fehlernummer. Du bräuchtest also deiner Anwendung nur den Pfad zum Skript und dahinter als Parameter die Fehlernummer übergeben, zusätzliche Variable überflüssig!
Was die Regulären Ausdrücke bedeuten kannst du hier nachlesen, das erklär ich jetzt nicht auch noch
https://danielfett.de/2006/03/20/regulaere-ausdruecke-tutorial/
Kommentare s. oben.
FlorianHe
FlorianHe 05.02.2021 aktualisiert um 06:14:02 Uhr
Goto Top
Danke. Mein programmierprogramm für bedienoberfläschen kann nämlich
wscript.arguments(0) nicht verarbeiten :/

Danke für den Link da werde ich nochmal nachlesen. Weil ich hab versucht dein Script zu verwenden. Leider ohne Erfolg da das Programm was davor läuft leider nur die Nummer des Fehlers ausgeben kann und nicht den Buchstaben davor.
muss ich gucken das ich dein Script nochmal umschreibe. So das wenn man nicht nach F01000 suchen kann sondern nur 01000. Anders geht es leider nicht weil es z.b. auch A31250 gibt. Und ich aber leider nur die Nummern auslesen kann :/

Sollte ich es nicht hin bekommen könnte ich da nochmal deine Hilfe in Anspruch nehmen?
147323
147323 05.02.2021 aktualisiert um 08:12:18 Uhr
Goto Top
Na und, ist doch kein Problem, schreibst du einfach In Zeile 6 den Pattern passend wenn du den führenden Buchstaben nicht vorhersagen kannst hast, dafür ist Regex ja da 😁...
Regex.Pattern = "^([a-z]" & DeineVariable  & "\s+[\s\S]+?)^\s+$"  
FlorianHe
FlorianHe 05.02.2021 um 08:31:49 Uhr
Goto Top
danke für die schnelle Antwort. hatte es dank deinem Link schon rausgefunden ;)
Aber jetzt wieder ein Problem face-smile

Auf Windows geht es wunderbar aber auf dem Panel mal wieder nicht. Mittlerweile weiß ich auch wieso.

Die Fehlermeldung heißt:
Fehler 'ActiveX component can't create objekt:'Scripting.FileSystemObyekt" in Script <VB_Funktion_2> in Zeile 17.  

Zeile 17 ist bei mir diese:

Set fso = CreateObject("Scripting.FileSystemObject")  

Ich glaub langsam das projekt ist zum scheitern verurteilt. So wie es aussieht kann das panel solche aufgaben nicht ausführen. Oder gibts noch andere Wege?

Noch zur info: Das Script läuft auf einem Siemens Panel (mp377) mit dem Betriebssysthem WindowsCE und die Programmiersoftware heißt "Wincc flexible 2008"
fehler
147323
147323 05.02.2021 aktualisiert um 08:41:30 Uhr
Goto Top
Was auf der Plattform supported wird steht hier
https://support.industry.siemens.com/cs/document/59885894/which-vbs-info ...

Ich bin raus.
FlorianHe
FlorianHe 05.02.2021 aktualisiert um 11:50:35 Uhr
Goto Top
habe mein Programm endlich lauffähig bekommen face-smile

leider nicht mit regex. fand das irgendwie besser. Aber das werde ich mir bestimmt nochmal anschauen.
Wollte trotzdem mal meinen erfolg Posten

Sub Fehler anzeigen()
'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:  

Const Pfad_out = "\STORAGE CARD USB\Fehlerliste.txt"  

Const ForReading = 1, ForWriting = 2
Dim FileIn, FileOut, FileDelete
Dim Line
Dim Zeile, leere_Zeile, Suchstring
Dim suche_fertig
' Eingabedatei  
Dim modeIN
Const PathIn = "\Storage Card USB\Fehlerliste.txt"  
modeIN = 1 
' Ausgabedatei  
Dim modeOut
Const PathOut = "\Storage Card USB\result.txt"  
modeOut = 8

Set FileIn     = CreateObject("FileCtl.File")  
Set FileOut    = CreateObject("FileCtl.File")  
Set FileDelete = CreateObject("FileCtl.FileSystem")  
'Set FileIn  = FSO.OpenTextFile("\STORAGE CARD USB\Fehlerliste.txt", ForReading)  
'Set FileOut = FSO.OpenTextFile("\STORAGE CARD USB\result.txt", ForWriting, True)  

ShowSystemAlarm "Befehl wird gestartet!"  
'Start-Werte  
Zeile = " "  
'Suchstring = "01002"  
Suchstring = SmartTags ("Suchstring")  

'alte Datei löschen  
FileDelete.Kill PathOut
'Datei öffnen  
FileIn.open PathIn,modeIN
FileOut.open PathOut,modeOut

suche_fertig = False

'Do Until FileIn.AtEndOfStream  
'Do Until FileIn.EOF = True  
Do Until suche_fertig = True
        Line = FileIn.LineInputString
 'If Left(Line, 6 ) = "F01000" And  Zeile = "" And Not Left(Line, 6 ) = "F01002" Then  
 If InStr(1,Line, Suchstring, 0) Then
 		Do Until Not 0 < Len(Zeile)
      	 	 Zeile = Trim(FileIn.LineInputString) 
      	 	 FileOut.LinePrint (Zeile)
      	Loop
      	suche_fertig = True
 End If
Loop

FileIn.Close
Set FileIn = Nothing
FileOut.Close
Set FileOut = Nothing
StartProgram "\flash\AddOn\iexplore.exe","\Storage Card USB\result.txt",hmiShowNormal,hmiNo  
End Sub
datadiode
datadiode 26.11.2022, aktualisiert am 21.01.2023 um 20:01:30 Uhr
Goto Top
Das RegExp-Problem scheint eine Krankheit der WEC2013-basierten Panels (Comfort V2/PRO und Mobile) zu sein.
Mit srellcom steht als Ersatz für die VBScript-eigene RegExp-Implementierung die Objektklasse SRELL.RegExp zur Verfügung.

Beispiel:
Dim re
Set re = CreateObject("SRELL.RegExp")  
re.Pattern = "\p{Script=Greek}"  
wscript.Echo "It is " & re.Test(ChrW(960)) & " that " & ChrW(960) & " is a Greek letter."