Sekundentakt - Schönheit der Arbeit

forellengarten

Level-1
Beiträge
217
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Wie ist der Lösungsansatz:

Wunsch: Erzeugung eines Impulses im Sekundentakt. Bisher geschehen mit einem TON-Baustein (pt:=t#1s, in:=NOT Ton.q).
Problem: Der Task wird alle 30ms aufgerufen. Dadurch laufen die TON-Sekunden etwas zu langsam, so dass am Ende des Tages zahlreiche Sekundenimpulse fehlen.

Entscheidend ist nicht ob der Sekundenimpuls zum exakten Zeitpunkt da ist, sondern daß die Anzahl der Impulse auch nach langen Laufzeiten mit der tatsächlich verstrichenen Sekundenzahl übereinstimmt. Muss daher vermutlich eine Lösung über die Systemzeit sein. Kann mir jemand den Lösungsansatz geben, bzw. kann ich irgendwie einfach die System-Sekunden auslesen?

Danke euch!
 
Hi

Also ich würde als erstes die Systemzeit auslesen mit dem Baustein "RTC GET TIME".
Danach kannst du die DT Variable z.B. mit Hilfe von "DT_TO_TIME" in sekunden umformen.

Ich hab jetzt leider nicht die möglichkeit es auszuprobieren aber ich glaube mich zu erinnern, dass das Format TIME dir die
restlichen Sekunden des aktuellen Tages runterzählt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Es gibt verschiedene Ansätze:
1. Synchronisierung mit dem Betriebssystem (Windows soll dann via NTP die exakte Zeit haben)
http://infosys.beckhoff.com/index.p.../html/tcplclibutilities_overview.htm&id=14025

2. Du baust dir etwas mit einer RTC:
http://oscat.de/downloadmanager/finish/3-oscatbasic/49-oscatbasicdoc332de.pdf#page=137

3. Realisiere selber einen Timer, in dem du selber die Zyklen zählst und dann im richtigen Zyklus auslöst.

Du siehst, mir kommen auf die schnelle 3 Möglichkeiten in den Sinn. Bitte halte uns mit deinen Erkenntnissen up-to-date :)

P.S. Vielleicht hilft auch schon eine Anpassung der Systemzeit auf eine teilbare Zahl mit 1000ms...
 
Hallo Forellengarten,

für den Sekunden-Impuls hätte ich auch erstmal deinen Ansatz, den normalen Blinkimpuls gewählt. Das der etwas verschluckt ist mir auch aufgefallen.

Mit dem RTC_GET_Time Aufruf, wie oben erwähnt, solltest du dein Problem leicht lösen können. Die Sekunden sind direkt in dem Baustein vorhanden. Dein Programm reagiert einfach auf die Änderung der Sekunden Variable mit einer Flanke. Solange deine Zykluszeit nicht größer einer halben Sekunde wird (wegen Auswertung), bist du da sicher.

Gruß, Voxe
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Tiptop, schön konnten wir dir helfen!

Je nach dem wie genau dein Timer/Blinker sein muss, reicht auch die RTC von der SPS nicht aus!
Das Infosys sagt selbst, dass der interne Timer nicht genauer als die "Windows" Systemzeit ist. Wenn du ganz genaue Zeiten willst, kommst du nicht darum herum, das System mit einer Referenzzeit zu synchronisieren.

Bedingt durch die Systemeigenschaften weicht die RTC-Zeit von einer Referenzzeit ab. Die Abweichung hängt von der Zykluszeit der SPS, dem Wert des System-Basis-Ticks und der verwendeten Hardware. Um größere Abweichungen zu vermeiden muss die RTC-Instanz zyklisch ( z.B. mit einer Funkuhr oder mit der lokalen Windows-Systemzeit ) synchronisiert werden. Die lokale Windows-Systemzeit können Sie wiederum mit der Hilfe des SNTP-Protokolls mit einer Referenzzeit synchronisieren.
 
Zurück
Oben