Probleme mit Skript

Neuling74

Level-2
Beiträge
77
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Forum!
Ich habe ein Skript in WinCC flexible 2008 SP2 erstellt, um mir eine Datei auszulesen und die Werte in die SPS zu übernehmen. Es handelt sich um eine TXT-Datei in der unter anderem eine art Tabelle steht. Die Werte in der Tabelle sind durch ":" getrennt. In der Regel sind das weniger als 100 Zeilen. Das Skript funktioniert soweit auch, ABER wenn ich in der Tabelle mehr als 100 zeilen habe, werden nur 100 oder manchmal auch 102 Zeilen eingelesen. Habe das Skript und die Datei mal angehängt. Bin für jeden Tipp dankbar. Kann es auch einzeitliches Problem sein? Es dauert ungefähr 20 sek bis die Daten eingelesen sind. Das Skript hat mir Praktikant vor einigen Jahren mal geschrieben. Nochmals Danke dafür. Zu dieser Zeit hatten die Tabellen nie mehr als 100 Einträge. Wenn er das liest kann er sich vielleicht erinnern.
Noch ein paar Randdaten:
Runime auf PanelPC577B
CPU 315-2 PN/DP
Verbindung Ethernet
Danke schon einmal

Anhang anzeigen 81481BC0026.txtAnhang anzeigen Datei einlesen.doc
 
Hallo,
das Script sieht erstmal gar nicht so schlecht aus. Ich habe auch nichts entdecken können, was den von dir beschriebenen Effekt erklären würde ... aber : wie groß sind denn die Array's, in die du schreibst, dimensioniert ? Vielleicht liegt es ja da dran ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Larry!
Erstmal Danke für die Antwort. Hatte jetzt ein langes Wochenende und kann daher erst jetzt antworten :D. Also, die Arrays sind dimensioniert und zwar richtig. Die Arrays haben 200 Elemente. Daran hatte ich auch schon gedacht, aber das ist das Problem leider nicht. Sollte noch jemandem etwas einfallen, bitte posten. Danke!
 
Es gibt eine On Error Resume Next innerhalb von den DO WHILE Schleife, aber keine ERR Auswertung.
Es bedeutet das wenn das Skript ein Problem hat, wird es einfach ignoriert und das Skript lauft weiter ohne Warnmeldungen.

Plazier diese Code mindestens einmal in der DO WHILE Schleife:

Code:
If Err.Number <> 0 Then
 ShowSystemAlarm "Script Read Vars error" & Err.Number & " " & Err.Description
    Err.Clear 
    Exit Sub
End If

Mit ShowSystemAlarm hat man den Vorteil das die Warnungen in System Log archiviert werden, wenn man so etwas konfiguriert hat.
Dann bekommst du hoffentlich Meldungen um warum das Skript nicht funktioniert.

Zu den Problem: Vielleicht liegt es bei den maximalen Datenmenge das den CPU auf einmal transferieren kann. Bei ein S7-300 CPu liegt es bei ungf. 440 Bytes. Das entspricht 110 REALs.
Wobei ich bin nicht 100% sicher das die Werte erst beim Skript-Ende übertragen werden, oder bei jeden Zeile wenn das Skript lauft.

edit: Bei ARRAYs bin ich ziemlich sicher das den ganze ARRAY jeden mal komplett übertragen werden.

noch ein edit: Die 20 Sekunden find ich verdächtig. 100 REALs sollte nicht so lange brauchen um von ein PC an ein 315-2PN CPU zu transferieren. Aber wenn es 100 mal 100 REALs, dann vielliecht ja.
Es gibt vielleicht den Möglichkeit ein Zwischen-Speicher zu verwenden (irgendwie DIM TempArray() ... ), und dann beim Skript-Ende das Array nur einmal komplett übertragen (etwa wie SmartTags("Array Material.Material") = TempArray ...).
Bin nicht 100% sicher das es geht, aber ist ein Versuch wert.
 
Zuletzt bearbeitet:
Hallo Jesper!
Vielen Dank erstmal für den Tipp mit der Fehlerauswertung. War nur leider zu beschäfftigt und konnte es nicht umgehend ändern. Du hattest Recht. Das Skript meldet eine Überlast bei den Array Variablen. Das ist natürlich sehr schade. Da ich von dem Kunden gerade einen TXT-File bekommen habe, in der es 192 Zeilen sind. Das funktioniert dann so nicht. Werde deine Idee mit dem Zwischenspeicher aufnehmen und es mal ändern. Allerdings weiß ich noch nicht genau wann ich das schaffe. Habe noch andere Kommunikationsprobleme, die ich gerade behebe. Wenigstens das klappt;).
Werde mich dann die Tage noch einmal melden und Bericht erstatten.
Vielen Dank


Ich noch einmal. Also meine Idee wäre jetzt einfach eine Warteschleife einzufügen. Da ich aber von VB nicht so wirklich Ahnung habe, fällt mir das sehr schwer. Wenn mir jemand sagen könnte, wo und wie ich da eine Warteschleife einfügen kann, wäre das klasse. müsste ja irgendwie vor den Loop Befehl. Ich stelle mir das wie folgt vor:
1. Durchlauf (Werte werden in die jeweiligen Variablen geschrieben)
Warte Zeit x
2. Durchlauf
usw.

Ist das irgendwie machbar?
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Das Problem ist also das ungf. maksimal 100 REALs übertragen werden kann.
Ich glaube nicht das es helfen wird zu warten. Aber es wird helfen die Daten in mehrere Arrays bzw. Skript-Aufrufe aufzuteilen. Flexible sorgt in der Hintergrund für das die Daten gepuffert werden, und nach einander übertragen werden.
Ich wurde es in mehrere Skripte so aufteilen:

Verteiler-Skripts ruft mehrere Unter-Skripte auf.
Unter-Skript 1: Lesen von Array1.
Unter-Skript 2: Lesen von Array2.
Usw.

Array1: Nutzdaten[0..99]
Array2: Nutzdaten[100..199]
Usw.

Keine Garantie das es funktionieren wird. Aber ein paar Versuche muss es aufklären können. Das Ergebnis wäre mir auch interessant.
 
Hallo Jesper!
OK. Wenn ich das richtig verstehe soll ich die Daten iin eine interene Array-Variable schreiben, und diese dann in zwei sKripten an die SPS übertragen. Ist das so richtig?
Zur Info:
Es siind insgesamt maximal 1800 Real's. Ich habe 8 Arrays mit jeweils 200 Nutzdaten. Ich weiß, ist viel. Aber was will man machen.
 
Zuletzt bearbeitet:
Hallo,
das Ergebnis davon würde mich auch auf jeden Fall interessieren.
Ich muss dir allerdings sagen, dass ich schon bei weit geringeren Datenmengen (wenn ich die Datenquellen aufteile) Schwierigkeiten habe, die Konsistenz der Daten aufrecht zu erhalten. ich könnte mir also sehr gut vorstellen, dass du dich an dieser Stelle ggf. von Flex wegbewegen wirst müssen ... 8)

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
das Ergebnis davon würde mich auch auf jeden Fall interessieren.
Ich muss dir allerdings sagen, dass ich schon bei weit geringeren Datenmengen (wenn ich die Datenquellen aufteile) Schwierigkeiten habe, die Konsistenz der Daten aufrecht zu erhalten. ich könnte mir also sehr gut vorstellen, dass du dich an dieser Stelle ggf. von Flex wegbewegen wirst müssen ... 8)
Gruß
Larry

Das fände ich aber nicht so schön. Weil es nicht geht. Ich kann hier an der Anlage nicht das ganze System ändern.
 
Wenn ich das richtig verstehe soll ich die Daten iin eine interene Array-Variable schreiben, und diese dann in zwei sKripten an die SPS übertragen. Ist das so richtig?
Nein. Ich meine das je Skript will ich nur eine Array von 100 Reals addressieren. Und ich wurde den Verfahren mit ein Temp Array verwende.

Es siind insgesamt maximal 1800 Real's. Ich habe 8 Arrays mit jeweils 200 Nutzdaten.
Um der Grenze von ungf. 400 Bytes einzuhalten, wurde ich es in 18 Arrays je 100 Reals umorganizieren.

Aber ich bin einig mit LL, das es ist vielleicht zu viel für Flexible und VBS.
 
Vielleicht ist es sinnvoller das ganze mit Rezepte zu lösen.

Bei WinCC Flex RT sind die Grenzen max 999 Rezepte, 64000 Elemente pro Rezept, 256 kB pro Record, 5000 Records pro Rezept.
Und man brauch sich nicht um Konsistenz zu kümmern.
Und man kann die Rezepte ins CSV Dateien importieren und Exportieren.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Jesper, Hallo Larry!

Es läuft:ROFLMAO:ROFLMAO:ROFLMAO:!!! Ich habe jetzt interne Variablen als Array genommen und diese in einem ersten Skript beschrieben.
Dann habe ich aus dem ersten Skript ein zweites aufgerufen. In dem 2. Skript habe ich dann die ersten 100 x 8 REAL's übertragen. Mit einer For Next Schleife. In der SPS frage ich dann die Arrayvariable ab. Erst wenn Datensatz 99 eingelesen wurde, erhöhe ich zeitverzögert einen Zähler. Bei Wertänderung dieses Zählers starte ich dann das 3. Skript, in dem ich die restlichen Real's übertrage. Ist nicht die eleganteste Lösung, aber es funktioniert. Und das ist das wichtigste.
Vielen Dank noch einmal für eure Hilfe und Anregungen. Danke, Danke, Danke, Danke:sm24:
 
Hallo Jesper, Hallo Larry!

ES LÄUFT:ROFLMAO:ROFLMAO:ROFLMAO:
Ich habe es jetzt wie folgt gelöst. In dem ersten Skript(das ich oben auch angehängt hatte) habe ich jetzt nicht die Arrays beschrieben, sondern interne Variablen, die als Array dekleriert.
Beim Aufruf schreibe ich mir also die Werte in interne Variablen. So weit, so gut! In diesem Skript rufe ich ein 2. Skript auf, in dem ich mit einer For Next Schleife die ersten 100 x 8 Werte in die SPS transferiere. Funktioniert auch. Dann habe ich aus dem 2. Skript ein 3. Skript aufgerufen, in dem ich den Rest transferiere. DAS GEHT NICHT!!! Da kommt dann wieder überlast der Variablen und er verliert Werte, wenn das Skript überhaupt abgearbeitet wird.
Was tun?
Ich habe in der SPS eine Abfrage gemacht, ob die ersten Werte übernommen worden sind. Wenn ja, erhöhe ich zeitverzögert(20 sekunden) einen Zähler. Diesen Zähler nutzt ich dann um das 3.Skript auszuführen(bei Wertänderung).
Ist zwar nicht die eleganteste Lösung, aber es funktioniert.
:razz:

Ich danke Euch noch einmal für Eure Mühen, Anregungen und Überlegungen. Vielen Dank.


Wenn ich noch mal ein Problem habe werde ich mich direkt bei Euch melden(PN) wenn es Euch recht ist. Wenn nicht hier übers Forum.
Einen schönen Tag noch.
Gruß


Warum stehen denn jetzt beide Antworten drin? Naja, egal. Doppelt hält besser
 
Hallo Neuling,
(das hört sich im Zusammenhang mit dem Fortgang dieses Thread ein bißchen komisch an)

... Da kommt dann wieder überlast der Variablen und er verliert Werte, wenn das Skript überhaupt abgearbeitet wird.
Überlast ???
Das kenne ich eigentlich nur in Verbindung mit der Scriptbearbeitung, wenn zu viele Scripte gleichzeitig aktiv sind (m.E. ist hier 20 die Grenze).
Wie du es ungefähr gemacht hast kann ich mir vorstellen.

Woran erkennst du in der SPS ob die ersten Werte übernommen worden sind ? Prüfsumme o.ä. ?
Wie lange du wartest spielt hier m.E. keine wirkliche Rolle. Ich hatte es für einen größeren Datenblock (das war aber noch ProTool-Zeit) so gemacht, das ich am Anfang und am Ende des Datenblocks eine Trigger-Variable hatte - auf die habe ich reagiert (Wertänderung), meinen Ablauf aber nur dann ausgeführt, wenn beide den gleichen Inhalt hatten. Mir ging es allerdings um den umgekehrten Weg (von der SPS zur Visu). Das Prinzip könnte aber für dich auch brauchbar sein ... (den Tip hatte ich damals von Jesper erhalten - das war nicht schecht :)).

Das du deine Variablen in interne Variablen packst ist sicherlich nicht schlecht. Wenn du Datenblöcke überspielst ist es vielleicht nicht unpraktisch, wenn du die SPS-Array's (von der Variablendefinition her) gleich groß mit den auf einmal zu übertragenden Daten definiert hast - so kannst du die Konsistenz-Geschichte sicher noch am Ehesten unter Kontrolle behalten. Mit den 100 * 8 Reals überschreistest du aber auch definitiv wieder die von Jesper genannte Grenze - ich kannte das gar nicht, habe hier aber zu Jesper das größte Vertrauen.

Einen weiteren Gedanken-Austausch können wir natürlich auch über PN machen - im Sinne dieses Themas halte ich es den (allen) Anderen gegenüber öffentlich für fairer ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Lieber Forum-Gespräche als PN.

Der "PDU" Wert ergit wieviel Daten ein S7 CPU auf einmal transferieren kann.
Bei S7-300 ist es 240 Bytes (nicht 440 wie ich vorher schrieb), bei S7-400 ist es 480 Bytes.
Sind die Daten REALs oder INTs ? Wenn INTs stimmt es mit die 240 Bytes (=120 INTs). Wenn REALs, dann weis ich nicht woran das Problem stosst.
Bin nicht sicher ob die Übertragung von mehr als 240 Bytes komplett fehlschlagen wird, oder es geht aber in mehrere Klumpen einer-nacheinander. Wenn es als mehrere Klumpen kommt, dann hat man das Problem mit Datenkonsistenz.
 
Hallo Larry!
Hier mal der genaue Wortlaut aus dem Meldearchiv:
Variable Array Länge Einlage.Laenge_Einlage: Überlast, Werte gehen verloren.
Diese Meldung kommt bei allen Array Variablen.

"Woran erkennst du in der SPS ob die ersten Werte übernommen worden sind ? Prüfsumme o.ä. ?"
Ich lese mir die Variable in der SPS ein, und Vergleiche den inhalt mit "0". Das geht am einfachsten. Ich muss dazu sagen, dass ich die Werte immer lösche bevor ich einen neuen .TXT-File einlese.
Wie lange du wartest spielt hier m.E. keine wirkliche Rolle.
Anscheinend doch. Hatte die Zeit vorher nicht drin und dann hat es nicht funktioniert. Mehr kann ich dazu allerdings nicht sagen.
Das kenne ich eigentlich nur in Verbindung mit der Scriptbearbeitung, wenn zu viele Scripte gleichzeitig aktiv sind (m.E. ist hier 20 die Grenze).
Es ist nur ein Skript aktiv zu dieser Zeit.
 
OK ... das heißt dann, dass du dir bezüglich der Datenübergabe etwas einfallen lassen mußt.
Warten im Script ist immer so eine Sache ...
Das du erst 0-Werte überträgst macht es für die Visu (hinsichtlich des Daten-Austausches) nicht leichter. Das Löschen könnte auch die SPS für dich erledigen (du setzt ein Bit, die SPS löscht den Speicherbereich und gibt dir ggf. anschließend ein Feedback zurück).

Was hältst du von meinem Vorschlag mit den Teil-Array's - vielleicht gerade im Hinblick auf die von dir genannte Überlast ?

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Larry,

OK ... das heißt dann, dass du dir bezüglich der Datenübergabe etwas einfallen lassen mußt.
Warten im Script ist immer so eine Sache ...
Was hältst du von meinem Vorschlag mit den Teil-Array's - vielleicht gerade im Hinblick auf die von dir genannte Überlast ?
Das habe ich ja. Es funktioniert ja jetzt. Habe die Arrays gesplittet und übertrage die jetzt nach einander. Hatte ich oben aber bereits erwähnt.

Das du erst 0-Werte überträgst macht es für die Visu (hinsichtlich des Daten-Austausches) nicht leichter. Das Löschen könnte auch die SPS für dich erledigen (du setzt ein Bit, die SPS löscht den Speicherbereich und gibt dir ggf. anschließend ein Feedback zurück).
Habe mich da vielleicht ein wenig falsch ausgedrückt. Ich übertrage die "0" nicht , sondern schreibe in der SPS eine 0 in alle Arrayelemente.

Aber schön zu wissen das dieses Thema Dich so fesselt.;)
Habe jetzt alles im Griff. Es läuft alles so wie ich es haben wollte.
Noch einmal ein dickes Dankeschön Euch beiden.
Wünsche Euch ein schönes Wochenende.
Man liest sich
 
Zurück
Oben