WinCCFlex 2007 - Rezepturdatensatznummer

ssound1de

Level-2
Beiträge
351
Reaktionspunkte
27
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

habe eine erweiterte Rezepturanzeige.
Über die Dropdown-Liste wird der Datensatzname ausgewählt.
Rechts davon steht dann die Datensatznummer.

Wie komm ich an die ran?

Danke für Eure Hilfe.
Gruß
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

Sorry
Flexible 2007 Runtime auf PC
Die Nummer brauch ich in Flex.
Die Dropdown Liste soll aber auf jeden Fall auf Datensatzname bleiben, damit der Bediener sich leichter tut.
 
Ich habe 2007, nen PC und auch ne Rezepturanzeige! Ich arbeite aber nur mit dem Namen. Für was brauchst du denn die Nummer? Den Bezug von "Nummer" und "Namen" wirst du nie erfahren...
 
Ich habe auch keinen Weggefunden. Habe dann einfach "Datensatznummer" in der Rezeptur hinzugefügt und man(n) muss se dann manuel abgleichen. Nicht schön aber...
 
OK - ich versuchs mal zu beschreiben.

Ein externer Rechner (eine Leitstelle der Produktion) erkennt über RFID ein Werkzeug. An der Leitstelle werden für die jeweiligen Werkzeugtypen die zugehörigen Bearbeitungsprogramme für verschiedene Anlagen vergeben (über Namen hinter welchen sich die Datensatznummern von Flex verbergen).

Die Leitstelle übergibt die Datensatznummern (für je einen Misch- und einen Werkzeugdatensatz) an die S7.
Die S7 holt sich über die Datensatznummern die Datensätze von Flex (Steuerungsauftrag).

Ohne Störungen passt das alles.

Da die Identifizierung des Werkzeugs schon einige Stationen vor der Anlage passiert (Aufgrund notwendiger Vorlaufzeiten der Anlage), hat man im Fall einer Störung (was hoffentlich nie vorkommt, aber nicht 100%ig auszuschließen ist :cool: ) einige Werkzeuge vor der Anlage liegen, die bereits identifiziert wurden.
Wenn also bei einer Störung ein Reset auf Grundstellung der Anlage erforderlich ist, müssen unter Umständen die Datensätze zum Werkzeug (also Misch-, Werkzeugprogramm und ein vom Bediener einzugebender Parameter) manuell an der Anlagen-Visu (Flex) angewählt und per Übergabebutton an die S7 geschickt werden.

Natürlich könnten wir jetzt Listen aufhängen mit Werkzeugtypen und den zugehörigen Datensatznummer - das haben wir aber schon bei einer alten Anlage (hat leider oft zur Verwirrung geführt).

Deshalb sollte es für den Bediener so einfach wie möglich sein (also Auswahl über den Namen).
Die S7 kann aber mit dem Namen nichts anfangen - es sei denn ich hätte in der S7 eine Werkzeugtypen<->Datensatznummern Liste. Das würde aber wieder zusätzliche Pflege erfordern, da sich die Programme hier und da ändern.

Da klingt der Vorschlag von Ide noch ganz gut.

Eine andere Möglichkeit wäre noch ...
Der Bediener wählt bei Flex in der Dropdown-Liste den Namen, bekommt dann rechts davon die Datensatznummer angezeigt und gibt diese in ein E/A-Feld ein - :rolleyes: klingt auch nicht wirklich gut.
 
Ist echt ein Problem...
Du könntest aber ein Zuordnung "String Eingabefelder" zu ner Nummer machen...
Da bist du auch noch relativ "Variabel" und kannst per Skript viel machen.
Aber die Lösung mit der Nummer im Datensatz ist hier wohl das vernünftigste...
Ich halte meinen "Namen" auch im Datensatz - wegen Ex- und Import...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ist echt ein Problem...
Aber die Lösung mit der Nummer im Datensatz ist hier wohl das vernünftigste...

Denk ich auch ...
Neuen Datensatz mit Name in Dropdown-Liste anlegen (neue DS-Nummer erscheint daneben).
Diese dann gleich ins entsprechende Feld daneben eingeben = wenig Pflegeaufwand und fast nicht zu übersehen. :rolleyes:

Schade dass Siemens hier nix anbietet.

Danke für Eure Zeit und Hilfe.
Gruß
 
Habe jetzt einen Lösungsansatz gefunden, bei dem ich allerdings noch etwas Hilfe brauche.
Ich brauche dabei kein extra Feld in der Rezeptur für die Datensatznummer.
Problem mit Doppelzuweisung existiert dann auch nicht.

Hab mal die Rezeptfiles genauer unter die Lupe genommen, und siehe da ...
Sie enthalten Datensatzname, Datensatzlänge und Datensatznummer.

Hab auch schon ein Script geschrieben, das die Datensatznummer passend zum ausgewählten Namen ausliest. :ROFLMAO:
Funktioniert soweit, hat aber noch einen Haken. :rolleyes:

Wenn ich in der Dropdown-Liste den gewünschten Datensatz auswähle, greift Flex auf die Rezeptfiles zu und öffnet sie scheinbar exklusiv.
Wenn ich gleich im Anschluss an die Auswahl die Datensatznummer auslesen will, wird der JIT-Debugger gestartet (passiert im Script beim Öffnen des ersten Files) - Fehlermeldung: "Erlaubnis verweigert".

Wenn ich aber ca. 5 Sek. warte und über eine separate Schaltfläche das Script starte, funktioniert alles.

Eine Lösung wäre noch Kopien der Files anzulegen - das Script arbeitet dann mit der Kopie. Hat aber wieder Pflegeaufwand.
Ausser man legt die Kopien automatisch an. Wenn ich das beim Bildaufruf mache, kommt aber auch wieder "Erlaubnis verweigert", da Flex das Kopieren der Files und den Bildaufruf scheinbar gleichzeitig erledigt (obwohl zuerst 'FileCopy' und dann 'Aktiviere Bild' eingestellt ist).

Hat hierzu irgendjemand eine Lösung/Idee?
Zugriffmethode von Flex änderen; Zugriffsmethode des Scriptes ändern; etc.; Reihenfolge Kopieren/Bildaufruf sicherstellen?

Gruß
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Servus.

Also es gibt Möglichkeiten "Prozesse" zu Terminieren. Da musst du aber über die Windows Skripting Host "WSH" gehen.
Das ist aber glaub nicht das was du brauchst...
Ich sprech es nur ungerne aus aber was ist wenn du dein Skript an dieser Stelle 5 Sekunden warten lässt bis der Zugriff erlaubt ist?

Schick mir mal das Script per PN oder stell es hier ein.
 
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. :confused: (die Methode 'ReadAll' hat nicht sauber funktioniert :confused: ).

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. :cool:

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. :rolleyes:

Gruß
 
Zuletzt bearbeitet:
Sorry - hab die Bilder vergessen ...
 

Anhänge

  • 1 Zwischenbild.JPG
    1 Zwischenbild.JPG
    11 KB · Aufrufe: 13
  • 2 Explorer.JPG
    2 Explorer.JPG
    41 KB · Aufrufe: 11
  • 3 GetDSNum-Para.JPG
    3 GetDSNum-Para.JPG
    20,9 KB · Aufrufe: 11
  • 4 mki-Para.JPG
    4 mki-Para.JPG
    17,6 KB · Aufrufe: 11
  • 5 Variable.JPG
    5 Variable.JPG
    31,2 KB · Aufrufe: 12
Saubere Arbeit!
So in der Richtung mache ich das mit meinem "Filebrowser" auch!
Mit der Wsh kann man schon einiges anstellen. Aber eigentlich müsste da Sie handeln!

Wg. deinem 5 Sec Problem... Wenn du weißt welcher Prozess auf die Rezepturverwaltung zugreift dann kannst du mittels Skript diesen "terminieren".
 
Zuletzt bearbeitet:
Zurück
Oben