Variablen aus TXT Datei zyklisch beschreiben

saumann

Level-1
Beiträge
12
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich möchte mehrere Variablen zyklisch alle 100ms mit Werten aus einer TXT Datei beschreiben bis das Ende erreicht ist. Mit nur einer Variablen klappt das ja auch schon fast ganz gut.
1.PNG
Code:
Dim textfile,fs,laenge,i,parameter,wert,zeile,zeit,pause
Set fs = CreateObject("Scripting.FileSystemObject")
Set textfile = fs.OpenTextFile("C:\Users\user\Desktop\Neuer Ordner\test.tab", 1) 'datei öffnen zum lesen
Do While textfile.AtEndOfStream <> True 
zeile = textfile.ReadLine
i=InStr(zeile,"=") 'trennzeichen suchen
laenge = Len(zeile)
wert = Right(zeile,laenge  -i )
'zuweisungen Radial
 SA_NV = wert 
 pause = 0.1
zeit = Timer 
Do While Timer < zeit + pause
Loop
 
Loop

Mein Problem ist:
1. Sobald das Ende erreicht ist kommt eine Fehlermeldung "Variable SA_NV: Konvertierungsfehler"
2. Ich habe insgesamt 9 Variablen die beschrieben werden sollen alle INT jede Spalte in der TXT Datei soll einer Variablen zugewiesen werden.

Hier ein Beispiel wie es in der TXT Datei steht:

5487 5488 2154 5623 3548 5487 6958 5412 1125
6254 5233 6598 9855 2154 4455 2121 8887 6666
3211 5452 5455 5454 2236 5487 5433 3325 5487
0000 0000 0000 0000 0000 0000 0000 0000 0000

Kann man das irgendwie mit LEFT, RIGHT Befehlen machen? Wenn ja wie?
Weiß hier jemand eine Lösung?

Vielen Dank vorab
MfG
 
Hallo,
ich habe dein Problem jetzt noch nicht wirklich verstanden.
Wenn du die eingelesene Zeile in ihre Einzel-Elemente zerlegen willst so ist dafür der Befehl Split zuständig, vorausgesetzt du hast zwischen den Einzel-Elemente immer das gleiche Trennzeichen (z.B. das ' ' (also Space) stehen.
Split liefert dir dann ein Array (in der entsprechenden Größe) mit den Einzelelementen zurück.
Wieso steht in deinem Script in Zeile 6, dass du als Trennzeichen ein '=' suchst und in deiner Txt-Datei findet sich das nicht ?

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Larry,
ja Du hast Recht Zeile 6 sollte ein Leerzeichen stehen " ".
Wie ist das mit dem Split gemeint? Wie müsste das im Skript aussehen.
Code:
Do While textfile.AtEndOfStream <> True 
zeile = textfile.ReadLine
i=InStr(zeile," ") 'trennzeichen suchen
laenge = Len(zeile)
wert2 = Right(zeile,laenge  -i)
wert3 = Right(zeile,laenge  -i -1)
wert = Left(zeile,  i -1)
'zuweisung Schräglauf
 SA_NV = wert 
 pause = 0.1
zeit = Timer 
Do While Timer < zeit + pause
Loop
'zuweisung Sturz
 CA_NV = wert2 
 pause = 0.1
zeit = Timer 
Do While Timer < zeit + pause
Loop
'zuweisung Radlast
 WL_NV = wert3 
 pause = 0.1
zeit = Timer 
Do While Timer < zeit + pause
Loop
Loop
Ich habe es jetzt so, wenn ich im Txt nur zwei Spalten habe und im Skript "wert3 = Right(zeile,laenge -i)" und die letzte Schleife weglasse funktioniert das ganze aber sobald ich eine dritte Spalte im Txt dazunehme kommt der Fehler "Typkonflikt"
Ich meine was müsste im Skript anstelle von "wert3 = Right(zeile,laenge -i)" stehen damit die Variable WL_NV dem wert3 oder im Txt der dritten Spalte zugewiesen werden kann?
Geht das überhaupt so wie ich das versuche oder bin ich auf dem falschem Weg denn es sind ja insgesamt 9 Variablen die ich so zuweisen müsste?
Gibt es da noch andere Möglichkeiten?
Gruß
 
arrayinhalt = split(zeile," ",-1) '-1 besagt alle.
'arrayinhalt sagt dir wieviel Elemente das array enthält

element = arrayinhalt(x)
'arrayinhalt(x) ist der wert des jeweiligen elements. bei dir wäre das von 0 bis 8
 
Naja ... im Prinzip hat Volker es ja schon geschrieben ...
Als Code sähe das dann in etwa so aus :
Code:
Dim VarListe

Do While textfile.AtEndOfStream <> True 
zeile = textfile.ReadLine
VarListe = split(Zeile , " ")

wert = VarListe(0)
wert2 = VarListe(1)
wert3 = VarListe(2)

usw. ...
Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ist das richtig das von Anfang ab steht es "0000" in alle Zellen, bevor das Skript etwas reinschreibt ?
Du steuerst wie lange das Skript laufen soll bei checken ob du am Ende von den bestehende Datai ist ? ("bis das Ende erreicht ist").

Wenn du ohne die mit "0000" gefüllte Zellen leben kannst, dann anstatt in bestehende Zeilen zu schreiben, einfach neue Zeilen schreiben.
Dies ist viel einfacher, du brauchst du kein Split o.Ä.
Du brauchst dann ein anderen Verfahren um das Skript zu beenden. Vielleicht ein Zähler von geschreiebene Zeilen.
 
Hallo,
nun klappt die Vorgehensweise aber dafür habe ich ein neues Problem wenn ich das ganze mit nur einer Variablen starte ist alles ok aber sobald mehrere dazukommen wird das nicht mehr mit 10Hz alle 100ms abgetastet sondern es wird in die Länge gezogen. Hier ein Auszug aus meinem Skript
Gibt es da vielleicht eine andere Vorgehensweise?
SA_NV = wert
pause = 0.1
zeit = Timer
Do While Timer < zeit + pause
Loop
 
Zuviel Werbung?
-> Hier kostenlos registrieren
das ist absoluter bullshit und funktioniert nicht so wie du denkst.
pause = 0.1
zeit = Timer
Do While Timer < zeit + pause
Loop
der timer liefert dir die zeit in ganzen Sekunden.
die do..Loop-schleife läuft also mindestens 1 sekunde.

und warum wird das überhaupt verzögert?

weiterhin musst du bedenken, dass immer nur 1 Skript laufen kann. das ganze wird also gestapelt.
wenn deine aufrufzeit für das Skript kürzer ist als die bearbeitungszeit schmiert dein System früher oder später ab.
ich glaube die stapeltiefe ist auch begrenzt. bin mir da aber jetzt nicht sicher.
 
Hallo Volker,
danke für den Hinweis. gibt es denn überhaupt eine Möglichkeit das so auszuführen wie ich mir das vorgestellt habe?
 
Wenn ich es richtig verstanden habe:
Aufgabe: 9 analoge Messdaten mit 100 ms Zyklus ablesen und in ein CSV Datei speichern. Die Messdaten sollen in Spalten in der CSV aufgeteilt sein.

Problem ist die 100 ms Zykluszeit.
Das bekommst du nicht genau wenn du versuchst et völlig mit ein VBS Skripts zu lösen.
Dazu gibt es mehrere weitere VBS Probleme, z.B. das von Volker genannte Problem.

Lösungsvorschlag:
Ein Zeitgetriggerte Interrupt in der SPS einrichten (OB35).
Dann in der SPS mittels OB35, die Analogwerte einlesen und in ein (oder mehrere) DBs abspeichern.
Wenn ein Satz Messdaten fertig eingelsen ist, über ein VBS Skript in der HMI die Messdaten in ein CSV Datei abspeichern.
Einfach.

edit: Einzigste Problem wäre wenn dies nicht in ein bestimmten Zeit fertig sein muss, mit ein bestimmte anzahl Messdaten.
Wenn es prinzipiell "ständig" passieren muss, dann wird es problematisch weil das Speicher im SPS begrenzt ist.
In den Fall brauchst du vielleicht ein echten datenerfassung/logging system.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn ich es richtig verstanden habe:
Aufgabe: 9 analoge Messdaten mit 100 ms Zyklus ablesen und in ein CSV Datei speichern. Die Messdaten sollen in Spalten in der CSV aufgeteilt sein.
Andersrum. er will die variablen mit den Daten aus der Textdatei füttern.

@saumann
die do..Loop auf jeden fall mal weglassen und, wie jespermp schon schrieb, das Skript über die Steuerung anstossen.

100ms halte ich aber für zu schnell.
selbst wenn du für deine variablen eine aktualisierungszeit von 100ms einstellst heisst das nicht das alle gleichzeitig aktualisierrt werden.
um die Daten sicher nach jedem einlesen in die Steuerung zu bekommen musst du das ohnehin über eine Rezeptur lösen (falls wir hier über eine siemens-visu sprechen)
 
Vielen Dank für die Vorschläge,
habe jetzt eine

pause = 0.1
zeit = Timer
Do While Timer < zeit + pause
Loop

auf alle Variablen gleichzeitig angewendet und siehe da es klappt. Allerdings nur auf meinem Projektierungsrechner (64Bit) sobald ich das auf den Anlagenrechner (32Bit) transferiere klappt das mit den 100ms nicht mehr. Kann das am Rechner liegen?
Werde das mit den Rezepten mal versuchen allerdings kann das schwierig werden da ein Txt File schon mal an die 60000 Zeilen haben kann.
Gruß
 
pause = 0.1
zeit = Timer
Do While Timer < zeit + pause
Loop

Wie ich schon schrieb verzögerst du mit dem do..Loop um (in deinem fall) 1 sekunde.
zeit = timer z.b. 21000 Sekunden (06:00:00 Uhr)
deine schleife kann keine pause von 0.1 sekunde machen da der nächste wert vom timer 21001 (06:00:01 Uhr) ist.

außerdem wirst du ein Problem haben, wenn du 23:59:59 (86399) erreichst. deine schleife würde verlassen werden bei 86399,1 -> also 86400.
den wert erreicht der timer aber nicht da als nächster wert 0 im timer steht. 86399 -> 0

ich hatte schon mal gefragt. warum überhaupt die verzögerungsschleife?

und ich behaupte mal, das du nicht 60000 zeilen alle 100ms einlesen kannst. und das mit einem Rezept dauert auch einen Moment.
wenn die Daten konsitent in deinem Programm benötigt werden musst du die rückmeldung vom Rezept abwarten.
also Rezept schreibt Daten in db10
Rezept meldet 4 (alles ok) zurück.
sps kopiert db10 in deinen arbeits-db.
 
Hallo,
ja ihr hattet alle Recht do..Loop ist Mist und nicht für sowas geeignet. Ich würde das jetzt gerne mit Rezepten ausprobieren allerdings hab ich damit noch nicht wirklich viel zu tun gehabt und bin mir nicht sicher wie ich da vorgehen soll. hat jemand einen kurzen Ansatz?
Danke und Gruß
 
Zuviel Werbung?
-> Hier kostenlos registrieren
60000 Zeilen in 100ms wird auch mit Rezepturen nix werden.
Auf welcher Hardware soll das Ganze laufen?
Bei solchen Anforderungen ist ein PC-basierter Controller wohl die beste Wahl.

Gruß
Dieter
 
Hallo Dieter,

414-2XG04
V 4.0.4

weißt Du zufällig wo man sich da preislich befindet? Auf den Siemens Seiten finde ich keine Preise.

Gruß
 
Wenn er an eine CSV-Datei immer nur Daten anhängen muss, ist das natürlich Unfug jede Zeite unnötigerweise einzulesen. Dazu setzt man den Dateizeiger auf das Ende der Datei, und schreibt an diese Position. Dann ist es mehr oder weniger egal, ob die Datei 10 oder 100.000 Zeilen besitzt.
 
Zurück
Oben