# ASCII File in WinCC Variable einlesen



## uz71 (4 Oktober 2006)

Hallo 

Wer kennt eine möglichkeit Werte aus einem ACSSII File (***.txt) auszulesen und dann in WinCC Variablen zu schreiben. Wenn möglich mit VBS für WinCC.
Gruss
uz


----------



## Praktikant (4 Oktober 2006)

hi,

das auslesen ist kein problem,
kannst du mal 2-3 datensätze posten

so short


----------



## uz71 (5 Oktober 2006)

*Ascii*

Hallo Praktikant

unser Mann der mir die ASCII Fils zur Verfügung stellt ist zur Zeit nicht erreichbar, ich werde wenn ich die Daten habe noch mal bei dir nachfragen.
Ist eine PN dann ok?
Gruss
uz


----------



## Praktikant (5 Oktober 2006)

ja klar, immer


----------



## Bender25 (6 Oktober 2006)

*räusper* Bitte postet doch das Zeugs hier. Interesiert doch bestimmt mehr.. U.a. auch mich *g*


----------



## Praktikant (6 Oktober 2006)

was immer ihr wollt 

allerdings bin ich ab dienstag auf dem weg nach china  
und erst ab donnerstag wieder im forum.

so short

achso : schönes wochenende


----------



## Bender25 (9 Oktober 2006)

Dann hast du ja den ganzen Montag noch Zeit *g*


----------



## Neuling74 (23 Oktober 2006)

*Daten aus Tab-Datei lesen*



Praktikant schrieb:


> hi,
> 
> das auslesen ist kein problem,
> kannst du mal 2-3 datensätze posten
> ...


 

Hallo Praktikant!
Ich bin neu hier und habe den Beitrag gerade gelesen. Ich bin Neuling was VBS angeht, soll jetzt aber auch aus einer *.tab Datei Daten auslesen und diese in Variablen schreiben. Ich habe allerdings keine Ahnung wie das funktioniert. Gibt es da eine Möglichkeit einen Quelltext mit Kommentaren zu bekommen? In WinCC finde ich nur die möglichkeit Datensätze zu importieren oder zu lesen. Aber das sind ja csv-Dateien.


----------



## Praktikant (23 Oktober 2006)

hi, wie sieht denn der datensatz aus ?


----------



## Neuling74 (23 Oktober 2006)

Der Datensatz ist in diesem Sinne keiner. Ich bekomme über Netzwerk eine Tab Datei, in der untereinander weg Werte eingetragen sind. 
Z.B. Di= 53.000 
      Da= 132.000
      n= 17
u.s.w

Diese Werte muss ich dann auslesen , in Variablen schreiben und an eine externe Steuerung weiterleiten. 
Wie gesagt, das Problem ist eben das VB-Script.  Mein Chef möchte dat gerne so und ich habe jetzt den Forschungsauftrag am Hals. Sonst arbeite ich zwar mit WinCC aber ohne VB Scripts. Dat tue ich jetzt zum ersten mal.


----------



## Praktikant (23 Oktober 2006)

hi, wenn ich dich richtig verstanden habe, wird die datei fortlaufend beschrieben und nicht mehr geschlossen. ist das richtig so ?


----------



## Neuling74 (23 Oktober 2006)

Leider nicht. Ich bekomme jedes mal eine neue Textdatei. Dieses macht die ganze Sache ja noch schwieriger. Eventuell muß ich mich da mit der Firma noch einmal auseinandersetzen. Aber soweit bin ich noch nicht. Ich müsste erstmal wissen, wie ich eine solche Datei überhaupt einlesen kann und die Werte in Variablen schreibe. Das würde mir erstmal reichen. Danke schon einmal für die Mühe.


----------



## Praktikant (23 Oktober 2006)

hi, das macht es nicht schwerer sondern leichter, wenn du mir jetzt noch alle möglichen variablen nennst, mache ich das script fertig.
da ich allerdings in china bin und es hier schon etwas später als in deutschland  ist, werde ich das script heute wohl nicht mehr fertig bekommen.
aber morgen ist ja auch noch ein tag. 

ich wuerde dir dann ein miniprojekt schicken


----------



## KalEl (23 Oktober 2006)

hier mal wie du das auch selber hinbekommst. 


```
[SIZE=2][COLOR=#0000ff]Dim[/COLOR][/SIZE][SIZE=2] textfile,fs,laenge,i,parameter,wert,zeile[/SIZE]
[SIZE=2][COLOR=#0000ff]Set[/COLOR][/SIZE][SIZE=2] fs = CreateObject("Scripting.FileSystemObject")[/SIZE]
[SIZE=2][COLOR=#0000ff]Set[/COLOR][/SIZE][SIZE=2] TextFile = fs.OpenTextFile("daten.txt", 1) [/SIZE][SIZE=2][COLOR=#008000]'datei öffnen zum lesen[/COLOR][/SIZE]
[SIZE=2][COLOR=#0000ff]Do[/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]While[/COLOR][/SIZE][SIZE=2] textfile.AtEndOfStream <> [/SIZE][SIZE=2][COLOR=#0000ff]true[/COLOR][/SIZE]
[SIZE=2]zeile = TextFile.ReadLine[/SIZE]
[SIZE=2]i=InStr(zeile,"=") [/SIZE][SIZE=2][COLOR=#008000]'trennzeichen suchen[/COLOR][/SIZE]
[SIZE=2]laenge = Len(zeile)[/SIZE]
[SIZE=2]parameter=Left(zeile,i-1)[/SIZE]
[SIZE=2]wert = Right(zeile,laenge - i -1)[/SIZE]
[SIZE=2][COLOR=#008000]'zuweisungen[/COLOR][/SIZE]
[SIZE=2][COLOR=#0000ff]If[/COLOR][/SIZE][SIZE=2] parameter = "Di" [/SIZE][SIZE=2][COLOR=#0000ff]Then [/COLOR][/SIZE][SIZE=2][COLOR=#ff0000]ptvar1[/COLOR][/SIZE][SIZE=2] = wert / 1000 [/SIZE][SIZE=2][COLOR=#008000]'wegen 3 Nachkommastellen[/COLOR][/SIZE]
[SIZE=2][COLOR=#0000ff]If[/COLOR][/SIZE][SIZE=2] parameter = "Da" [/SIZE][SIZE=2][COLOR=#0000ff]Then [/COLOR][/SIZE][SIZE=2][COLOR=#ff0000]ptvar2[/COLOR][/SIZE][SIZE=2] = wert[/SIZE]
[SIZE=2][COLOR=#008000]'usw[/COLOR][/SIZE]
[SIZE=2][COLOR=#0000ff]Loop[/COLOR][/SIZE]
```


----------



## Neuling74 (23 Oktober 2006)

Praktikant schrieb:


> hi, das macht es nicht schwerer sondern leichter, wenn du mir jetzt noch alle möglichen variablen nennst, mache ich das script fertig.
> da ich allerdings in china bin und es hier schon etwas später als in deutschland ist, werde ich das script heute wohl nicht mehr fertig bekommen.
> aber morgen ist ja auch noch ein tag.
> 
> ich wuerde dir dann ein miniprojekt schicken


 

Ach Du schande.  Ich habe leider noch nicht alle Daten. Einige kann ich dir aber mitteilen. Die anderen bräuchte ich dann ja nur anpassen,gell? Allerdings habe ich auch noch keine Adressen. Aber die brauchst Du ja auch nicht, oder? Wenn doch, sag noch einmal bescheid. Aber die holt sich WinCC doch automatisch glaube ich. 

dmin, dmax, Laenge_innen, Laenge_aussen, n, L_stu, L_sto

Die kommen auch in der Reihenfolge in der Textdatei vor.

Mehr angaben habe ich noch nicht. Aber wie gesagt, den Rest kann ich dann ja anpassen.
Ich danke Dir schon einmal und wünsche eine angenehme Nachtruhe. Wir hören bzw. lesen dann von einander


----------



## Neuling74 (23 Oktober 2006)

KalEl schrieb:


> hier mal wie du das auch selber hinbekommst.
> 
> 
> ```
> ...


 

Hallo KalEl!
Danke für deine Mühe. Werde ich dann mal probieren.


----------



## Neuling74 (23 Oktober 2006)

Hallo KalEl!

Habe das mal so eingegeben. Da sacht er mir aber das LEFT eine unbekannte Prozedur oder ein unbekanntes Argument ist.   Wie gesagt, ich habe da nicht viel Ahnung von. Wenn ich den Quellcode so sehe, kann ich das zwar irgendwie nachvollziehen, nur selber drauf kommen tue ich da nicht. In der angesprochenen Zeile frage ich doch nur ab, was links(also vor dem Trennzeichen) steht, richtig? Kann es sein, das WinCC diese Anweisung,oder wie immer man das nennt, nicht kennt? Gibt es da eine andere Möglichkeit?


----------



## Praktikant (23 Oktober 2006)

hi, das script ist fertig.
im zip-file habe ich zwei beispiel tab dateien reingepackt.
ich hoffe du kommst damit weiter


----------



## Neuling74 (23 Oktober 2006)

Man, das ging ja super schnell. Werde das dann mal probieren.
Danke erstmal. Werde mich dann morgen melden und Dir sagen ob es läuft. Was machst Du eigentlich in China wenn ich fragen darf


----------



## Praktikant (23 Oktober 2006)

steuerungen in betrieb nehmen


----------



## Neuling74 (23 Oktober 2006)

Hätte ich mir ja denken können.   Habe das Projekt geöffnet. Aber ich finde gar kein Script. Du hast es anscheinend mit Protool erstellt. Ich habe es in WinCC migriert(oder so ähnlich). ÄHHHH, aber wie gesagt, ich finde kein Script. Und die Button sind auch mit keiner funktion hinterlegt. 
Mache ich da jetzt einen Fehler?


----------



## Neuling74 (23 Oktober 2006)

Quatch.:twisted:  Ich habe es mit WinCC flexible geöffnet. Deshalb muss das konvertiert werden. Aber ein script habe ich trotzdem nicht. Wird das vielleicht nicht mit konvertiert? Das weiß ich nämlich jetzt nicht.


----------



## Praktikant (23 Oktober 2006)

ich habe es mit wincc 6.0 SP3a erstellt. 
script zum dialog oeffnen :


```
Sub OnClick(Byval Item)        
Dim strFilename, Dialog, fso
Dim Filename

Set Filename = HMIRuntime.Tags("Filename")
Set Dialog = CreateObject("MSComDlg.CommonDialog")

'Explorer-Dialog zum Speichern von Dateien
'Titelzeile
Dialog.MaxFileSize = 260 ' Init buffer (NECESSARY!)
'Dialog.Flags = &H1004 ' Datei muss vorhanden sein
Dialog.Flags = &H0004 ' datei muss nicht vorhanden sein

'Filter setzen
Dialog.Filter = "All Files (*.*)|*.*|"  & "TAB Files (*.tab) |*.tab|"

Dialog.DialogTitle = "Open Variable"

' Filter auf den Eintrag tab setzen
Dialog.FilterIndex = 2

'Flags setzen: Explorer-Dialog mit langen Dateinamen
Dialog.Flags = &H1814

Dialog.ShowOpen
'Dialog.ShowSave

' Dateiname in die variable schreiben
Filename.Value = Dialog.Filename 
Filename.Write ,1

Set Dialog = Nothing
End Sub
```
script zum datei lesen:


```
Sub OnClick(Byval Item)                     
'SPEICHER RESERVIEREN
Dim Filename
Dim fso, TABfile
Dim zeile
Dim var
Dim datensatz
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Dim dmax
Dim dmin
Dim L_sto
Dim L_stu            'DIE VARIABLEN AUS DER DATEI MUESSEN NAMENSGLEICH
Dim Laenge_aussen    'IM VARIABLENHAUSHALT VORHANDEN SEIN !!!!
Dim Laenge_innen
Dim n
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

'OBJEKTE UND VARIABLEN VERBINDEN
Set Filename         = HMIRuntime.Tags( "Filename" )

'FILEOBJEKT ERZEUGEN (WINDOWS-SCRIPT FUNKTION)
Set fso             = CreateObject( "Scripting.FileSystemObject" )

'DATEI ZUM LESEN ÖFFNEN
Set TABfile         = fso.OpenTextFile( Filename.Read(1) ,1, True )    

'DATEI BIS ZUM ENDE EINLESEN
Do While TABfile.AtEndOfStream <> True

    'ZEILE KOMPLETT EINLESEN                        
    zeile             = TABFile.ReadLine

    'ZEILE ZERLEGEN DAS GLEICHZEICHEN WIRD ALS TRENNZEICHEN BENUTZT                                     
    datensatz         = Split( zeile, "=", -1, 1 )                    

    'VARIABLE DYNAMISCH VERBINDEN    
    Set var         = HMIRuntime.Tags( datensatz(0) )                 

    'WERT SCHREIBEN
    var.Write( datensatz(1) ),1                                     

Loop

End Sub
```


----------



## KalEl (23 Oktober 2006)

das script ist vbscript. unter protool läuft das.
wincc kenne ich nicht. wincc sollte left aber auch kennen.
zur ausführung wird, denke ich, ohnehin der wsh(windows scripting host) von windows benutzt.

ja, left liesst den linken teil einer zeichenkette.

drück im script mal die rechte maustaste. dort kannst du dir die zur verfügung stehenden vb-funktionen anzeigen lassen.
zumindest ist das in protool so.


----------



## KalEl (23 Oktober 2006)

*warum sagst du das nicht gleich, das du flexible meinst.  *

*ihr solltet das schon genau angeben, da wincc und wincc flexible 2 verschiedene welten sind.:twisted: *

*unter flex muss mein script laufen.*

*das script vom praktikanten wird unter flex evtl nicht funktionieren.*


----------



## Neuling74 (23 Oktober 2006)

Alles klar, danke. Habe meinen Fehler gerade gefunden. Habe vor dem ersten echten Wert eine Zeile ohne = Zeichen gehabt. Daher macht der das nicht. Er erkennt dann in der ersten Zeile kein Trennzeichen und gibt daher die Fehlermeldung raus. Danke erstmal damit und mit dem anderen Vorschlag komme ich erstmal weiter. Wenn ich nicht weiter weiß, kann ich ja noch einmal nachfragen.


----------



## Praktikant (23 Oktober 2006)

ja stimmt, unter flex läuft es nicht oder doch?
ich bin aber auch von wincc ausgegangen


----------



## Neuling74 (23 Oktober 2006)

Asche auf mein Haupt. Tut mir echt leid . Werde es morgen probieren, vielleicht geht es ja doch. Muß jetzt leider was anderes erledigen. Werde es morgen früh aber sofort testen. Vielen Dank noch einmal.


----------



## volker (23 Oktober 2006)

@praktikant

sehr interessantes script.
split kannte ich gar nicht  ist aber gut. habe das bisher auch immer so gemacht wie kalel.

ich dachte bis dato, dass man in vb-script keine dialoge benutzen kann.
bisher mache ich das immer mit der inputbox, was nicht unbedingt professionell ist. 

funktioniert leider nur dann *siehe auch hier*


> *Anmerkung:*
> Diese Variante funktioniert nur, wenn auf dem System die VB-Entwicklungsumgebung installiert ist. Andernfalls lässt sich der CommonDialog nicht per "CreateObject" aktivieren. Eine Alternative wäre dann, den CommonDialog per API zu aktivieren. Wie das geht, erfahren Sie in unserem Workshop: Mit VB die Windows-Standard-Dialoge nutzen.


 
auf systemen wo dies nicht der fall ist kommt die meldung:
'Keine Lizenz für die Verwendung dieser Klasse vorhanden'


ich habe nun probiert

```
Declare Function GetOpenFileName Lib "comdlg32" Alias "GetOpenFileNameA" (lpOpenfilename As OpenFilename) As Long
```
dann bekomme ich aber leider einen sysntaxfehler ab zeichen 9. 

werde mich damit auf jeden fall mal auseinandersetzen, da dies eine sehr willkommene erleichterung für meine scripte wäre.


----------



## Neuling74 (24 Oktober 2006)

Ihr hattet beide Recht. Das Script läuft leider nicht. Jetzt hast du dir in China die ganze arbeit umsonst gemacht. Das ist aber doch sch....! Dachte eigentlich das Flexible das alles kann was WinCC und Protool können. Da hat sich Siemens ja mal wieder richtig was einfallen lassen.


----------



## Praktikant (24 Oktober 2006)

das mit der arbeit ist doch egal, vielleicht können es andere gebrauchen:-D


----------



## Neuling74 (24 Oktober 2006)

Da hast Du recht.  Ich bin  gerade dabei das zu ändern, damit das bei flex auch klappt. Einen kleinen Teilerfolg habe ich sogar schon erzielt. Ist zwar mit viel Leserei verbunden, aber wenn es hilft und ich es dann noch verstehe, dann geht es ja. Sollte ich es zum laufen kreigen, stelle ich das hier auch zur verfügung. Kombiniere deine Lösung mit der von KalEl. Kann aber noch dauern, da ich ja nun beim Besten Willen nicht so eine VB-Beule bin wie Ihr zwei.  Trtzdem vielen vielen Dank noch einmal. So habe ich wenigstens einen Ansatz.


----------



## Neuling74 (24 Oktober 2006)

Praktikant!
Ob Du es glaubst oder nicht, ich habe es zum laufen bekommen . Ich danke Dir noch einmal für Deine Hilfe. Viel Glück und gutes gelingen in China. Kann ich Dir auch mal eine PN schicken wenn ich wieder Deine Hilfe brauche?


----------



## Praktikant (24 Oktober 2006)

ja klar :-D

und das mit china klappt schon, ist ja nicht das erstemal


----------

