-> Hier kostenlos registrieren
Hallo zusammen,
ich hätte da eine Frage zum Schreiben von binären Daten auf einen USB Stick.
Es soll eine PDF Datei, welche zyklisch in mehreren Teilen von einer S7 1500 empfangen und dann auch dem HMI schrittweise zur Verfügung gestellt wird, per WinCC Comfort Panel oder RT Advanced in eine Datei geschrieben werden.
D.h. die Datei besteht bereits, wird bei der Übertragung in mehrere Teile zerlegt, und im Anschluss am HMI wieder zusammengebaut.
Leider funktioniert das Schreiben als Textdatei nicht zu 100%, weil die PDF Datei 0x00 enthalten kann und das als Textende interpretiert wird.
D.h. hier wird das Schreiben abgebrochen.
Daher die Frage, wie die Daten nicht als Text, sondern binär geschreiben werden können.
Vielen Dank im Voraus.
ich hätte da eine Frage zum Schreiben von binären Daten auf einen USB Stick.
Es soll eine PDF Datei, welche zyklisch in mehreren Teilen von einer S7 1500 empfangen und dann auch dem HMI schrittweise zur Verfügung gestellt wird, per WinCC Comfort Panel oder RT Advanced in eine Datei geschrieben werden.
D.h. die Datei besteht bereits, wird bei der Übertragung in mehrere Teile zerlegt, und im Anschluss am HMI wieder zusammengebaut.
Code:
Const WCE = 1 ' Windows CE
Const WIN = 2 ' Windows
Const SystemText = "PDF Anzeige: "
Const ErrorText = "Fehler beim Speichern der Datei!! "
Const READ = 1
Const WRITE = 2
Const APPEND = 8
Dim file
Dim path
Dim OperatingSystem
Dim fs
Dim fo
Dim text
Dim SizeStart
Dim SizeEnd
' Initialisation of variables
file = SmartTags("DataPdfView.HMI.Out.Data.Filename")
path = "\Storage Card USB\"
' Start of error routine
On Error Resume Next
' Check operating system
OperatingSystem = 0
Set fs = CreateObject("Filectl.Filesystem")
If 0 = Err.Number Then
OperatingSystem = WCE
Else
Err.Clear
Set fs = CreateObject ("Scripting.FileSystemObject")
If 0 = Err.Number Then
OperatingSystem = WIN
End If
Err.Clear
End If
If 0 = OperatingSystem Then
ShowSystemAlarm SystemText & ErrorText & "Betriebssystem wurde nicht erkannt!"
Exit Sub
End If
' Query directory
If WCE = OperatingSystem Then
If "" = fs.Dir(path) Then
ShowSystemAlarm SystemText & ErrorText & "Verzeichnis: """ & path & """ wurde nicht gefunden!"
fs.Close
Set fs = Nothing
Exit Sub
End If
Else
If Not fs.FolderExists(path) Then
ShowSystemAlarm SystemText & ErrorText & "Verzeichnis: """ & path & """ wurde nicht gefunden!"
SmartTags("DataPdfView.HMI.In.Handshake.Error") = True
fs.Close
Set fs = Nothing
Exit Sub
End If
End If
' Delete old file
If SmartTags("DataPdfView.HMI.Out.Data.Delete") Then
path = path & file
If WCE = OperatingSystem Then
fs.Kill(path)
Else
fs.DeleteFile(path)
End If
' Check for errors
If 0 <> Err.Number Then
ShowSystemAlarm SystemText & "Fehler beim Löschen der Datei " & file & " Error # " & CStr(Err.Number) & " " & Err.Description
Err.Clear
Else
ShowSystemAlarm SystemText & "Datei " & file & " wurde gelöscht"
End If
End If
' Write new file
If SmartTags("DataPdfView.HMI.Out.Data.Write") Then
' Save file size before writing
path = path & file
Err.Clear
If WCE = OperatingSystem Then
SizeStart = fs.FileLen(path)
Else
SizeStart = fs.GetFile(path).Size
End If
If 0 <> Err.Number Then
SizeStart = 0
Err.Clear
End If
' Create file object
If WCE = OperatingSystem Then
Set fo= CreateObject("FileCtl.File")
' Check for errors
If 0 <> Err.Number Then
ShowSystemAlarm SystemText & ErrorText & "Error # " & CStr(Err.Number) & " " & Err.Description
Err.Clear
fs.Close
Set fs = Nothing
Exit Sub
End If
' Open or create a file
fo.Open path, APPEND
' Check for errors
If 0 <> Err.Number Then
ShowSystemAlarm SystemText & ErrorText & "Error # " & CStr(Err.Number) & " " & Err.Description
Err.Clear
fs.Close
fo.Close
Set fs = Nothing
Set fo = Nothing
Exit Sub
End If
Else
' Open or create a file
Set fo = fs.OpenTextFile(path, APPEND, True)
' Check for errors
If 0 <> Err.Number Then
ShowSystemAlarm SystemText & ErrorText & "Error # " & CStr(Err.Number) & " " & Err.Description
Err.Clear
fs.Close
fo.Close
Set fs = Nothing
Set fo = Nothing
Exit Sub
End If
End If
' Write data to file
text = SmartTags("DataPdfView.HMI.Out.Data.Content")
If WCE = OperatingSystem Then
fo.LinePrint(text) ' TODO newline is added
Else
fo.Write(text)
End If
If 0 <> Err.Number Then
ShowSystemAlarm SystemText & ErrorText & "Error # " & CStr(Err.Number) & " " & Err.Description
Err.Clear
fs.Close
fo.Close
Set fs = Nothing
Set fo = Nothing
Exit Sub
End If
'Check file size after writing
If WCE = OperatingSystem Then
SizeEnd = fs.FileLen(path)
Else
SizeEnd = fs.GetFile(path).Size
End If
If 0 <> Err.Number Then
ShowSystemAlarm SystemText & ErrorText & "Error # " & CStr(Err.Number) & " " & Err.Description
Err.Clear
fs.Close
fo.Close
Set fs = Nothing
Set fo = Nothing
Exit Sub
End If
If SizeStart + SmartTags("DataPdfView.HMI.Out.Data.Length") <> SizeEnd Then
ShowSystemAlarm SystemText & ErrorText & "Datei: " & file & ", erwartete Dateilänge: " & SizeStart + SmartTags("DataPdfView.HMI.Out.Data.Length") & " Bytes, tatsächliche Dateilänge: " & SizeEnd & " Bytes."
Err.Clear
fs.Close
fo.Close
Set fs = Nothing
Set fo = Nothing
Exit Sub
End If
' Close file
fs.Close
fo.Close
' Release object
Set fs = Nothing
Set fo = Nothing
ShowSystemAlarm SystemText & "Daten wurden erfolgreich gespeichert. Datei: " & file & ", alte Dateilänge: " & SizeStart & " Bytes, neue Dateilänge: " & SizeEnd & " Bytes."
End If
Leider funktioniert das Schreiben als Textdatei nicht zu 100%, weil die PDF Datei 0x00 enthalten kann und das als Textende interpretiert wird.
D.h. hier wird das Schreiben abgebrochen.
Daher die Frage, wie die Daten nicht als Text, sondern binär geschreiben werden können.
Vielen Dank im Voraus.