Step5: Speichern der Uhrzeit im DB2 mit mSek

asisnet

Level-1
Beiträge
11
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich stehe vor dem Problem, dass ich eine vorhandene S5 Anwendung erweitern muss. In der Anwendung wird beim positiven Flankenwechsel auf einem Eingang das aktuelle Datum und aktuelle Uhrzeit im DB abgelegt. Also im Format TT.MM.JJ SS.MM.ss.

Nun erfordert es die Anwendung, dass zukünftig auch Bruchteile von Sekunden abgelegt werden (mindestens mal 1/10) Sekunden. Wie kann ich das am einfachsten realisieren?

Danke im Voraus!
Stefan Schaffner
 
sowas hab ich noch nie gesehen, kannst du den prgrammteil hier einfügen? wäre bestimmt für viele interessant und es könnte dir eventuell eher jemand helfen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das Programm ist recht komplex und geht über 30 Bausteine (OB's und FB's). Das Prinzip ist ganz einfach: Nach und nach wird jeder Eingang geprüft und bei einem Wechsel (E xx.x <> zugehörigem Merkerbyte) wird ein FB mit den Parametern (Welcher Eingang, usw.) aufgerufen.

Im FB wird aus DB5 Datum und Zeit gelesen und an eine dem jeweiligen Eingang zugeordnete Stelle im DB2 geschrieben (dann kommt noch ein bisschen kopieren von DB2 nach DB3, damit man später Zeit- und Zählerdifferenzen bestimmen kann).

Entscheidend ist hier jedoch, dass ich aus dem DB5 nur Stunden, Minuten und Sekunden (und natürlich Datum, Wochentag usw.) lesen und in den DB2 übertragen kann. Dann die Impulse an den Eingängen aber auch in Zyklen kleiner 1 Sekunde kommen, müsste ich mir nun in meinem DB2 auch Zeiten merken können, die einen Bruchteil einer Sekunde ausmachen.

Ich habe schon getüftelt, ob ich in einen Zähler bei jedem Zyklus (Programmzyklus) vorwärts erhöhe und auf den Wechsel der Sekunden in DB5 checke. Beim Wechsel der Sekunde merke ich mir dann den alten Zählerstand, schreibe in in DB2 (Der wird ja dann vom PC geholt) und setze ihn dann auf 0. Beim Merken der Uhrzeit im DB für den jeweiligen Eingang, würde ich mir den aktuellen Zählerstand mitmerken. Im PC könnte ich dann nach dem Prinzip:

x = (Zähler zum Zeitpunkt Sekundenwechsel = 1 Sekunde)
Genaue Zeit = Datum + Stunde + Minute + Sekunden + (1/x)*Zähler

die Zeit genauer bestimmen. Hier laufe ich aber Gefahr, dass sich der Wert x abhängig von der Programmdurchlaufzeit ändert und ich evtl. mit einem ungenauen x Arbeite (wenn länge Zeit an diesem Eingang nichts angekommen ist).

Ab ehrlich gesagt, scheitere ich schon daran, den Zähler hochlaufen zu lassen, und mit beim Sekudnenwechsel die Zahl zu merken und zurückzusetzen!

Vielleicht hast Du eine bessere (einfachere ...?) Idee.

Gruß,
Stefan
 
hmm also vileicht habs ichs ja noch nicht ganz begriffen, aber wieso nimmst du nicht einen ganz normalen timer (einschaltverz) startest diesen mit seinem eigenen negierten ausgang für 1sec, so das du einen taktgeber erhälst.
vermutlich brauchst du noch eine weitere bedingung um ihn zu synchronisieren.

den aktualwert des timers schreibst du in ein dw und den inhalt von diesem dw kopierst du immer wenn dein signal kommt was weiß ich wohin...
 
Hi Leute,
um das Ganze zu verstehen hab ich noch einige Fragen:
1. welche CPU ist überhaupt verwendet, d.h. was kann die?
2. wie kommt die Zeit in den DB5 ? über 'nen CP, CPU-Uhr ?
3. welche 'normale' Zykluszeit hast Du denn in der Kiste, d.h. welche max. Abfragerate Deiner Eingänge hast Du denn ?

mit normalen S5-Zeiten wär ich vorsichtig ? die sind schrecklich ungenau.
Sehr genau sind hingegen die Zeit-OB's, z.B. OB13.

Ich würde einfach im OB13 (100ms) ein DW immer um 100 hochzählen. Wenn Sich die Sekunden im DB5 ändern, diesen Zähler wieder auf 0 setzen.
Kannst Du den OB13 auf 10mS umparametrieren (CPU-abhängig), wird die Genauigkeit bedeutend höher.


Gruß Jörg
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich glaube, dass ich mein Problem nun lösen konnte:

Im OB1 rufe ich den FB2 auf, der meinen Timer aktualisiert:

FB002
-------

U M 15.0
L KT 100.0
SA T 1
R M 15.0

UN T 1
S M 15.0
BE

Somit habe ich im Merker 15 immer die 1/100 Sekunden stehen (Beginnend mit 100ms, 99ms .... 1ms - da ich den SA benutze)

In meiner Eingangroutine kopiere ich nun (aus Platzgründen) den MSec Wert in das für die Jahreszahl vorgesehene Feld in den DB2.

Erste Tests haben gezeigt: Es funktioniert!

Gruß,
Stefan Schaffner
 
Zurück
Oben