Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 20

Thema: Skript zur Variablenarchivierung --> Performanceproblem

  1. #1
    Registriert seit
    14.10.2009
    Beiträge
    11
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo zusammen,

    ich nutze zur Variablenarchivierung ein Skript, das vom Aufgabenplaner minütlich gestartet werden soll. Es schreibt eine Zeile in eine CSV-Datei, die als Umlaufarchiv dient. Das Projekt läuft auf einer Workstation als Runtime.

    Ich habe das Problem, dass diese Prozedur scheinbar sehr viele Ressourcen benötigt, so dass es wohl zu einer Art Überlauf kommt und manche andere Aufgaben des Aufgabenplaners nicht mehr durchgeführt werden. Meine CPU-Leistung steigt bei der RT-Simulation auch stark an (ohne minütliche Speicherung: ca. 10 %, mit minütlicher Speicherung: ca. 80 %).

    Ich habe meinen Code angehangen. Gibt es eine Möglichkeit den performanter zu machen? Ich vermute, dass die Variablenzugriffe das Problem sind. Aber wie kann man die anders gestalten? Als Array o. ä.?

    Vielen Dank.

    Code:
    Dim fso, f, ts, DataSet, Header, FName, LineData
    
    ' Archivierungspfad (Eingangsparameter) und Dateiname zusammensetzen 
    ' Combine archivepath (input parameter) an filename
    FName = StoragePath & ArchiveName & ".csv"
    
    If SmartTags("FileLines") => MaxLines Then
        DeleteLine FName,"",4,0
    End If
    
    ' Tabellenkopf zusammenstellen (Spalten Tag_10; Tag_11 usw.)
    ' Chr(10) = ANSI-Code für Zeilenvorschubzeichen
    ' Create table header (Column for Tag_10; Tag_11 and so on)
     Header = "Column1;Column2;Column3..." & Chr(10)
    
    ' FileSystemObject erstellen
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    
    ' Wenn Datei noch nicht vorhanden ist, dann wird eine Datei erzeugt
    ' if the file does not exist, then create a file
    If Not fso.FileExists(FName) Then   
    
       fso.CreateTextFile FName              
       Set f = fso.GetFile(FName)         
    ' Datei dem Skript als Objekt zur Verfügung stellen
    ' File as Object available for script
    
       Set ts = f.OpenAsTextStream(8, -2)
    ' Datei öffnen
    ' open file
    
       ts.WriteLine(FName)                 
       ts.WriteLine(Header)                 
       ts.Close
    ' Pfad- & Dateiname und Tabellenkopf in die Datei schreiben
    ' write path- & filename and table header into file
    ' Datei schließen
    ' close file
    
    End If 
    
     Set f = fso.GetFile(FName)            
    ' Die Archivdatei dem Skript als Objekt zur verfügung stellen 
    ' Archive file as object available for script
    
     Set ts = f.OpenAsTextStream(8, -2) 
    ' Die Datei öffnen 
    ' Open file
         
    ' Werte der Variablen in die Archivdatei schreiben
    ' Write values of variables in archive file
    
    LineData = CStr(Now) & ";" & CDbl(SmartTags("Var1")) & ";" &_
                                        CDbl(SmartTags("Var2")) & ";" &_
                                        CDbl(SmartTags("Var3")) & ";" &_ 
                                        CDbl(SmartTags("Var4")) & ";" &_ 
                                        CDbl(SmartTags("Var5")) & ";" &_ 
                                        CDbl(SmartTags("Var6")) & ";" &_ 
                                        CDbl(SmartTags("Var7")) & ";" &_ 
                                        CDbl(SmartTags("Var8")) & ";" &_ 
                                        ...
                                        CDbl(SmartTags("Var78"))
    
    
    ts.WriteLine(LineData)
    
    ' Aktuelle Zeile zurückgeben 
    ' Read last linenumber
     SmartTags("FileLines") = ts.Line
     
    ' Datei wieder schließen
    ' Close file
     ts.Close
    
    ' Verwendeten Speicher wieder freigeben
    ' Used storage will be freed
    Set ts  = Nothing
    Set LineData = Nothing
    Set f   = Nothing
    Set fso = Nothing
    Zitieren Zitieren Skript zur Variablenarchivierung --> Performanceproblem  

  2. #2
    Registriert seit
    30.03.2005
    Beiträge
    2.096
    Danke
    0
    Erhielt 673 Danke für 541 Beiträge

    Standard

    Zitat Zitat von J_uri Beitrag anzeigen
    Ich habe meinen Code angehangen. Gibt es eine Möglichkeit den performanter zu machen? Ich vermute, dass die Variablenzugriffe das Problem sind. Aber wie kann man die anders gestalten? Als Array o. ä.?
    Das Arbeiten mit einem Array in WinCC flexible wird leider keine Verbesserung bringen.

    Siehe dazu die folgenden Beiträge:

    http://www.sps-forum.de/showthread.php?t=48008

    http://www.sps-forum.de/showpost.php...62&postcount=5

    http://www.spsforen.com/showthread.php?t=25678

    Gruß Kai

  3. #3
    J_uri ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    14.10.2009
    Beiträge
    11
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo Kai,

    vielen Dank für die Links.

    Inzwischen habe ich rausbekommen, dass es scheinbar an der Größe der externen Datei liegt, die ich zeilenweise schreibe. Denn wenn diese Datei voll ist und somit in den "Umlaufmodus" wechselt (1. Zeile wird gelöscht, letzte wird neu geschrieben) dann benötigt die RT ab dem 2. Start des Skriptes enorme Rechenleistung, die auch nicht wieder runtergeht. Selbst wenn ich die Aufgabe nur alle 2 Minuten starte.

    Sieht vielleicht ein kundiger Skriptprogrammierer woran das an meinem Code liegen könnte. Ich gebe ja die Dateireferenzen immer wieder frei.

    Gruß

  4. #4
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.797
    Danke
    398
    Erhielt 2.417 Danke für 2.013 Beiträge

    Standard

    Hallo,
    wie wäre es, wenn du die Umlauf-Geschichte so machst, dass du als erstes die Quelldatei umbenennst. Dann aus der úmbenannten Quelldatei die Zeilen 2 .. maxLines einliest und in die neue Datei (mit dem alten Namen) schreibst und dann die neue Datenzeile da anhängst.
    Ich weiß nicht, ob es das wirklich besser macht - den Versuch wäre es aber m.E. wert ...

    Gruß
    Larry

  5. #5
    J_uri ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    14.10.2009
    Beiträge
    11
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo Larry,

    ich habe das Problem weiter eingegrenzt. Es liegt an meiner "Delete Line" Funktion. Die Funktion liest unnötigerweise jede Zeile der Datei (10080) ein, obwohl sie nur die 4. Zeile löschen soll. Ich hatte diesen Code von einem Kollegen übernommen. Er sucht auch gleichzeitig noch nach Schlagwörtern, was ich aber nicht benötige.

    Gibt es eine schnellen Code, der mir genau die angegebene Zeile aus einer Textdatei löscht.

    Also nach dem Motto: "Textdatei.LöscheZeile(4)" ?

    Da muss es doch etwas geben.

    Vielen Dank nochmal

    Gruß

  6. #6
    Registriert seit
    30.03.2005
    Beiträge
    2.096
    Danke
    0
    Erhielt 673 Danke für 541 Beiträge

    Standard

    Ich kenne keine einfache Funktion in VBS, die eine Zeile in einer Textdatei löschen kann.

    Sieht Deine DeleteLine Funktion so aus wie in dem nachfolgendem Beispiel?

    http://www.visualbasicscript.com/Del...on-m63517.aspx

    Gruß Kai

  7. #7
    J_uri ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    14.10.2009
    Beiträge
    11
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Nein, so:

    Code:
    'Remove line(s) containing text (strKey) from text file (strFile)
     'or
     'Remove line number from text file (strFile)
     'or
     'Remove line number if containing text (strKey) from text file (strFile)
     
     'Use strFile = "c:\file.txt"   (Full path to text file)
     'Use strKey = "John Doe"       (Lines containing this text string to be deleted)
     'Use strKey = ""               (To not use keyword search)
     'Use LineNumber = "1"          (Enter specific line number to delete)
     'Use LineNumber = "0"          (To ignore line numbers)
     'Use CheckCase = "1"           (For case sensitive search )
     'Use CheckCase = "0"           (To ignore upper/lower case characters)
     
     
        Const ForReading=1:Const ForWriting=2
        Dim objFSO,objFile,Count,strLine,strLineCase,strNewFile
        Set objFSO=CreateObject("Scripting.FileSystemObject")
        Set objFile=objFSO.OpenTextFile(strFile,ForReading)
        
        Do Until objFile.AtEndOfStream
           strLine=objFile.ReadLine
           If CheckCase=0 Then strLineCase=UCase(strLine):strKey=UCase(strKey)
           If LineNumber=objFile.Line-1 Or LineNumber=0 Then
              If InStr(strLine,strKey) Or InStr(strLineCase,strKey) Or strKey="" Then
                 strNewFile=strNewFile
              Else
                 strNewFile=strNewFile&strLine&vbCrLf
              End If
           Else
              strNewFile=strNewFile&strLine&vbCrLf
           End If
        Loop
        objFile.Close
        Set objFSO=CreateObject("Scripting.FileSystemObject")
        Set objFile=objFSO.OpenTextFile(strFile,ForWriting) 
        objFile.Write strNewFile 
        objFile.Close

  8. #8
    Registriert seit
    30.03.2005
    Beiträge
    2.096
    Danke
    0
    Erhielt 673 Danke für 541 Beiträge

    Standard

    Ist das nicht genau der selbe Programmcode wie aus meinem Link?

    http://www.visualbasicscript.com/Del...on-m63517.aspx

    Gruß Kai

  9. #9
    J_uri ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    14.10.2009
    Beiträge
    11
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Ich nehme es zurück. Ja du hast recht. Es ist der selbe Code.

    Es kann doch aber nicht sein, dass diese Prozedur den Rechner an seine Leistungsgrenze bringt. Es sind doch nur eine Schleife und 2 Dateizugriffe. In meinem Fall hat die Datei ca. 10000 Zeilen. Das sorgt für 3 min Dauerbeschäftigung... in denen keine andere Aufgabe durchgeführt wird.
    Geändert von J_uri (06.10.2011 um 13:46 Uhr)

  10. #10
    Registriert seit
    20.06.2003
    Ort
    Sauerland.NRW.Deutschland
    Beiträge
    4.866
    Danke
    78
    Erhielt 806 Danke für 549 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    wenn die zeile recht lang sind dauert das einlesen sehr lange

    machs mal so das geht sehr schnell
    [PHP] Const ForReading=1:Const ForWriting=2
    Dim objFSO,objFile,Count,strLine,strLineCase,strNewFile
    dim zeile(15000)
    Set objFSO=CreateObject("Scripting.FileSystemObject")
    Set objFile=objFSO.OpenTextFile(strFile,ForReading)
    x=0
    Do Until objFile.AtEndOfStream
    x=x+1
    zeile(x) = objFile.Readline
    Loop
    objFile.Close

    Set objFSO=CreateObject("Scripting.FileSystemObject")
    Set objFile=objFSO.createTextFile(strFile,ForWriting)
    for y=2 to x
    objFile.Writeline zeile(y)
    next
    objFile.Close
    [/PHP]
    .
    mfg Volker .......... .. alles wird gut ..

    =>Meine Homepage .. direkt zum Download

    Meine Definition von TIA: Total Inakzeptable Applikation

Ähnliche Themen

  1. Variablenarchivierung
    Von franzlurch im Forum HMI
    Antworten: 13
    Letzter Beitrag: 06.07.2010, 12:36
  2. VB-Skript/CSV/SQL
    Von c.wehn im Forum HMI
    Antworten: 10
    Letzter Beitrag: 01.02.2010, 09:23
  3. VBS-Skript
    Von johnij im Forum HMI
    Antworten: 7
    Letzter Beitrag: 06.06.2008, 14:16
  4. VB - Skript
    Von tarzipan7 im Forum HMI
    Antworten: 2
    Letzter Beitrag: 17.11.2007, 07:41
  5. Vb Skript
    Von Reblaus im Forum HMI
    Antworten: 6
    Letzter Beitrag: 23.10.2005, 11:26

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •