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

Ergebnis 1 bis 10 von 10

Thema: [FAQ] Wie kann ich in WinCC Daten im/exportieren mit XML?

  1. #1
    Registriert seit
    05.11.2004
    Ort
    Schweiz
    Beiträge
    1.135
    Danke
    224
    Erhielt 127 Danke für 85 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo.

    Da ich letzt ein Projekt hatte, wo ich mit XML Daten exportieren und importieren musste, wollte ich hier mal meine Erfahrungen dazu weitergeben.

    Der Im/Export mit der XML-Funktion, die auf jedem Windows-System vorhanden ist (WinCE, WinXP....) ermöglicht unter WinCC ab Version 6.0 (frühere Version nicht getestet) viele Möglichkeiten an, um z.b.
    -Rezeptsicherungen auf USB-Stick
    -Parametersicherung/Anpassung sichern oder laden
    -Neue Rezepte mehr Mail an Kunden senden
    -etc....

    Das ganze habe ich mit VBS gemacht, da diese Sprache auch in WinCC flexibel zur Verfügung steht.
    Ob das ganze auch unter C-Script funktioniert muss man dann selbst testen.

    1. Erstellen eines VB-Scripts in WinCC.
    Zuerst sollte im VB-Script Editor (Global Script VBS) eine neues Modul unter Projekt-Module erstellt werden.
    ->Auf der linken Seite unten auf Projekt-Module klicken
    ->Rechtsklick auf Projekt-Module im Fensterbereich oberhalb der Auswahl
    ->Neu -> Projekt-Modul

    Es wird ein neuen Modul erstellt, das nun so aussehn sollte:
    [PHP]Sub procedure1

    End Sub[/PHP]

    Nun der Sub einen ordentlichen Namen vergeben. Ich habe z.B. READ_XML_FILE, SAVE_XML_FILE oder NEW_XML_FILE als Bezeichnung gewählt.

    2. Variablen im Script definieren.
    Um eine Variable aus WinCC im Script nutzen zu können, müssen wir einen Zugriff auf diese erst einrichten.
    In dieser Variable kann z.B. der Pfad der Datei hinterlegt sein, wo sich die zu lesende oder schreibende XML-Datei befindet.

    [PHP]Dim objTagPfad
    Set objTagPfad = HMIRuntime.Tags("Pfadname_XML_Datei") [/PHP]

    3. Instanz auf die XML-Funktions-Bibliothek erzeugen.
    Damit wir nun auf die Funktionen der XML-Bibliothek zugreifen könne, müssen wir einen Bezug zu dieser herstellen.
    Das geht folgendermassen:

    [PHP]Dim XML
    Set XML = CreateObject("MSXML2.DOMDocument")[/PHP]

    Nun haben wir erstmal alles, um mit XML zu Arbeiten.
    Nun gibt es ja 3 Möglichkeiten, mit einer XML-Datei was zu machen.
    1. Wir erstellen eine komplett neue Datei
    2. Wir lesen was aus einer bestehenden Datei aus
    3. Wir lesen und ändern was in einer bestehenden Datei

    Zuerst wird das Thema erstellen einer XML-Datei angegangen:
    Da wir ja oben schonmal die Pfadname unser Datei im WinCC mit dem Namen der neuen Datei beschrieben haben, müssen wir diesen erstmal auslesen.

    [PHP]objTagPfad.Read[/PHP]

    Nun übergeben wir der XML-Funktion den Pfadnamen. Da die Datei noch nicht existiert, wird erstmal eine virtuelle Datei im Speicher angelegt, die diesen Namen dann trägt.

    [PHP]Dim OpenXML
    OpenXML = XML.Load(objTagPfad.Value) [/PHP]

    Nun überprüfen wir, ob XML das Laden erfolgreich beendet hat.

    [PHP]If OpenXML = True Then
    ......
    End If[/PHP]

    In der If-Abfrage können nun die Daten für die XML-Datei aufbereitet werden.
    Ist man damit fertig, speichert man die Datei im XML-Format ab.

    [PHP]If OpenXML = True Then
    ......
    XML.save(objTagPfad.Value)
    End If[/PHP]

    Am Schluss von dem Script muss dann noch die XML-Routine freigegeben werden:
    [PHP]Set XML = Nothing[/PHP]

    Das ganze würde dann fertig so aussehen:
    [PHP]Sub NEW_XML_FILE

    Dim objTagPfad
    Set objTagPfad = HMIRuntime.Tags("Pfadname_XML_Datei")

    Dim XML
    Set XML = CreateObject("MSXML2.DOMDocument")

    Dim OpenXML
    objTagPfad.Read
    OpenXML = XML.Load(objTagPfad.Value)

    If OpenXML = True Then
    ......
    XML.save(objTagPfad.Value)
    End If
    Set XML = Nothing
    End Sub[/PHP]
    Geändert von Krumnix (15.12.2010 um 13:03 Uhr)
    Kommt Zeit.... Kommt Rat.... In der Tat.
    Gartenlampe mit Windenergie anstelle von Solar? Bei Interesse -> PN
    Zitieren Zitieren [FAQ] Wie kann ich in WinCC Daten im/exportieren mit XML?  

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

    rostiger Nagel (16.12.2010)

  3. #2
    Krumnix ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    05.11.2004
    Ort
    Schweiz
    Beiträge
    1.135
    Danke
    224
    Erhielt 127 Danke für 85 Beiträge

    Standard

    Daten aus einer XML-Datei lesen:
    Da wir nun wissen, wie man auf die Funktion der XML-Bibliothek in VBS aufrufen können, kommen wir nun zu dem Lesen eines Nodes in einer XML-Datei.
    Hier mal eine Übersicht, wie so eine XML-Datei aussieht:
    [php]<?xml version="1.0"?>
    <root xmlnssi="http://www.w3.org/2001/XMLSchema-instance" xmlnssd="http://www.w3.org/2001/XMLSchema">
    <DatenEingang>
    <ID>22123</ID>
    <AVGDicke>12</AVGDicke>
    <BandGeschw>34</BandGeschw>
    <BadTemp>6.098</BadTemp>
    </DatenEingang>
    <DatenMitte>
    <BandGeschw>34</BandGeschw>
    <BadTemp>6.110</BadTemp>
    </DatenMitte>
    <DatenAusgang>
    <AVGDicke>11</AVGDicke>
    <BandGeschw>34</BandGeschw>
    <BadTemp>6.209</BadTemp>
    <DiffDicke>1</DiffDicke>
    <Gewicht>45</Gewicht>
    </DatenAusgang>
    </root>[/php]

    Nun wollen wir einen Wert aus dieser Datei mal auslesen.
    Das Grundgerüst sieht erstmal folgendermassen aus:

    [php]Sub READ_XML_FILE

    Dim objTagPfad
    Set objTagPfad = HMIRuntime.Tags("Pfadname_XML_Datei")

    Dim XML
    Set XML = CreateObject("MSXML2.DOMDocument")

    Dim OpenXML
    objTagPfad.Read
    OpenXML = XML.Load(objTagPfad.Value)

    If OpenXML = True Then
    ...... //Hier werden wir nun weiter darauf eingehen. Z.B. Zugriff auf ein Node in der XML-Datei um es auszulesen oder zu beschreiben
    End If
    Set XML = Nothing
    End Sub
    [/php]

    Um auf ein Node in einer XML-Datei Zugriff zu haben verwendet man folgenden Aufruf:
    [php]XML.documentElement.selectSingleNode("DatenEingang/ID").text
    [/php]

    Damit wir den Inhalt dieses Nodes im WinCC verwenden können schreiben wir folgendes:
    [php]Dim XML-ID
    Set XML-ID = HMIRuntime.Tags("XML_ID")

    XML-ID.Read
    XML-ID.Value = CDbl(XML.documentElement.selectSingleNode("DatenEingang/ID").text)
    [/php]

    Das Ganze sieht dann so aus:
    [php]Sub READ_XML_FILE

    Dim objTagPfad
    Set objTagPfad = HMIRuntime.Tags("Pfadname_XML_Datei")

    Dim XML
    Set XML = CreateObject("MSXML2.DOMDocument")

    Dim OpenXML
    objTagPfad.Read
    OpenXML = XML.Load(objTagPfad.Value)

    If OpenXML = True Then
    Dim XML-ID
    Set XML-ID = HMIRuntime.Tags("XML_ID")

    XML-ID.Read
    XML-ID.Value = CDbl(XML.documentElement.selectSingleNode("DatenEingang/ID").text)
    XML-ID.Save
    End If
    Set XML = Nothing
    End Sub
    [/php]


    Daten aus einer XML-Datei lesen und Ändern:
    Nun kommen wir dazu, wie wir ein Node in einer XML-Datei ändern können.
    Das Auslesen eines Nodes habe ich ja schon weiter oben beschrieben.
    Der Unterscheid zum schreiben ist nicht viel anders.

    Hier wieder das Grundgerüst:
    [php]Sub CHANGE_XML_FILE

    Dim objTagPfad
    Set objTagPfad = HMIRuntime.Tags("Pfadname_XML_Datei")

    Dim XML
    Set XML = CreateObject("MSXML2.DOMDocument")

    Dim OpenXML
    objTagPfad.Read
    OpenXML = XML.Load(objTagPfad.Value)

    If OpenXML = True Then
    ...... //Hier werden wir nun weiter darauf eingehen. Z.B. Zugriff auf ein Node in der XML-Datei um es auszulesen oder zu beschreiben
    End If
    Set XML = Nothing
    End Sub
    [/php]

    Damit man nun ein Node in der Datei ändern kann, greifen wir wie beim Lesen auf diesen Node zu.
    Jedoch weisen wir ihm nun einen Wert zu, anstelle das wir einen auslesen:
    [php]
    Dim objTagBandgeschw
    objTagBandgeschw.Read
    XML.documentElement.selectSingleNode("DatenMitte/BandGeschw").text = CStr(objTagBandgeschw.Value)
    [/php]

    Das Ganze sieht dann komplett so aus:
    [php]Sub CHANGE_XML_FILE

    Dim objTagPfad
    Set objTagPfad = HMIRuntime.Tags("Pfadname_XML_Datei")

    Dim XML
    Set XML = CreateObject("MSXML2.DOMDocument")

    Dim OpenXML
    objTagPfad.Read
    OpenXML = XML.Load(objTagPfad.Value)

    If OpenXML = True Then
    Dim objTagBandgeschw
    objTagBandgeschw.Read
    XML.documentElement.selectSingleNode("DatenMitte/BandGeschw").text = CStr(objTagBandgeschw.Value)
    XML.save(objTagPfad.Value)
    End If
    Set XML = Nothing
    End Sub
    [/php]

    So das wars erstmal. Hoffe, ich konnte euch damit ein wenig in die XML-Geschichte unter WinCC einführen.

    Gruß,
    Krumnix
    Geändert von Krumnix (15.12.2010 um 13:15 Uhr)
    Kommt Zeit.... Kommt Rat.... In der Tat.
    Gartenlampe mit Windenergie anstelle von Solar? Bei Interesse -> PN

  4. Folgende 2 Benutzer sagen Danke zu Krumnix für den nützlichen Beitrag:

    JesperMP (16.12.2010),rostiger Nagel (16.12.2010)

  5. #3
    Registriert seit
    20.06.2003
    Ort
    Sauerland.NRW.Deutschland
    Beiträge
    4.850
    Danke
    78
    Erhielt 800 Danke für 543 Beiträge

    Standard

    habe die beiträge mal in die FAQ kopiert
    .
    mfg Volker .......... .. alles wird gut ..

    =>Meine Homepage .. direkt zum Download

    Meine Definition von TIA: Total Inakzeptable Applikation

  6. #4
    Registriert seit
    06.10.2004
    Ort
    Kopenhagen.
    Beiträge
    4.624
    Danke
    377
    Erhielt 801 Danke für 642 Beiträge

    Standard

    Frage:

    In diese Zeile wird mit ein CStr ein Zahlenwert in ein String umgewandelt:
    Code:
    XML.documentElement.selectSingleNode("DatenMitte/BandGeschw").text = CStr(objTagBandgeschw.Value)
    Wenn ich CSV Dateien erzeuge per VBS, habe ich das Problem das CStr die Dezimaltrenner abhängig von die aktuellen Benutzer-Sprache wählt.
    Z.B.: Deutsch = ",". Englisch = "."
    Wenn das auch so bei XML ist finde ich es ziemlich enttäuschen.
    Gibt es in XML nicht die möglickheit reine Zahlenwerten zu speichern, irgendetwas wie
    Code:
    XML.documentElement.selectSingleNode("DatenMitte/BandGeschw").value = objTagBandgeschw.Value
    ?
    Jesper M. Pedersen

  7. #5
    Krumnix ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    05.11.2004
    Ort
    Schweiz
    Beiträge
    1.135
    Danke
    224
    Erhielt 127 Danke für 85 Beiträge

    Standard

    Ja, das stimmt. Wenn ich .CSV-Export mache, wandelt er mir die Zahlen mit einem , auch in einen . wenn ich im BS Englisch als Sprache drin hab.

    Ich muss gestehen, das ich das bei XML noch nicht überprüft habe.
    Da ich das XML aber nur zum Sichern und Laden von Rezepten oder Datenlogger nutze,
    hat mich das bisher noch nicht gestört, weil die Übergabe der Werte wohl so funktionieren, das WinCC
    keine Probleme damit bekommt, ob , oder . drin ist.
    Ich denke, das WinCC hier auch auf die Spracheneinstellung des BS zugreift.

    Ich teste das mal aus, wenn ich wieder an der Anlage bin. Die ist nämlich in Englisch
    Kommt Zeit.... Kommt Rat.... In der Tat.
    Gartenlampe mit Windenergie anstelle von Solar? Bei Interesse -> PN

  8. #6
    Registriert seit
    06.10.2004
    Ort
    Kopenhagen.
    Beiträge
    4.624
    Danke
    377
    Erhielt 801 Danke für 642 Beiträge

    Standard

    Was denkst du über ob es ein .value property gibt, anstatt .text ?
    Jesper M. Pedersen

  9. #7
    Krumnix ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    05.11.2004
    Ort
    Schweiz
    Beiträge
    1.135
    Danke
    224
    Erhielt 127 Danke für 85 Beiträge

    Standard

    Ein .Value gibt es leider nicht.
    Zumindest wenn ich das eingebe und das Script laufen lasse, kommt ein
    Fehler.

    Ich informier mich mal, ob es ggf. noch was anderes gibt.
    Aber wie gesagt, macht es im reinen WinCC-Betrieb keine Probleme.
    Wenn man die .XML-Datei aber extern in einem Editor dann bearbeiten will,
    ist die Sprache ein Hindernis.
    Kommt Zeit.... Kommt Rat.... In der Tat.
    Gartenlampe mit Windenergie anstelle von Solar? Bei Interesse -> PN

  10. #8
    Registriert seit
    31.08.2009
    Beiträge
    20
    Danke
    2
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Hallo ich hab noch ein kleines Problem mit dem Auslesen einer XML Datei

    Code:
     <SalesOrderNumber>10124564</SalesOrderNumber> 
     
     <SalesOrderItem>00010</SalesOrderItem> 
     
     <CustomerName>Mike Customer</CustomerName> 
     
     </WorkOrderHeader>
    - <WorkOrderComponents>
     <CurrentWorkOrderItem>10</CurrentWorkOrderItem> 
     
     <ComponentNumber>180118</ComponentNumber> 
     
     <ComponentDescription>Transparentweiss</ComponentDescription> 
     
     <DosingQuantity>1.000</DosingQuantity> 
     
     <DosingUOM>KG</DosingUOM> 
     
     <DosingUOM_ISO>KGM</DosingUOM_ISO> 
     
     <ComponentReservationNumber>7834543</ComponentReservationNumber> 
     
     <ComponentReservationItemNumber>1</ComponentReservationItemNumber> 
     
     <ComponentProductionPlant>0003</ComponentProductionPlant> 
     
     <ComponentStorageLocation>0003</ComponentStorageLocation> 
     
     <ComponentOperation>0010</ComponentOperation> 
     
     <ComponentBatchNumberRequired>X</ComponentBatchNumberRequired> 
     
     </WorkOrderComponents>
     
     
    - <WorkOrderComponents>
     <CurrentWorkOrderItem>9999</CurrentWorkOrderItem> 
     
     <ComponentNumber>58242</ComponentNumber> 
     
     <ComponentDescription>Metalest 26-VF</ComponentDescription>
    Und zwar möchte ich mir die Componenten Auslesen. Hierfür hab ich folgendes script geschrieben/zusammengefügt.

    Code:
    Dim i,p
    Dim XMLChildnodes
    Dim Eintraege
    Dim TagElement
    Dim XML 
    Set XML = CreateObject("MSXML2.DOMDocument")
    Dim OpenXML
    OpenXML = XML.Load("D:\DELETE\a.xml")
    If OpenXML = True Then
    Set TagElement = XML.getElementsByTagName("WorkOrderComponents")
        For p = 0 To TagElement.length - 1
            For Each XMLChildnodes In TagElement.Item(p).childNodes
     
    '******** Childnodes nacheinander ausgeben **********  
              For Each Eintraege In XMLChildnodes.childNodes
    '      ???  MsgBox       'Ausgabe von Werten die in den Klammern stehen <>
          MsgBox (Eintraege.text)   'Ausgabe Textinhalt
        Next
            Next
        Next
    Else
        Set XML = Nothing
        Set TagElement = Nothing
            MsgBox "Error: Cannot open XML File:" & vbCrLf & Pfad & vbCrLf & "Check XML-File", vbCritical, "Fatal Error"
        Exit Sub
    End If
    Set XML = Nothing
    Set TagElement = Nothing
    nun hab ich das Problem, dass nicht bei dem XML File nicht immer alle childnodes vorhanden sind, sondern ab und zu eines fehlen kann.
    nun wollte ich zur sicherheit die Variablenwerte abrufen und vorab prüfen.
    Kann mir jemand helfen wie ich zumbeispiel den wert <ComponentNumber> eingelesen bekomme um ihn zu vergleichen?
    Vielen dank für die unterstützung.

    Denke es fehlt nur der richtige befehl. die Werte kann ich mir ja schon ausgeben lassen.
    Zitieren Zitieren Variablenwert einlesen aus XML Datei  

  11. #9
    Registriert seit
    31.08.2009
    Beiträge
    20
    Danke
    2
    Erhielt 1 Danke für 1 Beitrag

    Standard

    hätte einfach eine ebene höher mit meinen befehlen ansetzten müssen

    Code:
    '******** Childnodes nacheinander ausgeben **********  
          MsgBox (XMLChildnodes.baseName)      
             For Each Eintraege In XMLChildnodes.childNodes
    Danke trotzdem
    Zitieren Zitieren Fehler gefunden  

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

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Ich hätte es schön gefunden wenn du nicht den FAQ zugemüllst hättest, sondern
    im Ordner HMI einen eigenen Thread eröffnet, mit einen Link auf dem FAQ.

    Das wär Elegant gewesen.

Ähnliche Themen

  1. S7 1200 Daten exportieren
    Von joe_jonson im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 11.08.2011, 22:11
  2. WinCC RT Daten in csv Datei exportieren
    Von themasterchris im Forum HMI
    Antworten: 2
    Letzter Beitrag: 10.08.2011, 18:00
  3. Daten von einem OPC Server in Excel Tabelle exportieren?
    Von nate im Forum Hochsprachen - OPC
    Antworten: 7
    Letzter Beitrag: 16.02.2011, 21:02
  4. Antworten: 1
    Letzter Beitrag: 15.12.2010, 12:47
  5. Kurvenschreiber-Daten von PID-Control exportieren?
    Von TempeltonPeck im Forum Simatic
    Antworten: 15
    Letzter Beitrag: 04.03.2010, 15:41

Lesezeichen

Berechtigungen

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