Sonstiges INI Datei auslesen von SD Karte via VBSkript

SPSGu

Level-1
Beiträge
5
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

Ich möchte mit Hilfe eines VBSkript ein INI Datei von der SD Karte lesen. Auf der Runtime Simulation in TIA V15 hat es funktioniert.
Allerdings "life" auf dem Panel nicht.

Ich benutze ein TP 900 Comfort Panel .
Bei aktivierung des Skripts steht in den SystemMeldung (Object dosent support this property or 0 Method: <FS.GetSpecialFolder> in Zeile 6.
In dem Ausschnit macht das Skript die Probleme:

Function GetFile(ByVal FileName)
'CreateObject("Scripting.FileSystemObject")
Dim FS: Set FS = CreateObject("FileCtl.filesystem")
'Go To windows folder If full path Not specified.
If InStr(FileName, ":") = 0 And Left (FileName,2)<>"" Then
FileName = FS.GetSpecialFolder(1) & "" & FileName <--- Ich denke Windows CE welches auf dem Panel läuft unterstütz die Methode nicht. Gibt es da eine andere Methode ?
End If
On Error Resume Next

GetFile = FS.OpenTextFile(FileName).ReadAll

Kann mir da jemand weiter helfen?

Vielen Dank schon mal im voraus für die Hilfe.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo volker,
danke für deine schnelle Antwort.
ich habe den Fehler in der Funktion GetFile gefunden.
'File functions
Function GetFile(ByVal FileName)
Dim FS: Set FS = CreateObject("FileCtl.filesystem")
'Go To windows folder If full path Not specified.
If InStr(FileName, ":\") = 0 And Left (FileName,2)<>"\" Then <-- Das : hat hier den Fehler verursacht weil unter windows der File unter der C Platte so anfängt. Im Panel aber net :D
FileName = FS.GetSpecialFolder(0) & "" & FileName
End If
On Error Resume Next

GetFile = FS.OpenTextFile(FileName).ReadAll
End Function



Allerdings habe ich weiters Probleme in meiner anderen Funktion.

Function GetINIString(Section, KeyName, Default, FileName)
Dim INIContents, PosSection, PosEndSection, sContents, Value, Found

'Get contents of the INI file As a string
INIContents = GetFile(FileName)
SmartTags("INIContes") = INIContents <--- Hier zeigt er mir ein Überlauf an. Ich habe die Variable als WString deklaiert mit 255 Zeichen und die gesamte ini Datei hat grad mal 92. Woran kan das liegen?
'Find section
PosSection = InStr(1, INIContents, "[" & Section & "]", vbTextCompare)
If PosSection>0 Then
'Section exists. Find end of section
PosEndSection = InStr(PosSection, INIContents, vbCrLf & "[")
'?Is this last section?
If PosEndSection = 0 Then PosEndSection = Len(INIContents)+1

'Separate section contents
sContents = Mid(INIContents, PosSection, PosEndSection - PosSection) <-- "ungültiger Prozedur aufruf oder Argument :0, woran kann das Liegen?

If InStr(1, sContents, vbCrLf & KeyName & "=", vbTextCompare)>0 Then
Found = True
'Separate value of a key.
Value = SeparateField(sContents, vbCrLf & KeyName & "=", vbCrLf)
End If
End If
If isempty(Found) Then Value = Default
GetINIString = Value
End Function


Mich würde es Interessiern was in INIContes steht um rauszufinden ob er den Anfang der Datei richtig aussließt.

Danke schon mal im voraus für die Hlfe.

 
Hallo,

es nützt nichts, einfach nur den Name des Controls bei CreateObject anzupassen, sondern es können auch nur die in dem Control vorhandenen Methoden verwendet werden - da besteht der größte Unterschied zwischen PC-Windows und WinCE.
z.B. das Control "FileCtl.filesystem" hat keine Methoden OpenTextFile und GetSpecialFolder
Schau Dir den von volker verlinkten FAQ an. Im FAQ ab Beitrag #2 sind Beispiele für typische Dateioperationen in der PC-Windows- und in der WinCE-Schreibweise direkt vergleichbar.

Tip 1: mache Dir mal in ein Bild eine Meldeanzeige für Meldungen der Meldeklasse "System" rein, damit Du die Runtime-Errors Deiner Skripte sehen kannst.

Tip 2: Programmcode kann man hier übersichtlicher posten wenn man ihn in [CODE]-Tags packt (das # im Beitragseditor).

Harald
 
Hallo Harald,

Danke für die die Tipps.
Daher schreibe ich mein Skript um für WinCE.

Code:
Const ForReading = 1
  Dim fn
  
  
  Dim FS: Set FS = CreateObject("FILECTL.File")
  FS.Open "\Storage Card SD\Konfig.ini", ForReading
  SmartTags("INIContes") = FS.Lineinputstring
  SmartTags("sContes") = FS.Lineinputstring

Momentan hab ich es so und lese die einzelnen Zeilen aus. Gibt es da die möglichkeit die komplette INI Datei auszulesen ?

Und kann ich in einem String nach bestimmten Symbolen abfragen, wie es z.b. der Befehl Instr() macht ?

Also Ziel ist es eine INI Datei auszulesen und deren Section zu erkennen und den entsprechenden Key nach 1 oder 0 abzufragen.
Wie z.b.
[Section1]
Key=1 oder 0
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du könntest die Datei zeilenweise in ein (Script-lokales) Array einlesen oder als nur einen String verketten (&). Oder mit Input oder InputB einlesen.
Am einfachsten ist vermutlich zeilenweise einlesen bis "[Section1]" und dann zeilenweise weiterlesen bis "Key=" (Tip: mit Trim() - siehe die selbe FAQ diesmal Beitrag #3). Weiterlesen höchstens bis eine andere Sektion "[" beginnt.

Wenn der Text in einem String liegt, dann kann man auch in WinCE alle VBS-Stringfunktionen verwenden, z.B. auch InStr().
Siehe die selbe FAQ Beitrag #1 die "VBScript Sprachverzeichnis.zip" oder Beitrag #10 den Link zu einem online-Sprachverzeichnis.

Harald
 
Hallo Harald,

Danke für die schnelle Hilfe.
Ich habe jede Zeile einzlen eingelesen und anschlißend abgefragt, dies hat super geklappt.
Nun habe ich eine neue Aufgabe
Ich soll dirverse Prozessparameter in eine txt.datei reinschreiben.
Dies läuft fast genaus so ab wie das lesen, allerdings möchte ich das nun so haben wen ich ein button aufm Panel drücke soll er mir die Prozessdaten immer in eine neue Zeile schreiben.
Code:
  Const ForWriting = 2
  Dim Filename, t, dat
  t = Time
  dat = Date
  Dim i_m, s_m, m_m, mi_m, i_s, m_s, mi_s, pn
  i_m = SmartTags("DB_SPR_STAT_Prozesswerte_Ist_Auftragsmenge")
  s_m = SmartTags("DB_SPR_STAT_Prozesswerte_Soll_Auftragsmenge")
  m_m = SmartTags("DB_SPR_STAT_Prozesswerte_Max_Auftragsmenge")
  mi_m = SmartTags("DB_SPR_STAT_Prozesswerte_Min_Auftragsmenge")
  i_s = SmartTags("DB_SPR_STAT_Prozesswerte_Ist_Sprühdruck")
  m_s = SmartTags("DB_SPR_STAT_Prozesswerte_Max_Sprühdruck")
  mi_s = SmartTags("DB_SPR_STAT_Prozesswerte_Min_Sprühdruck")
  pn = SmartTags("DB_SPR_STAT_Prozesswerte_Programnummer")
  
  Filename = "\Storage Card SD\Prozessdaten.txt"
On Error Resume Next
 Dim FS: Set FS = CreateObject("FILECTL.File")
  
  FS.Open Filename, ForWriting 
  
 If Err.Number <> 0 Then
    ShowSystemAlarm "Error SD Card not fournd or INI File not found!"  & CStr(Err.Number) & "" & Err.Description
    Err.Clear
    Exit Sub
End If 
 
FS.LinePrint "" & "[Datum]" & "     " & "[Uhrzeit]" & "  " &  "[Programmnummer]" & "  " & "[IST_Menge in gr]" & "  " & "[SOLL_Menge in gr]" & "  " & "[MAX_Menge in gr]" & "  " & "[MIN_Menge in gr]" & "  " & "[IST_Sprühdruck]" & "  " & "[MAX_Sprühdruck]" & "  " & "[Ergebnis]"
FS.LinePrint "" & dat & "  " & t & "     " & pn & "  " & i_m & "  " & s_m & "  " & m_m & "  " & mi_m & "  " & i_s & "  " & m_s & "  " & mi_s

Ich habe das erst mal so geamcht so schreibt er mir die Parameter in die erste Zeile. Aber nach Parameter änderung überschreibt er die.
Wie schaff ich es das er die "neuen Parameter" eine Zeile drunter schreibt und die geschrieben Parameter nicht überschreibt?
 
Du öffnest die Datei im einfachen Schreibmodus (2) - dadurch wird bei jedem Öffnen der bereits vorhandene Datei-Inhalt gelöscht. Du müsstest die Datei im Anhängen-Modus öffnen ("Append", Modus = 8 ) dann werden die neuen Zeilen hinter den vorhandenen angehängt.
Code:
Const ForAppend = 8
[COLOR="#008000"]'...[/COLOR]
Set FS = CreateObject("FileCtl.File")
FS.Open Filename, ForAppend [COLOR="#008000"]'Datei öffnen zum anhängen[/COLOR]

Über den Export von Werten der SPS in eine csv-Datei mit WinCC/VBS gibt es hier im Forum schon unzählige Threads, weil es da einige Stolperfallen gibt, auf die Siemens nicht besonders hinweist. Du wirst u.A. noch ein Problem mit der Aktualisierung der Werte der in die Datei zu schreibenden Variablen bekommen, was man nur vernünftig und sicher in den Griff bekommt, indem man die Werte als Rezeptur mit Handshake ins HMI/Panel einliest und erst danach in die Datei schreibt. Ich wiederhole jetzt nicht meine schon viele Male gemachten Erklärungen - siehe hier und benutze bitte die Forumssuche mit dem Suchbegriff "GetDataRecordTagsFromPLC" und den Begriffen "vbs csv".

Achtung, seit irgendeiner Version von TIA darf man nicht mehr schreiben
GetDataRecordTagsFromPLC "meineRezeptur", SmartTags("Lesestatus")
sondern muß schreiben
GetDataRecordTagsFromPLC "meineRezeptur", "Lesestatus"


Könntest Du Dein Werte mitschreiben auch über ein Archiv machen? Dann brauchst Du Dich nicht um die ganzen kniffligen Details kümmern.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Harald,

Danke für die schnelle Antwort hat mir sehr geholfen.
Sry das ich mich jetz erst melde hatte anderweitig viel zu tun :/
Zurzeit habe ich das so gelöst das ich immer einen Zeile anhänge, da hab ich allerdings das problem mit der Variablen aktualisierung und da schreibt er mir immer den veralteten Wert hin.
Wie meinst du das über ein Archiv mit schreiben ?
ich denke das wäre aufjedenfall möglich da ich die Daten die ich logge in einem Umlaufarchiv speichern muss.
Zudem hab ich noch eine andere Frage.
Wie kann ich bestimmte Zeilen löschen, bzw den Wert ändern?
z.b.
Swap=1
auf
Swap=0

MFG Albert
 
Wenn du in der Datei Daten ändern willst, empfehle ich ggf. mal das Konzept umzustellen und auf XML zu gehen.
Damit kannst du viel einfacher und schneller eine "INI"-Datei nutzen und mit wenig Handgriffen Lesen, Schreiben, Ändern.
Ich hab dazu mal ein kleines FAQ hier erstellt:
Wie kann ich in WinCC Daten im/exportieren mit XML?

Läuft auch auf WinCE Systemen mit kleinen Einschränkung, welche aber in deinem Fall sicher keine Notwendigkeit haben:
https://msdn.microsoft.com/en-us/library/ms834464.aspx
 
Zurzeit habe ich das so gelöst das ich immer einen Zeile anhänge, da hab ich allerdings das problem mit der Variablen aktualisierung und da schreibt er mir immer den veralteten Wert hin.
Das Problem der Variablen-Aktualisierung ist also nicht gelöst.
Variablen garantiert aktualisiert aus der SPS ins HMI eingelesen mit Fertig-Meldung bekommt man, wenn man für die Variablen eine Rezeptur projektiert und diese Rezeptur mit der Systemfunktion GetDataRecordTagsFromPLC ins HMI einliest (und danach die Werte der Rezepturvariablen in die Datei schreibt). siehe den Link in meinem Beitrag #8
Man könnte sich auch selber z.B. einen BlockRead-Handshake mit der SPS ausdenken und programmieren. Das ist aber aufwendiger.

Wie meinst du das über ein Archiv mit schreiben ?
Ich meinte daß Du für die Daten die Du loggen/archivieren willst ein Variablenarchiv projektierst (so wie Siemens das vorgesehen hat). Dann kümmert sich die WinCC Runtime um die Variablen-Aktualisierung und das schreiben in die Archivdatei, dann hast Du allerdings keinen Einfluß auf das Format der Archivdatei.

Wie kann ich bestimmte Zeilen löschen, bzw den Wert ändern?
Indem Du die Datei zeilenweise in eine zweite Datei umkopierst, dabei die betreffende Zeile suchst und änderst/austauschst oder nicht mitkopierst.
Oder Dich ganz tief in die LowLevel-Ebene begibst und die Datei im Random- oder Binary-Mode öffnest.
Oder eine fertige höher-Level-Bibliothek oder ein Control verwendest wie z.B. das von Krumnix erwähnte XML-Control (was Du dann auf Deinem TP900 installieren müsstest).
Oder die INI/Textdatei extern editierst (außerhalb der WinCC Runtime). Wie oft muß die Datei geändert werden? Hat das TP900 einen Texteditor onboard? Man könnte auch den Sm@rtService-Filebrowser aktivieren und die Datei auf der SD-Karte mit einem externen PC übers Netzwerk editieren.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
die hmi-variablen werden nicht beim aufruf im script aktualisiert.
das ist ein bekanntes problem.
es gibt 2 möglichkeiten
1. im script die variable über eine rezeptur einlesen und den status des rezeptaufrufs auswerten. (4 war glaube ich fertig ohne fehler (ohne gewähr).
dann erst die variable schreiben.

oder
2. die zu schreibenden variablen auf ständig lesen stellen. kurze aktualisierungszeit.
das script zeitverzögert anstossen. z.b. nach 2 x aktualisierungszeit der variablen.

2. ist aber die unsaubere lösung.

eine variable aus der datei ändern geht nur...
datei zeilenweise in ein array (interne variable) einlesen
variable suchen. dann variable ändern bzw zeile löschen
datei komplett (aus dem array) zurück in die datei schreiben.
 
Zurück
Oben