Anzeige von Time-Variablen

wiede

Level-1
Beiträge
64
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo

Ich möchte auf einem MP 370, das ich mit WinCCflexible 2007 projektiere, den Stand eines IEC-Timers TON anzeigen. Ist es irgendwie möglich den Wert in Form einer Time-Variablen direkt an das Touchpanel zu übergeben, so dass es nicht die Millisekunden, sondern Minuten und Sekunden anzeigt?
Muss ich diesen in der CPU in Sekunden und Minuten zerlegen und dann übergeben? Das möchte ich eigentlich nicht zwingend machen, da ich das ein paar mal benötige und die Zykluszeit nicht unnötig mit Berechnungen belasten möchte.

Vielen Dank im Voraus

Wiede
 
... ich kenne da nur den von dir beschriebenen Weg. Wenn du es für Anzeige-Funktionen benötigst, dann könntest du deine Varaiblen wahlweise in der SPS umrechnen (und vielleicht sogar zu einem String für die Ausgabe aufbereiten) oder dasselbe per VB-Script in dem MP tun. Letzteres würde dann auch nicht die Zykluszeit deiner CPU belasten (wobei das nach meiner Meinung, wenn es nicht ein paar hundert Zeiten sind eher zu vernachlässigen ist).

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich denke das mit dem String übergeben würde mir am Besten gefallen, leider habe ich so etwas noch nie gemacht, hättest du mir einen Tip, wo man so etwas nachlesen kann.
Es sollte aber so geschrieben sein, dass man es auch versteht, wenn man noch nicht seit 20 Jahren Programmierer ist!

Wiede
 
... welche Variante ?

In der SPS oder VB-Script in deinem MP ?

Wenn SPS, hast du SCL ?
Ansonsten hat VB-Script den Vorteil der besseren Lesbarkeit ...

SPS-Programm:
Dazu gibt es hier im Forum bestimmt viele Ansätze, die mit String-Wandlung zu tun haben. Hierzu einfach mal die Suche bemühen. Für die Erzeugung der String-Teile gibt es die System-FC's I_String (INT in String umwandeln) und Verwandte und die String-Bearbeitungs-Funktionen MID, LEFT, RIGHT , CONCAT usw. Hierzu gibt es in der Step7-Hilfe einiges an Info's (aber auch im Forum). Gerne stehe ich dir aber auch beim Vervollständigen deines Lösungsansatzes zur Verfügung.

VB-Script:
Hier ist es um einiges einfacher. Du baust dir aus deiner SPS-Variablen zunächst Teil-Variablen, die die Minuten und Sekunden (und ggf. Stunden) beinhalten und wandelst diese hinterher in Teilstrings, die du dann sinnvoll zusammensetzt. Beispiel hier :
Code:
Zeit_Sek = rnd(Zeit_in_ms_von SPS / 1000)
Zeit_Std = rnd(Zeit_Sek / 3600)
Zeit_Sek = Zeit_Sek - Zeit_Std * 3600
Zeit_Min = rnd(Zeit_Sek / 60)
Zeit_Sek = Zeit_Sek - Zeit_Min * 60

Anzeige_String = cstr(Zeit_Std) + ":" + right(cstr(100+Zeit_Min),2) + ":" + right(cstr(100+Zeit_Sek),2)
Teile davon lassen sich natürlich auch im SPS-Programm gebrauchen. Anzeige_String ist schließlich deine gewandelte Variable im Format "h:mm:ss".

Gruß
LL
 
Da ich jeweils nur die Minuten und Sekunden anzeige, habe ich einen kleinen FC geschrieben, der die Time-Variable in zwei DInt umwandelt, die ich dann an das MP übergebe.
Das mit dem String werde ich jetzt aber auf jeden Fall auch noch versuchen.

Danke
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Zu deinem VB-Skript. Was wäre dann das Ereignis, was das Skript auslöst?

Was passiert dann, wenn ich eine Taste betätige, während ein Skript ausgeführt wird, bzw. die ganzen Skripts für die einzelen Zeiten nacheinander. Da ja immer nur ein Skript zur selben Zeit ausgeführt werden kann, stellt sich mir die Frage, ob sich dadurch eine kleine Zeitverzögerung entsteht. Nur die Umrechnung wäre sicher zu wenig, aber wenn ich jetzt etwas aufwendigeres machen würde?
 
Wie sieht den FC aus, was hast du genau berechnet? Sieht interessant aus!

Was besonderes ist das nicht gerade, das würde sicher irgendwie eleganter gehen, vor allem hätte ich die Ergebnisse Minuten_DInt und Sekunden_DInt lieber als Integer gehabt, aber da hatte ich auf die Schnelle keine super Idee, die den Programmcode nicht mehr aufbläht als wenn ich diese als DInt übergebe

Wandler Time -> DINT

NW1:

L #Millisekunden_time
L L#60000
/D
T #Minuten_DInt


NW2:

L #Millisekunden_time
L L#60000
MOD
L 1000
/D
T #Sekunden_DInt
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Zu deinem VB-Skript. Was wäre dann das Ereignis, was das Skript auslöst?

Was passiert dann, wenn ich eine Taste betätige, während ein Skript ausgeführt wird, bzw. die ganzen Skripts für die einzelen Zeiten nacheinander. Da ja immer nur ein Skript zur selben Zeit ausgeführt werden kann, stellt sich mir die Frage, ob sich dadurch eine kleine Zeitverzögerung entsteht. Nur die Umrechnung wäre sicher zu wenig, aber wenn ich jetzt etwas aufwendigeres machen würde?


Hallo Wiede,
du könntest das VB-Script an die Ursprungs-Variable auf "bei Wert-Änderung" setzen. Hier mußt du natürlich berücksichtigen, dass die Visu nur max. 20 (?) Scripts auf einmal ausführt. Weitere aufgerufene Scripts werden dann nicht bearbeitet und du bekommst eine System-Meldung. Die Bearbeitungszeit des Scripts ist wiederum vernachlässigbar. Wenn du viele Werte gleichzeitig brauchst, so könntest du diese alle in ein Script packen und vielleicht dieses über eine zusätzliche "Trigger-Variable" ausführen lassen (ähnlich wie bei Kurven).

Was machst du denn Aufwendigeres in der Visu ?

Eine Taste ist nur ein anderes Ereignis - hat also keine weitere Auswirkung ...

Gruß
LL
 
Wenn ich 20 Skripts zur selben Zeit ausführen kann, dann ist das wieder etwas anderes, ich war der Meinung irgendwo gelesen zu haben, dass immer nur ein Skript ausgeführt werden kann, die anderen werden dann halt hinten angereiht und nacheinander abgearbeitet.
 
Absolut gleichzeitig läuft das auch sicher nicht. Die Sache mit dem Task-Planer kann schon sein (ist ja Windows). Du must hier aber berücksichtigen, dass die Ausführungszeit eines solchen Scriptes weit unter ms liegen wird. Nach meinen bisherigen Erfahrungen wird ein großes MP oder eine Runtime (Wcc-F oder Protool) so etwas 50 - 100mal schneller wie die SPS (CPU 317) abarbeiten.

Aber probier es doch einfach aus, dann siehst du doch, wo du bleibst. Du mußt allerdings auch die Variablen-Aktualisierungszeit der Visu mit berücksichtigen. Die beträgt im Normalfall nicht unter 1s (kann auch viel größer sein - je nachdem, was du so eingestellt hast).

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe jetzt mal versucht, das VBSkript so einzugeben, wie du es geschrieben hast, nur mit meinen eigenen Variablen. Die 3 Hilfsvariablen Zeit_Std, Zeit_min und Zeit_sek habe ich mit DIM angemeldet, die Variable für die Anzeige habe ich als Interne Variable mit dem Datenformat String und einer Länge von 12 deklariert. Die Variable, die den Wert liefert ist eine DInt-Variable, wird jede Sekunde aktualisiert und startet bei Wertänderung das Skript.
Jetzt habe ich das Problem, dass ich das Ergebnis nicht bekomme, wenn ich das Ding in der Simulation teste. Woran kann das liegen und wie kann man das am einfachsten nachvollziehen?

Wiede
 
... ich nehme an, dass deine Ursprungs-Variable nirgends angezeigt wird. Somit wird sie durch die Visu auch nicht neu geladen. Das kannst du umgehen, wenn du die Variable (Eigenschaften) auf "Ständig lesen" setzt (so heißt das unter ProTool - bei WccF wird es warscheinlich etwas anders heißen, ich kann es aber im Augenblick nicht nachschauen). Nun wird die DINT-Variable mit der Abtastrate, die du unter "Steuerung" hinterlegt hast, aktualisiert.

Gruß
LL
 
Jetzt hat es geklappt. Als ich bei der Variable die Wertänderung als Ereignis eingegeben habe, hatte ich wohl etwas geschlampt, es war mal nicht mehr drin, als ich heute morgen noch einmal alles kontrolliert habe.

Ansonsten war ich so frei und habe einfach dein Skript geklaut und etwas abgeändert. Was du aber mit dem RND machen wolltest, das ist mir noch immer nicht klar, das erzeugt eine Zufallszahl laut der Hilfe.

Ich habe einfach deine / gegen \ ausgetauscht, dann ist das Ergebnis der Division keine Gleitkommazahl mehr und ich kann den Rest der Division weiter verarbeiten.


Dim Zeit_Sek, Zeit_Std, Zeit_Min
Zeit_Sek = SmartTags("Zeiten\Datenaustausch S7 -Visu.S7_TP_akt_Trockenzeit_12") / 1000
Zeit_Std = Zeit_Sek \ 3600
Zeit_Sek = Zeit_Sek - Zeit_Std * 3600
Zeit_Min = Zeit_Sek \ 60
Zeit_Sek = Zeit_Sek - Zeit_Min * 60
SmartTags("Visu intern\Verbleibende_Zeit_H12") = CStr(Zeit_Std) & "h " & CStr(Zeit_Min) & "m " & CStr(Zeit_Sek) & "s"

Vielen Dank für deine Mühe

Wiede
 
Zuviel Werbung?
-> Hier kostenlos registrieren
... wohl zuviel durcheinandergeworfen ...:rolleyes:

RND ist der Befehl unter Step7 um einen INT zu erzeugen. Du hast da also recht mit der INT-Division "\" oder du dividierst nach meinem Vorschlag und nimmst statt RND -> CInt. Dann sollte es auch funktionieren.

Ansonsten freue ich mich, wenn ich dir helfen konnte und du mit meinem Beispiel etwas anfangen konntest ...

Gruß
LL
 
Mit der Funktion CInt klappt es nicht. die Nachkommastellen müssen "unter den Tisch fallen" und nicht gerundet werden. Konnte den Lösungsansatz den "Wiede" und Du erarbeitet haben prima für mein Problem nutzen.
 
Hallo Wiede,

am Panel kannst du den Datentyp TOD bzw. Uhrzeit verwenden, zumindest unter Flexible 2008. Damit bist du auf 23:59:59 beschränkt. Aber du willst ja ohnehin nur Minuten und Sekunden anzeigen. Den Datentyp TIME haben die Flexiblen einfach mal so unter den Tisch fallen lassen, warum auch immer. Der Weg über Scripte oder eine Zerlegung im Programm wäre mir viel zu aufwändig.


Gruß, Onkel
 
Zurück
Oben