OK, hat etwas gedauert - ich versuchs mal.
Vorab - ich arbeite mit Kopien der RezeptFiles, denn aus irgendwelchen Gründen wurden von den Originaldateien NULL-Bytes eingelesen.
Nur am Anfang und am Ende der Dateien waren 'echte' Daten enthalten.
(die Methode 'ReadAll' hat nicht sauber funktioniert
).
Ich gehe vom Startbild über ein Zwischenbild (bei dessen Aufbau kopiere ich die Dateien), und von dort auf das eigentliche Bild mit der Dropdown-Liste zur Auswahl der Rezeptur (WICHTIG: Im Startbild und Zwischenbild darf keine Rezepturanzeige mit den zu kopierenden Dateien angelegt sein -> sonst wieder 'Erlaubnis verweigert').
Interessant sind nur die beiden Dateien .rdf und .dat
.rdf enthält Referenzdaten (Datensatzposition im .dat File, -länge und -nummer)
.dat enthält die Daten der einzelnen Rezepturelemente
Hier das Kopierscript (CopyRecFiles) ...
Code:
Dim s
Dim d
Dim fs1
Set fs1 = CreateObject("Scripting.FileSystemObject")
s = "c:\recipes\PTRCP_Mischprogramme_1.rdf"
d = "c:\recipes\PTRCP_MischprogrammeKopie_1.rdf"
fs1.CopyFile s, d, True
s = "c:\recipes\PTRCP_Mischprogramme_1.dat"
d = "c:\recipes\PTRCP_MischprogrammeKopie_1.dat"
fs1.CopyFile s, d, True
s = "c:\recipes\PTRCP_Formprogramme_2.rdf"
d = "c:\recipes\PTRCP_FormprogrammeKopie_2.rdf"
fs1.CopyFile s, d, True
s = "c:\recipes\PTRCP_Formprogramme_2.dat"
d = "c:\recipes\PTRCP_FormprogrammeKopie_2.dat"
fs1.CopyFile s, d, True
Die Dropdown-Liste der Rezepturanzeige enthält als Variable die Rezeptnummer und den Datensatznamen.
Die Variable für den Datensatznamen ist auf Wertänderung eingestellt und ruft die Function GetDSNum auf.
Folgende Parameter müssen übergeben werden ...
1. DS_Name = Variable für den Datensatznamen
2. Rec_Num = Variable für die Rezeptnummer
3. Rec_Name = Name der Rezeptur (direkte Eingabe)
4. Folder_Name = Ordnername auf der HDD (direkte Eingabe mit abschließendem \ )
5. P_Name = Name des Bildes in welchem die Function laufen soll (direkte Eingabe)
(siehe Bild)
Der Rückgabewert der Function kann auf eine Variable gelegt werden.
Die Function benötigt noch eine Unterfunktion um ASC -> Int zu wandeln.
Hier erstmal die Unterfunktion ...
(Aufruf mit 'mki (2 Byte großer String)')
Code:
Dim n, x, y
x = Asc(Right(s, 1))
x = x * 256
y = Asc(Left(s, 1))
n = x + y
MKI = n
Und hier die Haupt-Function zum Auslesen der Datensatznummer ...
Code:
Dim PicName
PicName = HmiRuntime.BaseScreenName
If PicName <> P_Name Then 'Bildname prüfen
GetDSNum = 0
Exit Function
End If
Dim fs1
Dim f1, f2
Dim f1l, f2l
Dim file1, file2
Dim RefFile, DatFile
Dim RefString, DatString
Dim RefLoc, DatLoc
Dim RefSet
Dim Result
Dim i
Dim s
Dim a, b
s = DS_Name 'Datensatzname - als Übergabeparameter
Const ForReading = 1 'Datei nur lesen
f1 = Folder_Name & "PTRCP_" & Rec_Name & "_" & Rec_Num & ".rdf" 'Enthält Datenreferenz
f2 = Folder_Name & "PTRCP_" & Rec_Name & "_" & Rec_Num & ".dat" 'Enthält die Rezeptdaten
Set fs1 = CreateObject("Scripting.FileSystemObject")
Set file1 = fs1.GetFile(f1)
Set file2 = fs1.GetFile(f2)
f1l = file1.Size 'ReferenzFile Länge
f2l = file2.Size 'DatenFile Länge
Set RefFile = file1.OpenAsTextStream(ForReading,0)
Set DatFile = file2.OpenAsTextStream(ForReading,0)
RefString = RefFile.Read(f1l) 'Ges. ReferenzFile einlesen
DatString = DatFile.Read(f2l) 'Ges. DatenFile einlesen
DatFile.Close
RefFile.Close
Result = 0
RefLoc = 5 'Zeiger auf 1.ten ReferenzDatensatz
Do Until RefLoc > f1l 'ReferenzEnde erreicht?
RefSet = Mid(RefString,RefLoc,12) 'Einen Referenz-Datensatz auslesen
DatLoc = (MKI(Mid(RefSet,3,2)) * &H10000) + MKI(Mid(RefSet,1,2)) 'Zeiger auf Daten des Rezept-Datensatzes
b = Mid(DatString, DatLoc + 5, Len(s)) 'Name auslesen
If b = s Then 'Name im Datenblock mit DS_Name vergleichen
a = Mid(RefSet,9,2) 'Datensatznummer ermitteln
Result = MKI(a) 'nach Integer wandeln
Exit Do 'Schleife verlassen
End If
RefLoc = RefLoc + 12
Loop
GetDSNum = Result
Noch ein Hinweis zur Sicherheit: Anwendung auf eigene Gefahr.
Kein Support, keine Garantie.
Habe es auf meinem Rechner (Simu) und in der RT (ohne S7) getestet, und es funktioniert soweit.
Mögliche Probleme könnten z.B. sein ...
Originaldaten werden gerade kopiert und gleichzeitig kommt der Befehl "Schreibe Datensatz in Steuerung" (Zugriffsverletzung ??). OriginalFiles sind während des kopierens möglicherweise kurzzeitig für Flex blockiert (wirklich nur kurz - habe probehalber eine 64MB Datei in einen String eingelesen - hat nur ca. 1,5 sek. gedauert).
Außerdem besteht immer noch das 5 sek. Problem.
Es tritt z.B. auf wenn ich in einem anderen Bild mit Rezepturanzeige bin (Rezepteingabe), gehe dann auf das Startbild und anschließend das Zwischenbild (innerhalb 5 sek.), sind die RezeptFiles immer noch durch Flex geöffnet, und es kommt beim Datei kopieren wieder die Meldung 'Erlaubnis verweigert'. :sb6:
Vielleicht hat noch irgendjemand eine Idee, wie das besser zu lösen ist.
Dies ist nur ein Ansatz.
Das Beste wäre natürlich -> Siemens würde hier was tun.
Gruß