Hallo zusammen,
Zum Thema mit der Textdatei: Ich hab mir auch gedacht, dass eigentlich keinen Unterschied macht, ob nun eine Ausgabe in Tracefenster oder in eine Textdatei erfolgt. Aber da rostiger Nagel mehrfach gefragt hat, wollte ich es einfach mal ausprobieren und die Ergebnisse teilen.
Ich will Dir ja nicht zu nahe treten, doch so langsam verstärkt sich mein Gefühl, daß Du Dir zwar schon zutraust ein großes Skript zu schreiben, andererseits aber zu wenig Ahnung von VBS hast, um da mal erfolgreich eine gezielte Fehleranalyse zu machen. Vielleicht sind deshalb Deine Antworten kaum hilfreich und oft nicht eindeutig? Auf meine Vermutung daß falsche Variablenwerte verarbeitet werden, bist Du gar nicht eingegangen.
Ist so eigentlich ziemlich richtig. Ich habe schon mal größere Programme geschrieben allerdings programmiere ich normalerweise MS-Anwendungen in C# oder schreibe kleinere SPS-Programme. Also es ist schon so, dass ich mir das zutraue und ich auch schon programmiert habe, allerdings jetzt das erste Mal in VBS. Und vor allem das erste mal ohne einen vernünftigen Debugger mit dem ich während der Laufzeit meines Programms Schritt für Schritt betrachten kann. Wie in einem früheren Post schon mal erwähnt ich bin noch neu in der Branche.
Zu den Variablenwerten kann ich nur sagen, dass ich mir jede Variable vor und nach dem LookupText per Trace ausgeben lasse und immer die Werte darin stehen, die ich auch erwarte, dass sie da drin stehen.
Beschreibung des gesamten Projekts:
Mein Kunde produziert Fertiganlagen in Serie, weshalb Namensgebung und Funktionen einheitlich zu halten sind. Er möchte jetzt für die neue Generation mit einem Batchreport ausstatten.
Der Batchreport soll mit dem Start eines Rezepts für eine Funktionsgruppe beginnen. Es werden ein paar Grundinformationen in einen Header eingetragen übliches BlaBla Rezeptname, Datum,, etc.. Während das Rezept läuft sollen alle Sollwerte einer Funktion aufgezeichnet werden, sobald diese aktiv ist. Außerdem sollen auch die Änderungen der Sollwerte mitgeloggt werden, solange die Funktion und das Rezept aktiv sind. Die Funktionen haben immer die gleiche Nummer für jede Funktionsgruppe (FG1 Dispergieren ist FktNr 5 -> FKT01-01-
05, FG2 Dispergieren ist FktNr5 -> FKT02-01-
05). Sie möchte jetzt das ich für FKT01 ein Skript schreibe, welche diese Aufgabe erfüllt und Sie einfach per Copy-Paste für ihre anderen Funktionsgruppen verwenden können.
Ich mache das jetzt momentan so:
Über einen Variablentrigger auf dem Rezeptstart setze ich ein Bit "Batch_active". Direkt am Anfang meines zyklischen Skripts wir mit "if" dieses bit abgefragt. Sollte das Bit nicht gesetzt sein wird in dem Skript kein Code ausgeführt. Im Hauptskript läuft ein Counter mit, damit ich feststellen kann, im wievielten Aufruf ich mich befinde. Denn beim ersten Aufruf werden einmalige Sachen in die Csv geschrieben, wie Header und Randinformationen zum Batch: Rezeptname, Sollmenge, Datum, usw.
Sobald dieser Teil in der csv-Datei steht, beginnt der Teil, der immer zyklisch überwacht werden soll. Ich prüfe bei jedem Aufruf, ob sich der User verändert hat, um es gegebenenfalls in die csv zu schreiben. Außerdem überwache ich alle Funktionen, die zu diesem Rezept bzw. dieser Funktionsgruppe gehören. Eine Funktionsgruppe hat laut Kunde maximal 99 Funktionen und diese Funktionen haben in jeder Gruppe die gleiche Nummer(z.B. Funktionsgruppe1-Dispergieren -> FKT01_01_05 als Variablenpräfix, Funktionsgruppe4-Dispergierenm-> FKT04_01_05). Da die Batch-Protokollierung für alle Funktionsgruppen einsetzbar sein soll, muss ich immer mit den maximal 99 Funktionen rechnen, weis aber nie welche wirklich verwendet werden. Hinzu kommt, dass die Funktion eigentlich nie nummerisch geordnet vorkommen sonder auch öfters mal eine weggelassen wird (z.B. Funktionsgruppe1 hat die Funktionen 01, 02, 05,10,20,66).
Über ein DWord, das für jede Funktion ander selben Stelle der entsprechenden HMI-Variablenstruktur steht und in der SPS immer gleich gebildet wird, kann ich den Status der einzelnen Funktionen auslesen. Ist eine Funktion aktiv beginnt der Sollwertvergleich, das Skript mit CInt um das es zuvor immer ging. (Deswegen wird das Skript momentan ca. 3 mal pro Sekunde aufgerufen, da ich pro Hauptskriptaufruf momentan mit 3 aktiven Funktionen teste). In dem Skript mit CInt hole ich mir die wichtigsten Werte zur Funktion aus einer Textliste: Anzahl von Sollwerten und Name der Funktion. Sollte sich im Vergleich zum letzten Zyklus ein Sollwert geändert haben, wird der neue Sollwert in die csv-Datei geschrieben. Um diese nun mit Sinnvollem Text zu füllen, lies ich in der gleichen Textliste die entsprechende Texte aus.
Also grob zusammen gefasst: Zum Rezeptstart wird der Batch-Report gestartet. Am Anfang stehen einige Grundinformationen zum Batch. Ab dann muss jede Änderung des Users erfasst werden. Außerdem muss mitgeloggt werden, wenn sich ein Sollwert einer laufenden Funktion ändert/ er vom Bediener geändert wird. Dazu soll noch im Batch zu erkennen sein, wenn das Rezept pausiert wurde oder Bediener von Hand Funktionen der Funktionsgruppe übersprungen hat.
Ich muss also ständig prüfen, ob sich irgendetwas im Umfeld der Funktionsgruppe verändert, weshalb ich ein zyklisch Skript verwende, weil ich mir nix anderes vorstellen konnte.
Ich hoffe ich habe alles für euch verständlich zusammen gefasst.
Gruß
Newbie