Textdatei mit Script einlesen

idefixsps

Level-1
Beiträge
20
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen und schönen Abend,
ich möchte eine Textdatei die 20 Werte in 20 Zeilen ohne Trennzeichen stehen hat mit einem Script einlesen.
Mit Scripte hab ich keine Erfahrung, kann mir jemand helfen?

Folgendes habe ich versucht:
Textdatei C:\test.txt erstellt die 2 Werte untereinander stehen hat
Unter WinCC zwei EAFelder erstellt (Daten1 + Daten2) und mit einer "InternenVariable" vom Typ "Int" belegt
Eine Schaltfläche erstellt und mit "Drücken" das Skrip verknüpft

so und jetzt fehlt mir noch das Script, hat jemand ein Beispiel vielleicht?

Bin über jede Hilfe dankbar

DANKE
Martin
 
... naja ... mehr als einen Beispielcode für dein Vorhaben liefern können wir kaum tun.
Es gibt zu den einzelnen Befehlen auch noch WinCCFlexibel-Hilfe - immer vorausgesetzt das du mit dieser Visu arbeitest. Ansonsten gibt es natürlich auch noch von Microsoft (z.B. innerhalb von Excel) die VB-Script-Hilfe.

Wie soll es deiner Meinung nach nun weiter gehen ...?

Gruß
Larry
 
Hallo Larry,
vielen Dank für deine Antwort. Leider kenne ich mich mit Scripte gar nicht aus und deshalb auch meine "blöden" Fragen.
Kann mir jemand bitte mit dem Code behilflich sein der genau meine "Problemstellung" löst?

Folgendes habe ich vorbereitet:
1. Textdatei C:\test.txt erstellt die 2 Werte untereinander stehen hat
2. unter WinCC zwei EAFelder erstellt (Daten1 + Daten2) und mit einer "InternenVariable" vom Typ "Int" belegt
3. eine Schaltfläche erstellt und mit "Drücken" das Skrip verknüpft
4.....

BIN UM JEDE HILFE DANKBAR
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Martin,
bitte fühle Dich nicht auf den Schlips getreten, aber auch ich habe keine Ahnung von Scripten und habe noch nie mit WinCC gearbeitet, aber das Beispiel in dem von Larry angegebenen Link ist eigentlich recht einfach zu verstehen.

1. Variablen definieren
2. Dateiobjekt erzeugen
3. Variable setzen (1 dürfte lesen bedeuten für open)
4. Datei öffnen (Hier müsstest Du Deinen Pfad und Deine Datei eintragen)
5. Jeweils eine Zeile lesen und einer Variable zuordnen
6. Datei/Dateiobjekt schließen

FERTIG

Nachtrag: Obiges gilt für WinCE, selbiges für Windows folgt noch
 
Zuletzt bearbeitet:
Hallo Oliver,
danke für deine Antwort.
Habe jetzt folgendes Probiert, funktioniert aber nicht...

Set fso = CreateObject("Scripting.FileSystemObject")
Set fs = CreateObject("WScript.Shell")

Set TextFile = fso.openTextFile("C:\test.txt", 1)
x = 0
Do While textfile.atendofstream <> True
x = x + 1
name("EA-Feld_5") = TextFile.readline
name("EA-Feld_13") = TextFile.readline
Loop
textfile.close

Wo sage ich in diesem Script, welche Zeile in welches Feld geschrieben wird?
 
Hallo,

in der in Beitrag #2 verlinkten FAQ gibt es das Skript SettingsIniLaden()
Das ist dafür gedacht um benannte Werte aus einer Textdatei auszulesen, welche so aufgebaut ist:
Aufbau Textdatei schrieb:
Daten1 = 1234
Daten2 = 5678
Name=Wert

Das Skript SettingsIniLaden() kannst Du als Vorlage für Dein Skript verwenden.
Ich kürze es Dir mal auf das Wesentlichste
- Datei öffnen
- Wert 1 auslesen
- Wert 2 auslesen
- Datei schließen

Du müßtest noch Fehlerreaktionen dazu programmieren, falls Datei-öffnen fehlschlägt oder nicht genug Zeilen lang oder

Werte nicht zulässig oder ...

Code:
Const ForReading = 1
Dim fso, f, infile

infile = "C:\test.txt"

Set fso = CreateObject("Scripting.FileSystemObject")

If Not fso.FileExists(infile) Then 'Datei ist nicht vorhanden --> Fehlermeldung
    ShowSystemAlarm "Datei '" & infile & "' nicht gefunden."
    Exit Sub

Else 'Datei ist vorhanden --> Werte lesen
    Set f = fso.OpenTextFile(infile, ForReading, False)

    SmartTags("Daten1") = f.ReadLine

    SmartTags("Daten2") = f.ReadLine

    f.Close
End If

Tip: mache Dir ein Meldefenster in die Vorlage und eine Meldeanzeige für Meldeereignisse der Meldeklasse System in ein Bild, damit Du die zu erwartenden Fehlermeldungen sehen und lesen kannst.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Harald,
danke für deine Hilfe.

Wo und wie kann ich die gelesenen Werte dann in eine Variable schreiben und anzeigen lassen?

Das Script führe ich mit "klicken" einer Schaltfläche aus. Beim Generieren zeigt es schon mal keinen Fehler mehr an......
 
Zuletzt bearbeitet:
Code:
    SmartTags("Daten1") = f.ReadLine  [COLOR="#008000"]' liest die erste Dateizeile in die Variable "Daten1"[/COLOR]

    SmartTags("Daten2") = f.ReadLine  [COLOR="#008000"]' liest die zweite Dateizeile in die Variable "Daten2"[/COLOR]

Die Variablen "Daten1" und "Daten2" sind jeweils die Prozessvariable der zwei EA-Felder.

Harald
 
Bei mir ist die Textdatei aber nicht so aufgebaut

Zeile1: Daten1 = 1234
Zeile2: Daten2 = 5678

sondern so:

Zeile1: 22
Zeile2: 33

es stehen rein nur zweistellige Zahlen, keine Bezeichnungen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
ich bekomme beim Generieren keinen Fehler mehr, allerdings wenn ich über die Schaltfläche das Script ausführe bekomme ich keine Werte in den EA-Feldern...
anbei einige Bilder, ich hoffe diese sagen mehr als meiner Worte....
button.JPGEA-FELD.JPGscript.JPGvariable.JPG
 
Mann-o-mann - sei mal nicht so schlampig und denke auch ein klein wenig mit. ;)
Im Skript müssen die SmartTags-Variablennamen natürlich genau so heißen wie die Prozessvariablen, welche Du in den EA-Feldern anzeigst. Dann klappt es auch.
- EA-Feld1: Prozessvariable "Istwerte DB Temperaturen.Daten1"
- EA-Feld2: Prozessvariable "Istwerte DB Temperaturen.Daten2"
- im Skript:
Code:
...
    Set f = fso.OpenTextFile(infile, ForReading, False)

    SmartTags("Istwerte DB Temperaturen.Daten1") = f.ReadLine
    SmartTags("Istwerte DB Temperaturen.Daten2") = f.ReadLine

    f.Close
End If

Schreibe in Deine Textdatei:
C:\DatenHG.txt schrieb:

Wenn Du dann das Skript ausführst, dann wird 22 in "...Daten1" geschrieben und 33 in "...Daten2".

Wenn nicht, dann kontrolliere noch mal genauestens die Projektierung Deiner zwei EA-Felder.
Deine beiden Variablen hast Du nicht als HMI-interne Variablen projektiert sondern als PLC-Variablen (DB1.DBD...). Werden den Variablen vielleicht in der SPS auch Werte zugewiesen?

Harald
 
Grundsätzlich würde ich darauf achten, das die Variable dem erwartenden Format entspricht.
Deklariert ist Real, im Beispiel sind nur Integer, evtl muss die Zahl erstmal von String in ein
gültiges Format mit Cxy gewandelt werden. Vom String sollten eventuelle Leerzeichen mit
der 'TRIM' Funktion entfernt werden.

Vielleicht sollte ersteinmal mit 'ShowSystemAlarm' der gelesene Wert über das Meldessystem
des Panel's ausgegeben werden. Vielleicht liest das Script überhaupt nichts.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Morgen Harald,
ich wollte mit den Beispielbild zeigen, dass ich einmal eine HMI-interne Variable und einmal eine PLC-Variable aus einem DB verwende und mit beiden nicht funktioniert.

Script-Code und Textdatei sind genauso wie du beschrieben hast, leider wird in den EA-Feldern immer noch nichts angezeigt...
Mach ich beim ausführen des Scripts etwas falsch? Schaltfläche/Drücken/Script verlinkt ? :confused:

Danke
 
Guten Morgen rostiger-Nagel,
ich habe REAL deklariert weil ich reine zweistellige Zahlen aber auch zweistellige Zahlen mit einer Kommastelle einlesen möchte. Dazu ist REAL doch richtig gewählt oder?
Ich glaube mein Fehler liegt irgendwo beim Ausführen des Scripts.... Keine Ahnung :oops:
 
Guten Morgen Martin.

Wenn Du Deine Datei C:\DatenHG.txt umbenennst oder löschst - gibt das Skript dann die Fehlermeldung aus (Datei 'C:\DatenHG.txt' nicht gefunden.)?

Wenn Du nicht sicher bist, ob das Skript überhaupt aufgerufen wird und was es macht, dann mache Dir Test-Ausgaben rein, z.B. Werte auf HMI-interne-Variablen (SmartTags) schreiben oder einfach mit ShowSystemAlarm Meldungen ausgeben:
Code:
Const ForReading = 1
Dim fso, f, infile

[COLOR="#FF0000"]ShowSystemAlarm "1 Skript Read_data: gestartet"[/COLOR] [COLOR="#008000"]'Test-Ausgabe, im fertigen Skript wieder entfernen[/COLOR]

infile = "C:\DatenHG.txt"

Set fso = CreateObject("Scripting.FileSystemObject")

If Not fso.FileExists(infile) Then [COLOR="#008000"]'Datei ist nicht vorhanden --> Fehlermeldung[/COLOR]
    ShowSystemAlarm "Datei '" & infile & "' nicht gefunden."
    Exit Sub

Else [COLOR="#008000"]'Datei ist vorhanden --> Werte lesen[/COLOR]
    [COLOR="#FF0000"]ShowSystemAlarm "2 Skript Read_data: Datei '" & infile & "' einlesen"[/COLOR] [COLOR="#008000"]'Test-Ausgabe[/COLOR]
    Set f = fso.OpenTextFile(infile, ForReading, False)

    SmartTags("Istwerte DB Temperaturen.Daten1") = f.ReadLine [COLOR="#008000"]'liest die erste Dateizeile in die Variable "...Daten1"[/COLOR]

    SmartTags("Istwerte DB Temperaturen.Daten2") = f.ReadLine [COLOR="#008000"]'liest die zweite Dateizeile in die Variable "...Daten2"[/COLOR]

    f.Close
End If

[COLOR="#FF0000"]ShowSystemAlarm "3 Skript Read_data: erfolgreich beendet"[/COLOR] [COLOR="#008000"]'Test-Ausgabe[/COLOR]

Falls das Skript nicht aufgerufen wird: erstelle eine völlig neue Schaltfläche und projektiere an das Ereignis "Drücken" den Aufruf Deines Skriptes "Read_data".
Mache mal "Extras > Temporäre Dateien löschen" und "Alles neu generieren".

Hast Du eine Meldeanzeige und/oder ein Meldefenster für Systemmeldungen in Deinem Projekt drin?
Tip: mache Dir ein Meldefenster in die Vorlage und eine Meldeanzeige für Meldeereignisse der Meldeklasse System in ein Bild, damit Du die zu erwartenden Fehlermeldungen sehen und lesen kannst.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Harald,
vielen Dank für deine ausführliche Rückantwort und Hilfe.
Ich bin jetzt einen Schritt weitergekommen anhand der Meldeanzeige... Sobald ich die Schaltfläche für den Aufruf vom Script "Read_data" betätige kommt im Meldefenster: "Datei C:\DatenHG.txt nicht gefunden"

Die Datei liegt genau so geschrieben auf C:\
Habe auch mal auf den Datenträger D:\ kopiert, unbenannt in "Daten.txt" und auch die Windows Berechtigung von "Jeder" auf Vollzugriff gesetzt... Ich kenn mich langsam nicht mehr aus :-(
Hast du noch eine Idee?
Was ist wenn ich die Daten in REAL einlesen, müsste doch passen oder?

DANKE
 
Warum das Skript die Datei nicht findet habe ich im Moment keinen Plan. Ich würde zum ganz sichergehen der korrekten Schreibweise in einem Explorer die Datei "umbenennen" + den Dateiname kopieren und in das Skript einfügen. Wenn das nicht hilft, dann die 4 Zeilen von If.. bis Else.. und das End If löschen oder auskommentieren.

Zur Sicherheit die Nachfrage: was für ein HMI programmierst Du da? Eine WinCC flexible RT auf Windows...was?

Dank VBS liest das Skript auch in REAL-Variablen korrekt ein. So wie Du es brauchst. Das ist kein Problem.

Harald
 
Zuletzt bearbeitet:
Probiere mal, die Datei im Skript selber zu erzeugen und wieder einzulesen. Wenn das klappt, dann suche mal wo die Datei angelegt wurde.
Code:
Const ForReading = 1, ForWriting = 2
Dim fso, f, infile

[COLOR="#FF0000"]ShowSystemAlarm "1 Skript Read_data: gestartet"[/COLOR] [COLOR="#008000"]'Test-Ausgabe, im fertigen Skript wieder entfernen[/COLOR]

infile = "C:\DatenHG.txt"

Set fso = CreateObject("Scripting.FileSystemObject")

[COLOR="#FF0000"]'Datei selber erzeugen
Set f = fso.CreateTextFile(infile, True)
f.WriteLine "22"
f.WriteLine "33"
f.Close[/COLOR]

If Not fso.FileExists(infile) Then [COLOR="#008000"]'Datei ist nicht vorhanden --> Fehlermeldung[/COLOR]
    ShowSystemAlarm "Datei '" & infile & "' nicht gefunden."
    Exit Sub

Else [COLOR="#008000"]'Datei ist vorhanden --> Werte lesen[/COLOR]
    [COLOR="#FF0000"]ShowSystemAlarm "2 Skript Read_data: Datei '" & infile & "' einlesen"[/COLOR] [COLOR="#008000"]'Test-Ausgabe[/COLOR]
    Set f = fso.OpenTextFile(infile, ForReading, False)

    SmartTags("Istwerte DB Temperaturen.Daten1") = f.ReadLine [COLOR="#008000"]'liest die erste Dateizeile in die Variable "...Daten1"[/COLOR]

    SmartTags("Istwerte DB Temperaturen.Daten2") = f.ReadLine [COLOR="#008000"]'liest die zweite Dateizeile in die Variable "...Daten2"[/COLOR]

    f.Close
End If

[COLOR="#FF0000"]ShowSystemAlarm "3 Skript Read_data: erfolgreich beendet"[/COLOR] [COLOR="#008000"]'Test-Ausgabe[/COLOR]

Harald
 
Zurück
Oben