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

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

Thema: Array aus DB in CSV Datei schreiben flexibel über Skript

  1. #1
    Registriert seit
    21.09.2004
    Beiträge
    95
    Danke
    50
    Erhielt 3 Danke für 3 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo liebe Forumsgemeinde,

    ich kämpfe jetzt schon ein wenig mit der Skript Funktion von WinCC fleixble.

    Das Skript soll folgendes machen:

    Werte aus dem DB 1 in einer For Schleife auslesen (10 Werte) und anschliessend in eine CSV datei mit folgendem aussehen schreiben.

    "index der For Schleife";Wert;"gelesener Wert aus DB"

    Den "Index" und den Text "Wert" schreibt das Skript schon, jedoch steht beim gelesenen Wert immer null obwohl etwas im DB eingetragen ist..ich glaub ich bin zu doof

    Die externe Variable "extvar" steht auf zyklisch fortlaufend.

    Mir gehen irgendwie die Ideen aus, ich hab das Projekt mal komplett angehängt, starten tut das Skript über E0.0.

    Vorab Vielen Dank für eure Hilfe


    Das Skript sieht folgendermaßen aus:

    'Declaration of local tags - Deklaration von lokalen Variablen
    Dim fso, f, ts, path, old, i, meineVar

    'Definition der Datei-Extension und des Pfades
    path = "c:\textfile.csv" 'Pfad- und Dateinamen definieren

    'Error Routine - Fehlerroutine
    On Error Resume Next

    'Create object - Objekt erstellen
    Set fso = CreateObject("Scripting.FileSystemObject")
    If Err.Number <> 0 Then
    ShowSystemAlarm "Error #" & CStr(Err.Number) & " " & Err.Description
    Err.Clear
    Exit Sub
    End If

    'if no file exist a text file will be created - Datei erstellen, wenn keine vorhanden
    If Not fso.FileExists(path) Then
    fso.CreateTextFile path
    End If
    Set f = fso.GetFile(path)
    If Err.Number <> 0 Then
    ShowSystemAlarm "Error #" & CStr(Err.Number) & " " & Err.Description
    Err.Clear
    Exit Sub
    End If
    Set ts = f.OpenAsTextStream(8, -2)
    If Err.Number <> 0 Then
    ShowSystemAlarm "Error #" & CStr(Err.Number) & " " & Err.Description
    Err.Clear
    Exit Sub
    End If

    'DB in interne Variable kopieren
    intArray = SmartTags("extArray")

    'Werte in die Datei schreiben
    For i = 1 To 10 Step +1
    meineVar=intArray(i)
    ts.WriteLine((i)&(";")& ("Wert;")&(meineVar))
    Next

    'Datei schließen
    ts.Close

    Set ts = Nothing
    Set f = Nothing
    Set fso = Nothing
    Angehängte Dateien Angehängte Dateien
    Geändert von CNC840D (29.08.2011 um 19:28 Uhr) Grund: Tippfehler
    Zitieren Zitieren WINCC flexible 2008: Array aus DB in CSV Datei schreiben über Skript  

  2. Folgender Benutzer sagt Danke zu CNC840D für den nützlichen Beitrag:


  3. #2
    Registriert seit
    21.09.2004
    Beiträge
    95
    Danke
    50
    Erhielt 3 Danke für 3 Beiträge

    Standard

    Ich glaube ich habe mein Problem eingegrenzt..so wie es aussieht liegt am anlegen des internen Arrays, beschreibe ich diesen nämlich und blende die Zeilen ein funktionierts.

    Ach ja kann es vielleicht sein das es wegen meiner Simulation mit PLCSim nicht geht ??

    Vorab Danke für die Hilfe

    'DB in interne Variable kopieren
    intArray = SmartTags("extArray")
    '------------------Das hier funktioniert!!!!-----------------
    'intArray(1)=1.0
    'intArray(2)=1.2
    'intArray(3)=1.3
    'intArray(4)=1.4
    'intArray(5)=1.5
    'intArray(6)=1.6
    'intArray(7)=1.7
    'intArray(=1.8
    'intArray(9)=1.9
    'intArray(10)=2.0
    '-------------------------------------------------------------
    'Werte in die Datei schreiben
    For i = 1 To 10 Step +1
    meineVar=intArray(i)
    ts.WriteLine((i)&(";")& ("Wert;")&(meineVar))
    Next

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

    Standard

    Zitat Zitat von CNC840D Beitrag anzeigen
    Code:
    'DB in interne Variable kopieren
    intArray = SmartTags("extArray")
    Zum Kopieren von Arrays in VBS sollte der folgende Programmcode funktionieren:

    Code:
    Dim intArray(9), i
     
    For i = 0 To 9
        intArray(i) = SmartTags("extArray")(i)
    Next
    Gruß Kai

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

    Standard

    Nachtrag:

    Man braucht den DB (extArray) nicht in eine interne Variable (intArray) kopieren.

    Man kann die Werte aus dem DB (extArray) direkt in die Datei schreiben.

    Code:
    'Werte in die Datei schreiben
    For i = 1 To 10
        ts.WriteLine i & ";Wert;" & SmartTags("extArray")(i - 1)
    Next
    Gruß Kai

  6. Folgender Benutzer sagt Danke zu Kai für den nützlichen Beitrag:

    CNC840D (01.09.2011)

  7. #5
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.181
    Danke
    923
    Erhielt 3.289 Danke für 2.658 Beiträge

    Standard

    Zitat Zitat von CNC840D Beitrag anzeigen
    Den "Index" und den Text "Wert" schreibt das Skript schon, jedoch steht beim gelesenen Wert immer null obwohl etwas im DB eingetragen ist..
    WinCC flexible mag Deine Arrays nicht und das Script erzeugt eigentlich Runtime-Errors, die Du aber wahrscheinlich nicht sehen kannst.

    Zur Fehlersuche in Scripten:
    Mache in ein Bild eine Meldeanzeige rein, die auch Meldeereignisse der Meldeklasse "System" anzeigt, damit Du die Runtime-Error-Meldungen lesen kannst.
    Deaktiviere das "On Error Resume Next" oder versetze das "intArray = SmartTags("extArray")" an den Anfang des Scriptes, dann werden die an dieser Stelle von dem Script erzeugten Runtime-Errors ausgegeben und Du erhältst detaillierte Fehlermeldungen, was genau in welcher Scriptzeile schief gelaufen ist.
    Zum Beobachten der Arbeit des Scriptes kann man sich mit "ShowSystemAlarm" Meldungen und z.B. Variablenwerte in die Meldeanzeige ausgeben lassen.

    In Deinem hochgeladenen Projekt hast Du "extArray" unsymbolisch als Array mit 40 Elementen angelegt, in dem DB hat das Array tatsächlich aber nur 10 Elemente.
    Arrays in VBS beginnen immer beim Index 0, das Element SmartTags("extArray")(10) gibt es nicht im DB und gäbe es auch nicht im Panel, wenn Du "extArray" symbolisch angelegt hättest. Egal, ob Du im DB ein ARRAY[1..10] hast, im Script hat das Array die Elemente (0) bis (9).

    Wozu hast Du das Panel-interne Array "intArray" angelegt? ("intArray" ist bei Dir ein SmartTag, keine Script-interne Variable).
    Normalerweise legt man im Script mit "Dim scriptArray(9)" eine temporäres Array an und kopiert zuerst das SmartTags("extArray") in das scriptArray.


    Zitat Zitat von Kai Beitrag anzeigen
    Code:
    Dim intArray(9), i
     
    For i = 0 To 9
        intArray(i) = SmartTags("extArray")(i)
    Next
    Zitat Zitat von Kai Beitrag anzeigen
    Code:
    'Werte in die Datei schreiben
    For i = 1 To 10
        ts.WriteLine i & ";Wert;" & SmartTags("extArray")(i - 1)
    Next
    So wie von Kai gezeigt soll man es eigentlich nicht machen.

    Zitat aus dem WinCC flexible Information System
    Grundlagen zu Arrays

    Warnung
    Erhöhte Systemauslastung und Performanceeinbußen


    Bei einem Lesezugriff oder Schreibzugriff auf ein einzelnes Arrayelement werden immer alle Arrayelemente der Arrayvariablen gelesen oder geschrieben. Daher dauert bei großen Arrays die Datenübertragung von und zur Steuerung generell länger als bei einem elementaren Datentyp. Dies kann die Kommunikation überlasten und dadurch stören.
    [...]

    Verwendung in Skripten

    Aus den gleichen Performancegründen verwenden Sie in Skripten zum Ändern von Arrays immer interne, temporäre Arrays.
    1. Am Anfang des Skripts kopieren Sie das PLC-Array in das interne Array.
    2. Während das interne Array durch das Skript bearbeitet wird, belasten Sie dadurch nicht die Datenübertragung zur Steuerung.
    Allerdings schreibt die Hilfe nicht, wie man das PLC-Array in das interne Array kopieren soll.
    In WinCC flexible 2008 SP2 Upd1 ist das Kopieren von kompletten Arrays anscheinend nicht (mehr?) möglich:

    SmartTags("intArray") = SmartTags("extArray")
    -> erzeugt Runtime-Errors (Konvertierungsfehler und Typen unverträglich)

    scriptArray = SmartTags("extArray")
    -> erzeugt Compilerfehler "Fehler: Ein Array kann nicht Ziel einer Zuweisung sein. in Zeile x, Spalte 1 "

    Ich meine, die letzte Variante mit dem Kopieren in das script-interne Array "scriptArray" hat "früher mal" funktioniert.
    Ich kann es allerdings nicht nachschauen, weil ich für solche Sachen immer keine Arrays, sondern Rezeptur-Datensätze verwende.

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  8. Folgende 2 Benutzer sagen Danke zu PN/DP für den nützlichen Beitrag:

    CNC840D (01.09.2011),Lupo (30.08.2011)

  9. #6
    Registriert seit
    19.12.2008
    Beiträge
    336
    Danke
    19
    Erhielt 28 Danke für 28 Beiträge

    Standard

    Zitat Zitat von PN/DP Beitrag anzeigen
    Ich meine, die letzte Variante mit dem Kopieren in das script-interne Array "scriptArray" hat "früher mal" funktioniert.
    Ich kann es allerdings nicht nachschauen, weil ich für solche Sachen immer keine Arrays, sondern Rezeptur-Datensätze verwende.
    Doch ... da hast du Recht.
    Ich kann mich sehr genau erinnern, dass das schon funktioniert hat. Ich hatte aber erst unlängst bei einem eigenen Script auch genau das Problem (mit der Meldung, dass die Typen nicht zusammen passen) habe das aber aus Zeitgründen bei der Inbetriebnahme nicht weiter verfolgt.
    Ich vermute auch, dass bei irgend einem Update o.ä. das Ganze mal "über Bord" gegangen ist

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

    Standard

    Zitat Zitat von xhasx Beitrag anzeigen
    Code:
    For array_nr = 1 To (i-1)
      zeileninhalt = Split(zeile(array_nr),";",-1,1) 
      SmartTags("Micobox\Auftrag1_RCV.Auftragsnummern") (array_nr) = zeileninhalt(0)
    Next
    Böses Foul!!! Bei jeder Zuweisung werden alle 200 Elemente in die Steuerung geschoben!!! Dann kommt es zur Überlast!!!

    Trick bzw. Lösung:

    Code:
    DIM TempArray(200)
     
    For array_nr = 1 To (i-1)
      TempArray(array_nr-1) = Split(zeile(array_nr),";",-1,1)
    Next
     
    SmartTags("Micobox\Auftrag1_RCV.Auftragsnummern") = TempArray
    Jetzt wird das Array genau einmal in die Steuerung geschoben.
    Umgekehrt kann man aber ein Array auf einmal in die Steuerung kopieren.

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

    Gruß Kai

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

    Standard

    Zitat Zitat von PN/DP Beitrag anzeigen
    Ich meine, die letzte Variante mit dem Kopieren in das script-interne Array "scriptArray" hat "früher mal" funktioniert.
    Ich kann es allerdings nicht nachschauen, weil ich für solche Sachen immer keine Arrays, sondern Rezeptur-Datensätze verwende.
    In WinCC flexible 2007 Runtime hat das Kopieren eines Arrays schon nicht mehr funktioniert.

    http://www.automation.siemens.com/WW...68&Language=en

    Gruß Kai

  12. #9
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.716
    Danke
    398
    Erhielt 2.399 Danke für 1.999 Beiträge

    Standard

    Zitat Zitat von Kai Beitrag anzeigen
    In WinCC flexible 2007 Runtime hat das Kopieren eines Arrays schon nicht mehr funktioniert.
    Ich würde mich hier hinsichtlich des "Wann" nicht festlegen wollen.
    Die Frage die sich mir stellt ist, für den Fall dass das so ist, warum es so ist und vor Allem warum (wenn es ja anscheinend bekannt ist) es nicht wieder in Ordnung gebracht wird, da es ja laut Hilfe auch immer noch so empfohlen wird - vor Allem da es ja auch tatsächlich (schon wegen Konsistenz der Daten) so am sinnvollsten ist ...

  13. #10
    Registriert seit
    13.10.2007
    Beiträge
    12.033
    Danke
    2.787
    Erhielt 3.269 Danke für 2.157 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Larry Laffer Beitrag anzeigen
    Die Frage die sich mir stellt ist, für den Fall dass das so ist, warum es so ist...
    da will ich mal eine Vermutung anstellen, Siemens möchte den 'PowerTag-Sparen'
    einen Riegel vorschieben. Sie verdienen an einen Array weniger wie an vielen
    PowerTags, Geld ist bei den Laden halt alles.

Ähnliche Themen

  1. aus Flexibel heraus eine TXT Datei ändern
    Von rostiger Nagel im Forum HMI
    Antworten: 17
    Letzter Beitrag: 23.01.2011, 14:55
  2. Array Feld flexibel deklarieren
    Von husox81 im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 20.06.2009, 02:32
  3. Antworten: 4
    Letzter Beitrag: 07.01.2007, 18:42
  4. Antworten: 3
    Letzter Beitrag: 13.10.2005, 11:53
  5. Antworten: 1
    Letzter Beitrag: 28.08.2005, 20:07

Lesezeichen

Berechtigungen

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