Skript takten

KB78

Level-1
Beiträge
24
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute,

vielleicht kann mir wer helfen. Ich haben ein skript in WinCC flexible, welches Werte archiviert.
Jetzt würde ich gerne das skript einschalten und dann soll es z.B. 200 Werte speichern. Das Problem ist diese Werte sollen nur jede Sekunde archiviert werden.
Habe jetzt mit einigen Schleifen schon rum experimentiert und mir auch den Taktmerker aus der CPU geholt, aber irgendwie will das Programm noch nicht so ganz wie ich will.

Vielleicht hat das schon mal wer gemacht oder evnt. eine Idee dazu?:)

Vielen Dank schon mal..
 
ich hab bei mir bei verbindungen den bereichszeiger "koordination" aktiviert.
dieser hat ein taktbit (.2) das hab ich mir wiederum als variable "takt" angelegt.
zudem hab ich eine zweite bit-variable "fl_hm" (intern) angelegt, die ich als flankenhilfsmerker verwende.

im script steht folgendes:

if takt=1 and fl_hm = 0 then
... (hier dein code, der bei jeder pos. flanke von takt einmalig ausgeführt wird)
end if
fl_hm = takt

diese script habe ich an die variable "takt" unter ereignisse - wertänderung
eingetragen

damit wird bei jedem takt das script einmal kurz aufgerufen. du kannst auch jedes andere taktbit in der sps verwenden um andere zeiten zu erreichen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
... Habe jetzt mit einigen Schleifen schon rum experimentiert und mir auch den Taktmerker aus der CPU geholt, aber irgendwie will das Programm noch nicht so ganz wie ich will ...

Hallo,
mit dieser Aussage kann ich gar nichts anfangen ...
Was möchtest du denn das passiert und was passiert wirklich ?
Wie wäre es, wenn du das Script mal posten könntest ?

Und ... wenn du einen 1-Sekunden-Taktmerker als Trigger nehmen willst, dann sollte dieser mindestens mit 0.5 Sekunden-Raster aktualisiert werden.

Gruß
Larry
 
jede sek 200 variablen schreiben ist auch nicht wirklich empfehlenswert.
weiterhin sollte man beachten, das das script die vars nicht wirklich aus der steuerung liesst. d.h. das du nicht unbedingt die aktuellen werte hast.
das kannst du nur über eine rezeptur kösen und den status der rezeptur auswerten
 
@Volker:
damit (Rezeptur) lösst du dann a´ber auch nicht das Problem mit der Daten-Konsistenz - da könnte ich ein Buch drüber schreiben ... :rolleyes:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Inkonsitenz...

Also Ich habe mir dafür ja extra meinen protokoller geschrieben...

Habe das früher auch über flexible gemacht, aber da gabs auch immer mal wieder Probleme. Auch ist es immer total lahmarschig gewesen.
 
@Volker:
damit (Rezeptur) lösst du dann a´ber auch nicht das Problem mit der Daten-Konsistenz - da könnte ich ein Buch drüber schreiben ... :rolleyes:
sicher???
mach ich hier doch mit teils 1000 vars und mir ist bisher noch nie ein fehler aufgefallen
so mach ich das
PHP:
Call PtFct.Datensatz_SPS_nach_Variablen(1, Rueckgabe_Rezept_1)
While Rueckgabe_Rezept_1 =2 'wenn Rueckgabewert =2 ist die Funktion noch nicht beendet
Wend
If Rueckgabe_Rezept_1 = 4 Then
'Call PtFct.Systemmeldetext_anzeigen("Rezeptur geladen")
End If
 
jede sek 200 variablen schreiben ist auch nicht wirklich empfehlenswert.
weiterhin sollte man beachten, das das script die vars nicht wirklich aus der steuerung liesst. d.h. das du nicht unbedingt die aktuellen werte hast.
das kannst du nur über eine rezeptur kösen und den status der rezeptur auswerten


Ne so war das nicht gemeint. Nur das wir uns nicht falsch verstehen. Ich will jede Sekunde (oder 0,5s das kann ich mir ja definieren wie ich will, archivieren)

Was tnt369 geschrieben hat passt auch soweit. Mein code sieht so aus:
________________________________________________________________
If Taktmerker = 1 & Hilfsvariable = 0 Then

fs.WriteLine(CStr(Nummer) & ";" & CStr(Now) & ";" & Second(Now) & ";" & CStr(Wert_1) & ";" & CStr(Wert_2))
End If

Hilfsvariable = Taktmerker
_________________________________________________________________

Es werden jetzt Wert_1 und Wert_2 in jeder Sekunde in das Archiv geschrieben ...was schon mal super ist :)

Jetzt habe ich nochmal versucht, das ganze zu starten. Und einfach ein Startbit in die if Anweisung geschrieben. Nur das funktioniert leider noch nicht so richtig. dh. er schreibt mir gar keine Werte ins Archiv :confused:

der code sieht dann einfach nur so aus
_________________________________________________________________
If Taktmerker = 1 & Hilfsvariable = 0 & Start Then (oder Start = 1)

fs.WriteLine(CStr(Nummer) & ";" & CStr(Now) & ";" & Second(Now) & ";" & CStr(Wert_1) & ";" & CStr(Wert_2))
End If

Hilfsvariable = Taktmerker
_________________________________________________________________

Taktmerker: ist bei mir eine Variable in WinCC welche direkt mit dem Taktmerker der CPU verbunden ist

Start: ist einfach ein Bit welches (zum testen) in WinCC gesetzt oder rückgesetzt wird.

Vielen dank für das feedback ..und schönes we :D
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Jetzt gehts :)

Das "Start" Signal muss ich in eine extra Schleife packen, also

if Start Then

if ...
(Anweisung)
End if

End if

Da haben sich wahrscheinlich nur die Datentypen nicht miteinander vertragen.

Vielen Dank cu
 
Hallo,
wenn du es so machst wie folgt dann funktioniert es auch in dewr ursprünglichen Version :
Code:
[I]If Taktmerker = 1 [B][SIZE=3]AND[/SIZE][/B] Hilfsvariable = 0 [COLOR=red][B][SIZE=3][COLOR=black]AND[/COLOR][/SIZE][/B][/COLOR][COLOR=black] Start[/COLOR] Then[/I]
 
[I]fs.WriteLine(CStr(Nummer) & ";" & CStr(Now) & ";" & Second(Now) & ";" & CStr(Wert_1) & ";" & CStr(Wert_2)) [/I]
[I]End If [/I]
 
[I]Hilfsvariable = Taktmerker[/I]
Gruß
Larry
 
sicher???
mach ich hier doch mit teils 1000 vars und mir ist bisher noch nie ein fehler aufgefallen

Naja ... bei mir sind es keine Rezepte sondern i.d.R. Array's. Aber da kommt es dann doch so ab und an vor, das Inhalte in der Visu doch noch nicht aktualisiert sind. Und das obwohl ich den Datenaustausch über Ethernet abwickele. Die Chancen für konsistente Daten steigen aber mit abnehmender Anzahl der Daten und mit Verringern des Ausführungs-Intervalls.

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
bei mir ist das auch ein array. z.b. protokolliere ich in einen db den druckverlauf eines pressvorgangs.
und ich habe bisher noch keine ausreisser gehabt. das würde man in der in excel dargestellte kurve ja sehen
 
... ich sagte ja - da könnte man ein Buch drüber schreiben ...
Bei einer Kurve ist es dann noch wieder etwas anderes. Eine Kurve wird immer komplett (konsistent) geladen. Da kann es dir dann nur passieren, dass du die Kurve der Vorgänger-Messung abspeicherst - das hatte ich auch schon : 2 Kurven im Abstand von ca. 2 Sek. aufgezeichnet mit haargenau den gleichen Werten drin (jeweils ca. 100) und das ist statisch doch sehr unwahrscheinlich (Federkraft-Messung).

Bei Array's hatte ich dann schon mal die Variante gewählt, die Jesper mir vorgeschlagen hatte : Zählvariable als ersten und als letzten Wert - sind beide gleich, dann sind die Daten konsistent. Das war vom Effekt her auch nicht schlecht. Die Zählvariablen wurden natürlich im Zyklus (fast) gleichzeitig geschrieben.

Gruß
Larry
 
Wenn man wie Volker in #7 die WCCflex-Systemfunktionen
* LeseDatensatzvariablenAusSteuerung (im Script: GetDataRecordTagsFromPLC)
* SchreibeDatensatzvariablenInSteuerung (im Script: SetDataRecordTagsToPLC)
benutzt, dann ist die Übertragung der betroffenen Variablen konsistent.

Man bekommt sogar über den Bearbeitungsstatus eine Endemeldung (erfolgreich
oder nicht erfolgreich), wenn alle Variablen übertragen wurden.
Man muß allerdings alle Variablen in eine Rezeptur projektieren. Das kann man
aber vereinfachen, indem man ein Array liest/schreibt.

Gruß
Harald
 
Zurück
Oben