Skript: TP > Excel Übertragung zu Langsam o. TP hängt

Hocheck

Level-1
Beiträge
69
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren

Hardware:
Speed 7 313 SC
TP277
Crossover Kabel
PC
Problem

Mit Hilfe des Skripts unten, sollen Werte, die in einem DB (mit UDTs erstellt) stehen in eine Txt oder csv Datei geschrieben werden. Die Datenmenge ist groß. Es müssten ca. 720 (20 Schritte x36 Variablen) Variablen zu über 1KB übertragen werden. Die Verbindung zum PC steht und funktioniert.
Das Übertragen und Schreiben von 5 Schritten(180 Variablen) im Skript funktioniert problemlos. Wenn ich aber die restlichen Schritte anhänge an das Skript, so dauert es unendlich und scheinbar hängt sich das Panel auf.

Der Erfassungszyklus jeder Variable ist 100ms!

Ich habe viel gegoogled, bisher , aber ich finde mir wirklich keinen Rat womit das zu tun haben kann.
Wenn ich smarttags verwende das gleiche Schauspiel. Wie gesagt bis zum 5. Schritt wird alles übertragen, sobald ich dann den restlichen Code anhänge, hängt es sich auf.

Was mache ich falsch? Es müsste aber doch möglich sein die 720 Variablen in eine csv Datei zu schreiben, oder?

Skript:

Path ist der PC Name – Verbindung ist aktiv

'----------Objekt erstellen für Dateizugriff------------------------------------------------

Set f = CreateObject("FileCtl.File")
If Err.Number <> 0 Then
ShowSystemAlarm "Error #" & CStr(Err.Number) & " " & Err.Description
Err.Clear
Exit Sub
End If

'----------Datei erstellen. Öffnen der .txt oder .csv Datei--------------------------------

f.open path , 2
If Err.Number <> 0 Then
ShowSystemAlarm "Error #" & CStr(Err.Number) & " " & Err.Description
Err.Clear
Exit Sub
End If

'----------Daten schreiben in .txt oder .csv Datei----------------------------------------

f.LinePrint("Stationsnummer:;"& ";")
f.LinePrint(";")
f.LinePrint("///Variablename///; "& "///Wert///;" & ";")

f.LinePrint("///Schritt 1 ///")
f.LinePrint("Var_1 :; " & Schritt_1_ Var_1 )'Typ: BOOL
f.LinePrint("Var_2 :; " & Schritt_1_ Var_2)'Typ: BOOL
f.LinePrint("Var_3 :; " & Schritt_1_ Var_3)'Typ: BOOL
f.LinePrint("Var_4 :; " & Schritt_1_ Var_4)'Typ: BOOL
f.LinePrint("Var_5:; " & Schritt_1_ Var_5)'Typ: INT
……
f.LinePrint("Var_36 :; " & Schritt_1_Var_36)'Typ: DINT
….
….
….
f.LinePrint("///Schritt 20 ///")
f.LinePrint("Var_1 :; " & Schritt_20_ Var_1 )'Typ: BOOL
f.LinePrint("Var_2 :; " & Schritt_20_ Var_2)'Typ: BOOL
f.LinePrint("Var_3 :; " & Schritt_20_ Var_3)'Typ: BOOL
f.LinePrint("Var_4 :; " & Schritt_20_ Var_4)'Typ: BOOL
f.LinePrint("Var_5:; " & Schritt_20_ Var_5)'Typ: INT
……
f.LinePrint("Var_36 :; " & Schritt_20_Var_36)'Typ: DINT
 
Hallo,
dazu gleich noch ein paar Fragen :
- schreibst du direkt in die Datei auf den PC ? - wenn ja, dann versuch doch mal die Datei auf dem TP erst lokal zu erzeuigen und dann per copy zu übertragen.
- erhältst du irgendeine Meldung vom TP ?
- was stösst auf dem TP dieses Script an ? - kann es sein, dass das Script (nochmal) gestartet wird während es in der ersten Instanz noch läuft ?

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Larry,
Danke für die schnelle Antwort...

Zu deinen Fragen:

- erhältst du irgendeine Meldung vom TP ?

Nein ich bekomme keine Meldung vom TP- Ich denke sogar, dass es auch komplett übertragen werden könnte- Meine Vermutung ist, dass das Problem bei den verschiedenen Zykluszeiten liegt- Der DB aus dem ich Lade ist ziemlich groß-- ca 6 kB an Variablen... Kann es sein, dass das Skript dann im TP immer warten muss bis der Zyklus im DB wieder die Variable erreicht?! Oder liegt es gar einfach an meinem Crossover Kabel? Das ist nämlich !10 Meter! lang... Sollte aber doch egal sein, oder? Naja jedenfalls ist die Dauer einfach zu lange- Komisch ist wirklich dass es ab dem 6. Block der übertragen wird richtig lange dauert- bzw- es kein Abschluss gibt innerhalb von 5 Minuten...

- was stösst auf dem TP dieses Script an ? - kann es sein, dass das Script (nochmal) gestartet wird während es in der ersten Instanz noch läuft ?

Es ist eine "Speichern" Schaltfläche, die über Klicken das Skript auslöst. Im Skript habe ich mir dann noch eine Variable eingebaut, die diese Schaltfläche ausblendet sobald das Skript aktiv ist- daran sollte es also eigentlich nicht liegen....



- schreibst du direkt in die Datei auf den PC ? - wenn ja, dann versuch doch mal die Datei auf dem TP erst lokal zu erzeuigen und dann per copy zu übertragen.

Ja ich schreibe direkt in die Datei auf dem PC. An diese Sache habe ich noch garnicht gedacht- Müsste ich dann einfach anstelle des PC Paths einen Ordner auf dem flash speicher des Panels angeben?! Stimmt dann könnte man die komplette Datei einfach vom Panel auf den PC übertragen:)

Meinst du das wäre schneller? Bzw. würde das bei der Datenmenge funktionieren?!


Vielleicht hat noch irgendwer eine Hilfe parat, oder weis wirklich einen technischen Grund dafür- obwohl ich eher von einem Programmierfehler von mir ausgehe:confused:

Wäre euch sehr dankbar!!
 
Ich würde an verschieden Stellen im Script einer Internen Varibele in der Steuerung einer Nummer zuweisen. So wie eine Schrittnummer einer Schrittkette. Diese Variable dann als Ausgabe im Touch anzeigen. So siehst du genau an welcher Stelle sich das Script aufhängt oder stehen bleibt.
 
Hallo Netmaster, danke für deine Antwort!

Hatte es vergessen zu erwähnen..
Sowas habe ich auch schon gemacht- In so einer Art wie wenn WinCC Flexible ein Programm überträgt- Habe ein Fenster erstellt und dort 20 Rechtecke eingefügt. Ein Rechteck pro Variablen Block den ich laden möchte. Dann habe ich eine INT Variable erstellt und nach jedem durchgeführten Block erhöht das Programm den Wert und so habe ich den Lade Effekt....

Das Problem ist einfach nur, dass das Skript manchmal nach 4 Balken aufhört (nach ca. 3 Minuten keine Bewegung), dann mal nach 5 Balken, auch mal nach 3 Balken.:confused:

Das is ja grad des:confused:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
An der Größe des Datenbaustein wird es nicht liegen. Habe sowas ähnliches auch schon mal gemacht um den Inhalt von 5 Datenbausteinen komplett in eine txt Datei zu schreiben. Am Anfang am Panel immer eine Störmeldung mit Overflow gekommen. Erst als ich im Script die Daten von der CPU auf ein Internes Array im Touch kopiert habe und diese Daten dann weggeschrieben habe ging es.
 
Hallo,
nachdem du die mir bekannten (Negativ-)Einflußfaktoren ausgeschlossen hast bleibt eigentlich nur noch der Fern-Zugriff übrig.
Das deine Cross-Over-Leitung 10 m lang ist sollte kein Problem darstellen - das wäre höchst unlogisch.
Was mich an der Sache stört ist, dass du nur immer bis zu einem bestimmten Punkt kommst - das sieht für mich so aus, als wenn ein Puffer voll wäre und gewartet wird bis dieser wieder entleert wird. Das wäre ein Indiez für die Übertragung. Mein Ansatz wäre hier tatsächlich die Datei zunächst lokal zu Erzeugen und zu übertragen wenn fertig. Probier das doch bitte mal aus.
Am Bereitstellen der Variablen kann es nicht liegen, da die Variablen immer alle vorhanden sind. Hier kann es dir nur passieren, dass du beim Speichern derselben noch gar nicht der Wert darin hast, den du erwartest darin zu haben - die Variable wurde noch nicht aktualisiert ...

Was du in deinem Script noch machen könntest wäre deine Datenzeile zunächst in eine lokale String-Variable des Scriptes zu schreiben und diese dann mit LinePrint zu schreiben ... also so :
Code:
[FONT=Calibri][SIZE=3]oben im Script :[/SIZE][/FONT]
[FONT=Calibri][SIZE=3]DIM temp_String[/SIZE][/FONT]
[FONT=Calibri][SIZE=3][/SIZE][/FONT] 
[FONT=Calibri][SIZE=3]und dann beim Schreiben :[/SIZE][/FONT]
[FONT=Calibri][SIZE=3][/SIZE][/FONT] 
[FONT=Calibri][SIZE=3]temp_String = "Var_1 :; " &  [COLOR=#ffc000]Schritt_1_ Var_1[/COLOR][/SIZE][/FONT]
[FONT=Calibri][SIZE=3]f.LinePrint temp_String [/SIZE][/FONT]
Gruß
LL
 
Hallo,

Larry richtig, das werde ich noch machen!

Also habe nun einmal die Dateien am PC erhalten. Das hat ganze 9 Minuten gedauert!!!:confused:
Die txt Datei ist dann gerade mal 18 kB groß- Dafür 9 Minuten?!

Habe es nun wie netmaster erklärt hat probiert und einfach erst die Daten vom DB in ein Array am Panel geschrieben. Dann die Datei am PC geöffnet und dort die Variablen reingeschrieben- Habe es nun mal mit smarttags probiert (schneller?!) (Siehe skript unten).

Sowohl das Laden in das !eine! Array (4min) als auch das schreiben in die txt Datei (5min) dauert in etwa gleich lange...

Könnte es vielleicht doch an den vielen UDT's liegen die ich verwende!?

Ich weis einfach nicht warum das so lange dauert:confused::confused:

Hatte auch schon probiert das Laden aus dem DB in das Panel über eine For schleife abzukürzen in dem ich die blauen Zahlen unten durch ein "& i &" ersetze, aber da überträgt es nur den Text und nicht die Variablen, sondern schreibt überall 0 oder false hin...

Habe das auch schon probiert die Datei auf dem flash speicher anzulegen oder auf einem USB stick (\Storage Card USB\) Doch dann bekomme ich die Meldung "path or file not found"- Beim MP277 funktioniert es aber prima....


'----------Objekt erstellen für Dateizugriff------------------------------------------------

Set f = CreateObject("FileCtl.File")
If Err.Number <> 0 Then
ShowSystemAlarm "Error #" & CStr(Err.Number) & " " & Err.Description
Err.Clear
Exit Sub
End If


'----------Aus DB in Panel laden--------------------------------------------
Intern_Meldefenster_Speichern = True
Intern_Status_Speichern = 1

k = 1

Daten(k) = SmartTags("OP.Station.Programm.Schrit[1].Vorw_INT.Var_1")
k = k+1
Daten(k) = SmartTags("OP.Station.Programm.Schritt[1].Vorw_INT.Var_2")
k = k+1
...
...
Daten(k) = SmartTags("OP.Station.Programm.Schritt[1].Vorw_INT.Var_36")
k = k+1
...
...
...
Daten(k) = SmartTags("OP.Station.Programm.Schritt[20].Vorw_INT.Var_1")
k = k+1
...
...
Daten(k) = SmartTags("OP.Station.Programm.Schritt[20].Vorw_INT.Var_36")
k = k+1

'----------Datei erstellen. Öffnen der .txt oder .csv Datei--------------------------------

f.open path , 2
If Err.Number <> 0 Then
ShowSystemAlarm "Error #" & CStr(Err.Number) & " " & Err.Description
Err.Clear
Exit Sub
End If

'----------Daten schreiben in .txt oder .csv Datei----------------------------------------

p = 1

For z=1 To 20

f.LinePrint("///Schritt "& z &" ///") '9

f.LinePrint("Var_1 :; " & Daten(p))'Typ: BOOL
p = p+1

f.LinePrint("Var_2:; " & Daten(p) )'Typ: BOOL
p = p+1
..
..

f.LinePrint("Var_36 :; " & Daten(p))'Typ: BOOL
p = p+1

Next
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Könnte es vielleicht doch an den vielen UDT's liegen die ich verwende!?

Das kann ich mir nicht vorstellen.
Ich muß dir allerdings gestehen, dass ich zwar sehr häufig ähnliche Dinge wie das was du da machst auch durchführe, diese aber immer auf einer PC-Runtime. Zu der Funktionalität auf einem TP kann ich also nicht wirklich etwas sagen. Für einen PC-Runtime wäre deine Aufgabenstellung kein Problem und auch nicht die Art, wie du es realisiert hast.

Wie wäre es, wenn du (nur um in der Problematik weiterzukommen) einfach dein Script dahingehend abänderst, dass du 720 mal die gleiche Variable (oder sogar ggf. eine Konstante) abspeicherst und hierzu dann mal die benötigte Zeit feststellst ...?

Gruß
LL
 
Ich habe nicht alles gelesen, aber nur dies bemerkt:
180 Variablen = OK.
720 Variablen = Nix OK. ("mehr als 1kB")

Also 1 Variabel beträgt 2 Bytes ?
Dann ist 180 Variablen = 360 Bytes.
So weit ich weiss gibt es ein einschränkung das bei S7-300 CPUs kann max 440 Bytes auf einmal übertragen werden. Irgendwie konnte das mit Dein Problem zu tun haben.

Versuch 4 Skripte mit je 180 Variablen einzurichten.
Und in jeder Skript muss ein bestätigung zurück zum SPS transferiert werden dass der Skript erfolgreich beendet wurde.
Dann kann der SPS die 4 Skripte nacheinander anstossen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Larry.

Ja, aber wenn die benötigte Variablen erst im Skript angefordert wird, dann muss auf einmal alle Variablen von CPU nach TP transferiert werden.

Eine andere Gedanke ist dass Skripte auf CE Panele nicht "zu komplex" sein darf. Vielleicht überschreitet das Skript mit 720 Variablen das erlaubte anzahl von Skript-Zeilen.
 
Hallo Jesper,
ein Script fordert nach meinen Erkenntnissen keine Variablen-Inhalte an sondern es benutzt die, die gerade da sind - ungeachtet ob das die sind, die aktuell in der Steuerung sind :)().

Ich könnte mir (wie geschrieben) ganz gut vorstellen, dass das eher etwas mit dem TP zu tun hat ... :(

Gruß
LL
 
ein Script fordert nach meinen Erkenntnissen keine Variablen-Inhalte an sondern es benutzt die, die gerade da sind - ungeachtet ob das die sind, die aktuell in der Steuerung sind :)sad:).
:confused:
Nun verwirrst Du mich etwas. Und das auf ein Freitag Nachmittag !

Skript wird vermutlich über ein Variabel und wertänderungstrigger aufgerufen.
Im Skript gibt es Variablen die vermutlich nur im Skript verwendet sind. Mit Variablen-aktualisierung "nach verwendung" und nicht "zyklisch", werden die Variablen also gefragt in den moment wo das Skript aufgerufen wird.
Oder habe ich etwas falsch verstanden.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
... auf einem Freitag dich verwirren will ich natürlich nicht ...
Aber, so meine Erkenntnisse (ich habe dazu jetzt keine tollen Links oder Quellen parat) :
"Aktualisierung bei Verwendung" heißt, dass die Variable dann von der Visu aktualisiert wird, wenn sie auf der aktuellen Bildseite benutzt wird.
Ein Script fordert Variablen nicht neu an ...
"Aktualisierung zyklisch" bedeutet, dass die Variablen immer in dem eingestellten Intervall aktualisiert werden (sofern die Visu das mit dem Übertragungsweg realisieren kann).
"Aktualisierung ???" - dazu habe ich jetzt nicht den richtigen Text parat - bedeutet, dass die variable nur einmal, beim Aufbau der Bildseite und danach nicht wieder, aktualisiert wird ...

Gruß
LL
 
Ein Script fordert Variablen nicht neu an ...
Doch. Ich habe genau solche Skripte wie oben beschrieben (*). Also Variablen die nur im Skript auftrifft werden in CSV Datei geschrieben. Die Variablen werden in kein Bild verwendet, und werden "nach verwendung" aktualisiert.

*: Nur verwende ich ein PC RT, und die Daten werden lokal auf der Rechner gespeichert.
 
... das wiederum kann ich nicht bestätigen - ich hatte ja sogar schon den Fall, dass Variablen nicht mit dem Inhalt, den sie in der Steuerung (definitiv) hatten, abgespeichert wurden, sondern mit einem "älteren" Wert.
Ich spreche hier auch von einer PC-Runtime ... und ich speichere meine Variablen auch immer zunächst lokal und übertrage dann später mal nach irgendwo hin (z.B. Server).
Bist du dir wegen der Aktualisierung wirklich sicher ? Das interessiert mich jetzt sehr ...

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Habe gerade geöffnet ein WinCC Flex Projekt um zu sehen was ich da gemacht habe.

Hm. Die Variablen sind bei mir ain Array Tag, und es wird mit "Cyclic on use" aktualisiert. Das heisst, es wird zyklisch gelesen wenn es verwendet wird. Eigentlich macht es kein Sinn, es sollte "On demand" sein obwohl ich nicht sicher bin das es ein Unterschied gibt wenn es nur in ein Skript verwendet wird (ich verwirre mich selbst, nicht gut).
Diese Array Tag wird tatsäglich nur in ein Skript verwendet, es wird also erst aktualisiert wenn das Skript aufgerufen wird.
Warum ich "Cyclic on use" und nicht "On demand" gewählt hat ist mir jetzt nicht klar. Es ist aber nicht "cyclic" wobei der Variabel ständig gelesen wurde.
 
... das mit dem Array hatte ich fast erwartet. Es ist gut möglich, dass da andere Bedingungen gelten. Ich muß gestehen, dass es sich bei mir um Einzel-Variablen gehandelt hat.

Gruß
LL
 
Hallo,

War im Urlaub.... Habe aber das Problem Heute am ersten Tag mit dem Speichern gelöst.

Ich habe die Erfassungsszeit der Variablen auf 2s erhöht... Dadurch schnurrt das gewaltig schnell durch und alle Daten werden ruck zuck geschrieben.

Warum man den Erfassungszyklus erhöhen musste, weis ich nicht, aber es funktioniert:ROFLMAO:

Vielen Dank für eure Hilfe!!!
 
Zurück
Oben