Protool/WinCCflex/TIA Daten lesen / schreiben mit VB-Script

volker

Supermoderator
Teammitglied
Beiträge
5.856
Reaktionspunkte
1.051
Zuviel Werbung?
-> Hier kostenlos registrieren
Hier mal die wichtigsten Dateifunktionen

----- grundsätzliches ------------------------------------------------------------------------------------------
alle variablen in den scripten die nicht durch die DIM anweisung dimensioniert sind, sind in protool/winccflex definierte variablen (können interne oder aber auch an die steuerung gebunden sein (je nach zweck))

----- allgemein ------------------------------------------------------------------------------------------

fehlerbehandlung
eine liste der fehler findet ihr hier http://lischis-home.dyndns.org/forum/phpbb3/viewtopic.php?f=29&t=212
Code:
 ' Fehlerbehandlung aktivieren
On Error resume next
wert = "test"
wert = wert + 1
fehler = err.number
if fehler > 0 then
   msgbox "Abruch durch Fehler " & fehler
   err.clear 'fehler rücksetzen
end if
 
' Fehlerbehandlung deaktivieren. danach bricht das script wieder bei einem fehler ab
On Error goto 0
wert = wert + 1
dateimodus
1 = lesen
2 = schreiben
8 = anhängen

----- wince ------------------------------------------------------------------------------------------
verzeichnis abfragen/erstellen
Code:
Dim fs
 
Set fs = CreateObject("filectl.filesystem")
'If fs.dir("storage card2\daten") = "" Then fs.mkdir("storage card2\daten")
daten schreiben
Code:
Dim f,fs,datei,datum,laenge
 
Set f= CreateObject("filectl.file")
Set fs = CreateObject("filectl.filesystem")
 
datei="storage card2\Log_Prozess.csv"
datum="20"&Right(Date,2)&"."&Mid(Date,4,2)&"."&Left(Date,2)
 
If fs.dir("\"&datei) = "" Then
    f.open datei, 2
    f.LinePrint "Logbuch der Pumpe"
    f.LinePrint "Datum (JJJJ.MM.TT);"&"Uhrzeit;"&"Schaltspiele;"&"Betriebsstunden [h]
    f.Close
End If
 
f.open datei, 8
f.LinePrint Datum&";"&Time&";"&Schaltspiele_täglich&";"& Betriebsstunden
f.Close
daten lesen
Code:
Dim f,mode
 
Set f= CreateObject("filectl.file")
mode = 1
f.open "storage card2\daten\datensatz.txt", mode
dat_artikel_info_1 = f.LineInputString
dat_artikel_info_2 = f.LineInputString
f.Close
daten kopieren
Code:
On Error Resume Next
Dim f,fs,t_net_path,t_root_path
t_net_path = "\\netzwerkfreigabe\verzeichnis
t_root_path = "\storage card2\daten

Set f= CreateObject("filectl.file")
Set fs = CreateObject("filectl.filesystem")
If fs.dir (t_net_path) <> "" Then
 fs.kill t_net_path&"\dat4excel.txt"
 fs.filecopy t_root_path & "\dat4excel.txt", t_net_path&"\dat4excel.txt"
end if
wertet bits aus einem byte aus und schreibt eine datei
Code:
On Error Resume Next
Dim meldung(512),x,i,j,z,f,fs,datei
x=0: z=0
zs_root_path="storage card mmc"
Set fs = CreateObject("filectl.filesystem")
Set f= CreateObject("filectl.file")
'störtexte einlesen
datei = "storage card mmc\stmtext.txt" 'jede zeile enthählt den text einer störung
f.open datei,1
Do 
 If f.eof = True Then Exit Do
 meldung(x) = f.LineInputString
 x = x + 1
Loop
f.close
'bits auswerten und stm-datei schreiben
datei = zs_root_path &"\stm_akt.txt"
fs.kill datei
f.open datei, 2
f.LinePrint Date &"   "& Time &"      Anstehende Störungen"
f.LinePrint "STM;Meldetext"
'DB_stm_script_hmi_stm_anzahl ist ein array of byte
For i = 0 To Int(DB_stm_script_hmi_stm_anzahl / 8)-1
 For j = 0 To 7 'bits bearbeiten
  If DB_stm_script_hmi_stoerung_aktiv_byte(i) And 2^j Then
   z=z+1
   f.LinePrint i*8+j+1 &";"& meldung(i*8+j)
  End If
 Next
Next
f.LinePrint ""
f.LinePrint "Gesamt: " & z
f.close
----- windows ------------------------------------------------------------------------------------------

verzeichnis erstellen
Code:
If Not fso.FolderExists("d:\sicher") Then fso.CreateFolder("d:\sicher")
daten kopieren
Code:
fso.CopyFile "D:\PROJEKT\DATEN\meinedatei.csv", "d:\sicher\"
daten schreiben
Code:
Dim fso,datum,zeit,datei,textfile1
 
Set fso = CreateObject("Scripting.FileSystemObject")
 
datei="D:\PROJEKT\DATEN\Schmiermittel.csv"
 
If Not fso.FileExists (datei) Then 
    Set TextFile1 = fso.CreateTextFile(datei, true)
    textfile1.WriteLine "Datum;"&"Uhrzeit;"&"Schmiermittel;"&"Verbrauch"
    textfile1.WriteLine 
    textfile1.Close
End If
 
If fso.FileExists (datei) Then 
    Set TextFile1 = fso.OpenTextFile(datei, 8)
    textfile1.WriteLine Datum&";"&Time&";"&Schmiermittel&";"&Verbrauch
    textfile1.Close
End If
daten lesen
Code:
Set fso = CreateObject("Scripting.FileSystemObject")
 
    Set TextFile = fso.openTextFile(datei, 1)
    x = 0
    do while textfile.atendofstream <> true
        x = x + 1
        name(x) = TextFile.readline
    loop
    textfile.close
Exceldatei lesen / schreiben (Danke auch an Larry Laffer)
Achtung!
Wenn die Exceldatei nicht geschlossen wird, bleibt diese geöffnet und ist nur noch schreibgeschützt erreichbar.
Code:
On Error resume next
 
Dim appExcel , fs , wbExcel , wsExcel
Dim Verzeichnis , Datei
Dim Zeile
'------------------------------------------------------------------------------
' Variablen-Zuweisungen ...
Verzeichnis = "c:\daten\"
Datei = "test.xls"
'------------------------------------------------------------------------------
' Pointer auf Tabelle laden
Set appExcel = CreateObject ("EXCEL.Application")
Set fs = CreateObject ("Scripting.FileSystemObject")
'------------------------------------------------------------------------------
' Objekte erzeugen
' prüfe ob datei existiert. wenn nicht erzeugen.
if not fs.fileexists (Verzeichnis + Datei) then
    appExcel.Workbooks.Add
    appExcel.ActiveWorkbook.SaveAs(Verzeichnis + Datei)
end if
 
Set wbExcel = appExcel.Workbooks.Open (Verzeichnis + Datei)
Set wsExcel = wbExcel.Worksheets("Tabelle1")
 
' Zelle lesen und um 1 erhöhen
Zeile = wsExcel.Range("D1") + 1 
 
' Zelle beschreiben
wsExcel.Cells (Zeile , 1) = date
wsExcel.Cells (Zeile , 2) = time
wsExcel.Range("D1") = Zeile 
 
' Tabelle abspeichern
wbExcel.Close true 'false
appExcel.Quit ()
 
'------------------------------------------------------------------------------
' verwendeten Speicher wieder freigeben
Set wsExcel = Nothing
Set wbExcel = Nothing
Set fs = Nothing
Set appExcel = Nothing
Set Verzeichnis = Nothing
Set Datei = Nothing
Larry Laffer schrieb:
Hallo Volker,
zu dem genannten FAQ hätte ich noch ein schönes Addon.
Wenn man ständig auf Excel zugreifen möchte, um Daten dahin zu schreiben, dann kann man es auch als Instanz geöffnet lassen (mit dem richtigen Workbook) und dann ständig auf die geöffnete Instanz zugreifen. Das spart Systemresourcen ...
die datei (EXCEL-Script.doc) ist im anhang

letze zeile in einer exceldatei ermitteln.
folgender code funktioniert aus vbscript heraus scheinbar nicht.
Code:
wsExcel.zeilenanzahl = ActiveSheet.Cells(Rows.Count, 6).End(xlUp).Row
mit einem trick, kann man die zeilenanzahl aber ermitteln.
1. öffne die exceldatei und dann den code dazu.
2. gehe im code auf 'DieseArbeitsmappe'
3. wähle oben im reiter objekt 'workbook' und im reiter prozedur 'open'
4. füge folgenden code ein
Code:
Private Sub Workbook_Open()
    Sheets("Tabelle1").Select
    zeilenanzahl = ActiveSheet.Cells(Rows.Count, 6).End(xlUp).Row
    Worksheets("Tabelle1").Range("e1") = zeilenanzahl
End Sub
die letzte belgete zeile steht nun in tabelle1 in feld e1 zur verfügung

in eine access datenbank schreiben
Code:
Verzeichnis = "c:\daten\"
Datei = "test.mdb"
' ------------------------------------------------------------------------------
Dim sUser
Dim sIP
Dim Con
Dim sCon
Dim sSql
 
sUser = "Max Mustermann"
sIP = "127.0.0.1"
 
Set Con = CreateObject("ADODB.Connection")
 
'DB Provider für Jet
sCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & verzeichnis & datei & ";Mode=Share Deny None;Persist Security Info=False"
 
'DB Provider für ODBC
'sCon = Provider=MSDASQL.1;Persist Security Info=False;Data Source=my ODBC
 
Con.Open sCon
 
sSql = "INSERT INTO LogonLog ( [User], [Date], [Time], IP ) "
sSql = sSql & "SELECT '" & sUser & "' AS [User], Date() AS [Date], Time() AS [Time], '" & sIP & "' AS IP;"
 
Con.Execute sSql
Con.Close
 
Set Con = Nothing
in eine mysql datenbank schreiben
der odbc-treiber muss natürlich installiert sein http://dev.mysql.com/downloads/connector/odbc/5.1.html
den namen des treibers findet man nach der installation unter: systemsteuerung/verwaltung/datenquellen (odbc) im reiter verbindungs-pooling
Code:
db_server= "192.168.1.1"
db_port= "3306"
db_user= "root"
db_pass= "MeinPasswort"
db_name= "test"
db_tabelle= "tabelle"
 
     ' sql-Anweisung
     Sql = "INSERT INTO " & db_tabelle & " ( datum, zeit ) values ('" & date & "' , '" & time & "' );"
 
     ' Verbindung zu MySql Server initialisieren
     Set conn=CreateObject("ADODB.Connection")
     strConnectString = "DRIVER={MySQL ODBC 3.51 Driver};" _
               & "SERVER=" & db_server & ";" _
               & " DATABASE=" & db_name & ";" _
               & "UID=" & db_user & ";PWD=" & db_pass & "; OPTION=3"
     conn.Open strConnectString                               
     'ausführen
     Set rs=CreateObject("ADODB.recordset")
     rs.Open Sql, conn          
     conn.Close
die vb-script dokumentation für windows wird mit protool mitinstalliert. ansonsten gibt es die bei microsoft
Online Language Reference for Windows

die vb-script doku für ce hier im anhang oder auch irgendwo bei microsoft.
Online Language Reference for Windows CE

hab heute [29.07.2008] einen recht interessanten link bei microsoft entdeckt
http://www.microsoft.com/germany/technet/datenbank/articles/600356.mspx
 

Anhänge

  • VBScript_WinCE.pdf
    83,5 KB · Aufrufe: 3.484
  • VBScript Sprachverzeichnis.zip
    670 KB · Aufrufe: 2.213
  • EXCEL-Script.doc
    37,5 KB · Aufrufe: 2.788
Zuletzt bearbeitet:
INI-Datei speichern

Hier mal ein Beispiel, wie Panel-Variablen in eine INI-Datei gespeichert werden können.
Weil ich meine Panel-Projekte auch auf dem PC vollständig testen will, habe ich ein Settings-Bild
im Projekt, wo ich auf Panel und PC unterschiedliche Speicherpfade eingeben kann. Die Eingaben
speichere ich dann in eine INI-Datei, die beim Runtime-Start wieder gelesen wird.

Man beachte und vergleiche die unterschiedlichen Befehle, je nachdem, ob das Skript unter WinCE (MP270)
oder Win32 (PC-Windows) läuft.

Code:
[COLOR="#008000"]' Sub SettingsIniSpeichern()
' SystemPfade und Einstellungen in Ini-Datei speichern
' Skript kann unter OP-WinCE und PC-Windows laufen[/COLOR]
Const ForWriting = 2
Dim fso, f, inifile

inifile = "Settings.ini"
If Not FolderExist("\FLASH") Then
    ShowSystemAlarm "Ordner '\FLASH' nicht vorhanden. Kann '" & inifile & "' nicht speichern."
    Exit Sub
Else
    inifile = "\FLASH\" & inifile
    If SmartTags("_System\!_RT-Sim_!") Then [COLOR="#008000"]'PC-Windows[/COLOR]
        Set fso = CreateObject("Scripting.FileSystemObject")
        Set f = fso.CreateTextFile(inifile, True)
        f.WriteLine  "[WCF-RT Anlage1]"
        f.WriteLine  "path_CF-Card=" & SmartTags("_System\path_CF-Card")
        f.WriteLine  "path_Warte-PC=" & SmartTags("_System\path_Warte-PC")
        f.Close
    Else [COLOR="#008000"]'WinCE[/COLOR]
        Set f = CreateObject("FileCtl.File")
        f.Open inifile, ForWriting
        f.LinePrint "[WCF-RT Anlage1]"
        f.LinePrint "path_CF-Card=" & SmartTags("_System\path_CF-Card")
        f.LinePrint "path_Warte-PC=" & SmartTags("_System\path_Warte-PC")
        f.Close
    End If
    ShowSystemAlarm "Systempfade in '" & inifile & "' gespeichert."
End If
Code:
[COLOR="#008000"]' Function FolderExist(Path) prüft, ob ein angegebener Ordner existiert
' z.B. ob eine MemoryCard im angegebenen Slot steckt
' oder der angegebene Netzwerk-Pfad erreichbar ist
' Rückgabewert muß True/False sein!
' Skript kann unter OP-WinCE und PC-Windows laufen
' Path darf unter WinCE wildcards *? enthalten
' !!! unter WinCE führt ein Aufruf "If FolderExist(SmartTags("Strinvariable")) ..."
'     zu einem Runtim-Error "ungültiger Procedur-Call"
'     -> SmartTags("Strinvariable") muß explizit einer Skript-Variablen zugewiesen werden !!!
'     -> z.B. path = SmartTags("Strinvariable") : If FolderExist(path) ...  <- das funktioniert[/COLOR]
Dim fso

FolderExist = False
If SmartTags("_System\!_RT-Sim_!") Then [COLOR="#008000"]'PC-Windows[/COLOR]
    Set fso = CreateObject("Scripting.FileSystemObject")
    If fso.FolderExists(Path) Then FolderExist = True
Else [COLOR="#008000"]'WinCE[/COLOR]
    Set fso = CreateObject("FileCtl.FileSystem")
    If fso.Dir(Path) <> "" Then FolderExist = True
End If

Damit ich meine Panel-Projekte komplett unter Windows XP testen/simulieren kann,
habe ich im WCCflexible-Projekt eine interne Panel-Variable "_System\!_RT-Sim_!"
vom Typ Byte, deren Startwert ich auf 0 oder 1 festlege, je nachdem, ob die Runtime
auf dem Panel oder auf dem WinXP-Testsystem laufen soll:
0=RT auf WinCE-OP / 1=RT auf PC (Simulation/Test)

Noch ein Hinweis zum Debuggen von Skripten:
Damit man eventuelle Fehlermeldungen im Skriptablauf überhaupt sieht, sollte man
in einem Bild eine Meldeanzeige haben und/oder in der Vorlage ein Meldefenster alleine
für die Meldeklasse "System".
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
INI-Datei einlesen

Und hier das Einlesen der oben geschriebenen INI-Datei.
Beim Runtime-Start wird in einem Start-Skript aufgerufen: SettingsIniLaden 1
Und an einer "Laden"-Schaltfläche im Settings-Bild: SettingsIniLaden 0

Real werden in die INI-Datei noch viel mehr Werte geschrieben und wieder rausgelesen.

Code:
[COLOR="#008000"]' Sub SettingsIniLaden(verbose)
' SystemPfade und Einstellungen aus Ini-Datei lesen
' Skript kann unter OP-WinCE und PC-Windows laufen[/COLOR]
Const ForReading = 1
Dim fso, f, inifile

inifile = "\FLASH\Settings.ini"
If Not FileExist(inifile) Then
    If verbose = 0 Then ShowSystemAlarm "Datei '" & inifile & "' nicht gefunden."
    Exit Sub
Else [COLOR="#008000"]'Settings.ini ist vorhanden[/COLOR]
    If SmartTags("_System\!_RT-Sim_!") Then [COLOR="#008000"]'PC-Windows[/COLOR]
        Set fso = CreateObject("Scripting.FileSystemObject")
        Set f = fso.OpenTextFile(inifile, ForReading, False)
        Do While f.AtEndOfStream = False
            SetSysVar f.ReadLine
        Loop
        f.Close
    Else [COLOR="#008000"]'WinCE[/COLOR]
        Set f = CreateObject("FileCtl.File")
        f.Open inifile, ForReading
        Do While f.EOF = False
            SetSysVar f.LineInputString
        Loop
        f.Close
    End If
End If
Code:
[COLOR="#008000"]' Sub SetSysVar(sline)
' zerlegt einen String der Art "varname = stringvalue" und weist dann varname den stringvalue zu[/COLOR]
Dim field, varname, svalue

If sline = "" Then Exit Sub [COLOR="#008000"]'wg. Split()[/COLOR]
field = Split(sline, "=")
If UBound(field) <> 0 Then [COLOR="#008000"]' "=" war enthalten, field(0): "varname ", field(1): " string"[/COLOR]
    varname = Trim(field(0)) : svalue = Trim(field(1))
    Select Case varname
        Case "path_CF-Card"    SmartTags("_System\path_CF-Card") = svalue
        Case "path_Warte-PC"   SmartTags("_System\path_Warte-PC") = svalue
    End Select
End If
Code:
[COLOR="#008000"]' Function FileExist(Path) prüft, ob die angegebene Datei vorhanden ist
' Rückgabewert muß True/False sein!
' Skript kann unter OP-WinCE und PC-Windows laufen
' Path darf unter WinCE wildcards *? enthalten[/COLOR]
Dim fso

FileExist = False
If SmartTags("_System\!_RT-Sim_!") Then [COLOR="#008000"]'PC-Windows[/COLOR]
    Set fso = CreateObject("Scripting.FileSystemObject")
    If fso.FileExists(Path) Then FileExist = True
Else [COLOR="#008000"]'WinCE[/COLOR]
    Set fso = CreateObject("FileCtl.FileSystem")
    If fso.Dir(Path) <> "" Then FileExist = True
End If
 
Zuletzt bearbeitet:
betriebssystem prüfen

mit diesem code lässt sich ermitteln ob es ein ce-system oder ein 'normales' windows-system ist

Code:
Dim fs,fehler
'betriebsystem ist eine flexible-interne stringvariable
On Error Resume Next
Set fs = CreateObject("filectl.filesystem")
fehler = Err.Number
If fehler=0 Then betriebssystem="WCE"
Err.Clear
Set fs = CreateObject ("Scripting.FileSystemObject")
fehler = Err.Number
If fehler=0 Then betriebssystem="WIN"
Err.Clear
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Mssql

..........
...
Ich möchte nicht so weit gehen und behaupten, dass ich C# "beherrsche", über vbs in eine MSSQL-DB zu lesen/schreiben habe ich allerdings schon gemacht (die Links helfen dennoch^^), z.B. ist während meines Praktikums folgendes Script entstanden:

Code:
'Variablen deklarieren
dim dat, i, t
dim cnStr, ac, rs, cn, sQuery
dim objFSO

'ADODB
cnStr = "Provider=MSDASQL;DSN=energie;UID=**;PWD=****************;"
Set cn = CreateObject("ADODB.Connection")
cn.ConnectionString = cnStr
cn.Open
Set ac = CreateObject("ADODB.Command")
Set rs = CreateObject("ADODB.RecordSet")

'SQL Abfrage, Anzahl datensätze
SQuery = "SELECT Count(*) AS Anzahl FROM value_data"
rs.OPEN SQuery,cn
i = rs.Fields("Anzahl").Value
rs.Close

'Systemzeit/datum auslesen
t = Time
dat = Date
'Textdatei öffnen
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("C:\Documents and Settings\werkstad\Desktop\Datenzuwachs_gridvis_db.txt", 8)

'in Textdatei schreiben
objFile.WriteLine(""& Date & " " & Time & " ; " & i & Chr(13))
'Datenbankverbindung schliessen und terminieren
Set ac = Nothing
cn.close
Set cn = Nothing

EDITvon Mod Volker: für die FAQ nicht relavante Sachen rausgeschnitten.
 
Zuletzt bearbeitet von einem Moderator:
Vielleicht eine wertvolle Ergänzung zu Volkers VBS FAQ.

Wenn man Daten per VBS-Skript in CSV-Dateien loggen will, gibt es ein Problem mit den Charakters für Dezimaltrenner und Listenseparator.
Wenn die Daten mit ein VBS Skript in CSV-Textdateien geschrieben werden bekommen REAL-Zahlen den in die Windows-Regionaleinstellungen eingestellte Character für Dezimaltrenner. Also entweder Komma "," oder Punkt "."
Es ist also nicht fix sondern variabel.

Eine 'Lösung' ist für jeden Installation diese Character händisch in die Windows-Regionaleinstellungen zu setzen.
Aber das gibt keine Garantie das die Charactere nicht später geändert werden. z.B. wenn eine neue Benutzer in Windows eingerichtet wird, bekommt diese Benutzer die 'Default' Einstellungen für die gewählte Sprache auf den PC.

Hier ist eine Lösung zu diesen Problem:

1. Erkennen wenn eine falsche Dezimaltrenner eingestellt ist.

In der Skript wo man Werte in CSV Datei schreiben will:

Code:
charDecPoint = Mid(CStr(8.1), 2, 1)If Not charDecPoint = "." Then 
	SmartTags("decimal_separator_wrong") = True
	ShowSystemAlarm "Decimal separator is wrong. Set decimal to '.', set list separator to ',' in Regional settings."
End If
Wobei decimal_separator_wrong ein internen Tag ist.

2. Die richtige Dezimaltrenner und Listenseparator einstellen.

Ein VBS Skript 'Set_DecimalSeparator' erstellen:
Code:
Dim shell

On Error Resume Next


Set shell = CreateObject("Wscript.shell")
shell.RegWrite "HKCU\Control Panel\International\sDecimal", ".", "REG_SZ"
shell.RegWrite "HKCU\Control Panel\International\sList", ",", "REG_SZ"


If Err.Number <> 0 Then
	ShowSystemAlarm "Error attempting to set the decimal separator set." & Err.Number & " " & Err.Description
    Err.Clear 
    Exit Sub
End If


SmartTags("decimal_separator_wrong") = False
SmartTags("decimal_separator_was_set") = True
ShowSystemAlarm "Decimal separator and list separator were set.\nIf the change does not take effect, then reboot the PC."


Set shell = Nothing

In den HMI wird ein Text "List and Decimal separators are wrong, use the button to set the registry values." und ein Button "Set separators" mit visibility Animation dargestellt. Nur wenn decimal_separator_wrong ist TRUE wird den Text und den Button angezeigt. Der Button ruft den Skript set_DecimalSeparator auf.
Wenn fertig wird ein Text "List and Decimal separator characters were set in the registry !" über visibility Animation durch decimal_separator_was_set angezeigt.

Das schöne ist, die Änderung hat umgehend effekt. Man braucht nicht WinCC Flex PC RT oder den PC zu stoppen und starten. Am mindestens habe ich es so auf Windows 7 getestet.

WinCCflex_decimal_1.jpgWinCCflex_decimal_2.jpg
 
Prüfung ob ein Speicherlaufwerk mit Wechselmedien vorhanden ist

Beschreibung
Im laufenden Betrieb sollen Daten eines HMI-Projekts anwendergetriggert auf ein Laufwerk mit
Wechselmedien (USB-Stick, SD-/MMC-Karte, etc.) gespeichert werden. Ein fehlendes oder aus
anderen Gründen nicht schreib bereites Speichermedium kann dabei Fehler im Ablauf erzeugen.
Sie vermeiden dies, indem Sie den Status des Laufwerks vor dem Schreibvorgang überprüfen.

Anleitung
Um die Bereitschaft des Laufwerks festzustellen, rufen Sie vor dem geplanten Schreibvorgang
eine Funktion aus einem Visual Basic Skript auf. Dessen Rückgabewert enthält den Status des
Laufwerks, anhand dessen Sie entscheiden, ob Sie den Schreibvorgang fortsetzen oder abbrechen.
Je nach verwendetem Betriebssystem (Windows oder WinCE) stellt Visual Basic Script verschiedene
Methoden bereit, die die Schreibbereitschaft des Wechsellaufwerks überprüfen.

Durchführung
Rufen Sie das Skript MediaCheckWin() bzw. MediaCheckCE() jedesmal auf, bevor Sie einen
Schreibvorgang auf das entsprechende Medium durchführen. Übergeben Sie dem Skript dabei
als Parameter den Pfad, auf dem die zu schreibende Datei liegen soll, z. B. "e:\" (Windows) oder
"\Storage Card USB\" (Windows CE).
Entscheiden Sie anhand des Rückgabewerts, ob Sie den Schreibvorgang fortführen oder abbrechen.
Der Rückgabewert "0" bedeutet, dass das Medium beim Test schreibbereit war; bei jedem anderen
Rückgabewert war das Medium nicht schreibbereit.

----- wince ------------------------------------------------------------------------------------------
Code:
Function MediaCheckCE(ByRef path)
[INDENT]
Dim fso, result
Set fso= CreateObject("Filectl.filesystem")

If fso.dir(path)="" Then
    result= 1
Else
    result= 0
End If

Set fso= Nothing
MediaCheckCE= result

[/INDENT]

End Function

----- windows ----------------------------------------------------------------------------------------
Code:
Function MediaCheckWin(ByRef path)
[INDENT]
Dim fso, drive, result
Set fso= CreateObject("Scripting.FileSystemObject")

On Error Resume Next
Set drive= fso.GetDrive(fso.GetDriveName(fso.GetAbsolutePathName(path)))

If Err.Number=0 Then
   result= 0
Else
   result= Err.Number
End If

MediaCheckWin= result
[/INDENT]

End Function

Hinweis
Beachten Sie auf Windows CE-basierten Geräten, dass es einige Augenblicke dauern kann,
ehe es nach dem Ziehen des Speichermediums zu einer Fehlermeldung kommt.

Quelle
http://support.automation.siemens.com/WW/view/de/89855157?Datakey=47069298
 
Zuviel Werbung?
-> Hier kostenlos registrieren
WinCC flexible MySQL lesen

fels jmd mal sowas machen sollte...
Code:
Const db_server="172.16.0.227"
Const db_port= "3306"
Const db_user= "sps"
Const db_pass= "sps"
Const db_name= "test"
Const db_tabelle= "wincc"

Dim conn, strConnectString, Lesen, rs, Schreiben
  
     ' sql-Anweisung
     Lesen = "SELECT `Drucker Bereit`,`Drucker drucken`,`Drucker Fertig` FROM `Kommunikation` WHERE id=1"
     Schreiben ="UPDATE `test`.`Kommunikation` SET `Drucker drucken` = '" & SmartTags("Daten.KommunikationG4W.Drucker_drucken") & "' WHERE `Kommunikation`.`id` = 1;" 
     
     ' Verbindung zu MySql Server initialisieren
     Set conn=CreateObject("ADODB.Connection")
     strConnectString = "DRIVER=MySQL ODBC 5.1 Driver;" _
               & "SERVER=" & db_server & ";" _
               & "DATABASE=" & db_name & ";" _
               & "UID=" & db_user & ";PWD=" & db_pass & "; OPTION=3"
     conn.Open strConnectString                               

     Set rs=CreateObject("ADODB.Recordset")
     
     rs.open Lesen,conn,1,1
     
     SmartTags("Daten.KommunikationG4W.Drucker_Bereit")=rs.fields(0) 
     'SmartTags("Daten.KommunikationG4W.Drucker_drucken")=rs.fields(1)
     SmartTags("Daten.KommunikationG4W.Drucker_Fertig")=rs.fields(2)
     rs.close
     
     rs.open Schreiben,conn
             
     conn.Close

EDIT Moderator Volker
Beitrag stammt aus diesem Thread
https://www.sps-forum.de/hmi/72512-wincc-flex-vbs-mysql.html
 
Zuletzt bearbeitet von einem Moderator:
Einen Beritag zu Volkers FAQ (UNICODE STRINGS in Datei schreiben und lesen).

Hiermit eine kleinen Hinweis das vielleicht in Volkers FAQ Protool/WinCCflex Daten lesen / schreiben mit VB-Script eingebunden werden kann.

Wenn man STRINGs abspeichern und eventuell auch einlesen will, und diese STRINGs eventuell UNICODE Zeichen enthällt, dann muss der VBS code so aussehen:
Code:
' schreibend
' ts ist der zu schreibende Textstream
Const Unicode = -1
Const forwriting = 2
Set ts = fso.OpenTextFile(str_Path_and_File, forwriting , True, Unicode)
ts.WriteLine SmartTags("mytextstring")

'lesend
' ts ist der Textstream wovon gelesen wird
Const Unicode = -1
Const forreading = 1
Set ts = fso.OpenTextFile(str_Path_and_File, forreading , False , Unicode)
SmartTags("mytextstring") = ts.readline
Getestet mit russiche und chinesische Zeichen.

Wichtig ! Die STRINGs die UNICODE Zeichen enthält kann nur interne Variabeln sein.
STRINGs in S7-300/400 kann keine UNICODE Zeichen, da es nur 1 BYTE pro Zeichen verwendet.
Ob STRINGs in S7-1200/1500 UNICODE Zeichen kann wollte ich gerne abgeklärt haben.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Methode zum Datei kopieren habe ich bei mir gekapselt, damit sie auf WinCE-Panel und auch auf Windows-PC laufen kann.

Datei kopieren

Code:
'Sub FileCopy(ByRef SourceFile, ByRef DestFile)
' Sub FileCopy(SourceFile, DestFile) kopiert eine Datei
' Skript kann unter WinCE und PC-Windows laufen

Dim fso
If SmartTags("_System\!_OS_is_PC_!") Then 'PC-Windows
    Set fso = CreateObject("Scripting.FileSystemObject")
    fso.CopyFile SourceFile, DestFile
Else 'WinCE
    Set fso = CreateObject("FileCtl.FileSystem")
    'FileCopy erzeugt Runtime-Error, wenn DestFile schon existiert!
    If fso.Dir(DestFile) <> "" Then fso.Kill DestFile
    fso.FileCopy SourceFile, DestFile
End If
'End Sub

Beispiel Aufruf des Skript/Sub FileCopy
Code:
'*** eine Datei nach \TEMP kopieren ***
If Not FileExist(myfile) Then
    ShowSystemAlarm "Datei '" & myfile & "' nicht gefunden."
Else
    tmpfile = "\TEMP\tempname.tmp"
    If SmartTags("_System\!_OS_is_PC_!") Then 'PC-Windows
        tmpfile = "C:" & tmpfile
    End If
    FileCopy myfile, tmpfile
End If
Die Function FileExist siehe FAQ #3


Initialisierungen bei Start der WinCC Runtime

Code:
'Sub StartInit()
' Das Skript wird bei jedem Aufruf des Startbildes aufgerufen (Ereignis: "Aufgebaut")
' Wenn dabei die HMI-Variable "StartInit_done" noch 0 (False) ist (Startwert = 0),
' dann verschiedenes initialisieren

If SmartTags("_System\StartInit_done") = 0 Then
    ' Runtime läuft auf einem PC?
    Dim fso
    On Error Resume Next 'Runtime Errors ignorieren und keine Systemmeldung!
    Set fso = CreateObject("filectl.filesystem") 'erzeugt auf PC einen Runtime Error, auf WinCE Panel kein Fehler
    If Err.Number <> 0 Then
        SmartTags("_System\!_OS_is_PC_!") = 1 'Runtime läuft auf einem PC (Simulation/Test)
        ShowSystemAlarm "O¬ the RT runs on a PC"
    End If
    Err.Clear

    ' (weitere Initialisierungen ...)


    ' Start-Initialisierung abgeschlossen!
    SmartTags("_System\StartInit_done") = True
    ShowSystemAlarm "O¬ RT-Start: Variables initialized"
End If
'End Sub

verwendete HMI-Variablen:
Code:
_System\!_OS_is_PC_!  : USInt 'Startwert: 0 | Kommentar: 0=RT auf WinCE-Panel / 1=RT auf PC (Simulation/Test)
_System\StartInit_done : Bool 'Startwert: 0 | Kommentar: Hilfsvariable Erkennung Runtime-Start
 
Datum und Uhrzeit für Dateinamen formatieren

Oft benötigt man für Dateien das aktuelle Datum und Uhrzeit im Dateiname. Um sicherzustellen, daß keine für Dateinamen unzulässige Zeichen verwendet werden (z.B. '/' oder ':') und die Dateien später in einer Auflistung (z.B. im Windows Explorer) zeitrichtig sortiert aufgelistet werden, sollte man den String mit Datum und Uhrzeit unabhängig von den Regional Settings und die Zeit-Teile immer zweistellig (Jahr: vierstellig) formatieren.
Wichtig: Die Systemzeit nur genau einmal abfragen (mit Now) und zwischenspeichern, dann den gespeicherten Wert in die Zeitbestandteile zerlegen!

Code:
'aus der Systemzeit einen String in der Form "YYYYMMDD_hhmmss" (z.B. "20991231_015959") erzeugen
Dim t, s

t = Now  'Systemzeit (Lokalzeit des HMI)
s = Year(t) & Right("0" & Month(t), 2) & Right("0" & Day(t), 2) & "_" _
  & Right("0" & Hour(t), 2) & Right("0" & Minute(t), 2) & Right("0" & Second(t), 2)
 
Zuletzt bearbeitet:
Zurück
Oben