STEP5 - Laden einer Zeit in einen anderen Timer

asisnet

Level-1
Beiträge
11
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Wie kann man ein aktuellen Wert eines Timers in einen anderen Timer laden?

Ich habe es mit

U M15.0
LC T 1
SA T 2

und mit

L T 1

versucht, allerdings ohne Erfolg. Der T2 wird nie gestartet! Welche Möglichkeiten gibt es hier? :roll:
 
hallo,
dies ist mein erster beitrag ,ich finde euer forum toll

wenn du über LC gehst wird die zeit BCD codiert im ACCU hinterlegt
um dies zu umgehen mußt du die zeit mit LC in einen DB laden und das DW mit KT formatieren anschließend kannst du dieses DW für den nächsten timer verwenden.

aber warum willst du 2T gleichzeitig mit gleicher Zeit alufen haben?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich will den "Rest" vom T1 als Startwert von T2 verwenden. Konkret habe ich folgendes Problem:

In DB5 liegt meine aktuelle Zeit. In jedem Zyklus werden 48 Eingänge abgefragt und bei einer pos. Flanke wird ein "Zähler" in einem DB hochgezählt und die aktuelle Uhrzeit/Datum auch hinterlegt. Jeder Eingang hat also seinen "Platz" mit Zähler und Datum/Zeit im DB. Nun musste ich das Programm so erweitern, dass auch MSec gezählt werden. Hierfür verwende ich die Timer (10 MSec). In der Theorie hört sich das gut an, allerdings steckt der Teufel im Detail:

Die Zeiten werden jeweils nur alle 1s nach Ablauf eines SPS-Zyklusses im DB5 aktualisiert. Der Timer (10 MSec) läuft asynchron weiter. Im Programm ist es nun so, dass an einer Stelle im OB1 (Zyklusgesteuert) eine FB aufgerufen wird, der schaut ob sich die Sekunden geändert haben. In diesem Fall wird der T1 neu mit 99.0 gestartet (läuft ja rückwärts). So kommt es nun zu folgendem Problem:

Takt des Eingangs: 1,4 Sekunden

1. Takt Uhrzeit (DB5): 01:10:00 MSec 400 (T1 = 060.0)
2. Takt Uhrzeit (DB5): 01:10:01 MSec 800 (T1 = 020.0)
3. Takt Uhrzeit (DB5): 01:10:01 MSec 990 (T1 = 000.0)
---> Innerhalb des Zyklusses ist T1 abgelaufen, aber die Zeit wurde noch nicht überprüft (Sekundenwechsel und T1 Neustart)
4. Takt Uhrzeit (DB5): 01:10:03 MSec 600 (T1 = 040.0)

Meine Sekunden (Zeit aus DB) pendeln also immer +/- 1 um den korrekten Wert, oder treffen ihn auch mal. Wenn man dann die "Zykluszeiten" der positiven Flanken betrachtet (Abstand zwischen zwei Flanken) kommt folgendes raus:

1,4 Sek - 2,4 Sek - 0,4 Sek - 1,4 Sek - 1,4 Sek - 2,4 Sek .....

Im Schnitt stimmt es übrigens :lol:

Meine Idee war nun, dass ich im OB13 (Aufrufintervall 10 ms) den T1 auf Ablauf prüfe und bei Ablauf einen T2 starte (Bei 099.0). Wenn dann im normalen OB1 der FB zur Kontrolle des "Sekundenwechsels" aufgerufen wird und dieser zutrifft, wird der T1 mit dem "Restwert" von T2 gestartet (so synchronisiere ich wieder). Bei einer pos. Flanke an einem Eingang wird nun nicht nur die Uhrzeit aus DB5 und die MSec aus T1 (99 - T1) herangezogen, sondern auch T2 (falls aktiv - nämlich wenn T1 auf 000.0 steht). Beim Speichern der Zeit wird im Feld der MSec dann T1 (bei 000.0 = 1000 MSec) + T2 ((99 - T2) * 10)( berechnet. Das bringt dann zwar MSec ZEiten größer 1000, was aber im PC beim Auslesen des DBs wieder korrigiert werden kann.

Daher versuche ich nun T1 mit dem Restwert von T2 zu starten (SA T2).


Vielleicht hast Du auch eine gänzlich andere Idee zu meinem Problem?


Gruß,
Stefan


heg schrieb:
wenn du über LC gehst wird die zeit BCD codiert im ACCU hinterlegt
um dies zu umgehen mußt du die zeit mit LC in einen DB laden und das DW mit KT formatieren anschließend kannst du dieses DW für den nächsten timer verwenden.

aber warum willst du 2T gleichzeitig mit gleicher Zeit alufen haben?
 
hallo,
vielleicht kannst du noch was mit der bearbeitungsoperation B angfangen zb bei Flankenwechsel die DW auf 0 stellen,mehr darüber findest du in den s5 Handbüchern der cpu die man alle bei siemens heunterladen kann

heinz
 
etwas anderer Ansatz....

Hallo Stefan,

Du hast doch den OB13 mit 10mS getriggert.
Zähl doch einfach bei jedem OB13-Aufruf in einem MW oder DW immer 10 dazu. Das sind dann Deine mSec.
Wenn Du dann in Deinem normalen FB einen Sekundenwechsel feststellst, schreibst Du das Wort einfach wieder auf 0.
Das kannst Du noch besser auch gleich vom OB13 erledigen lassen, dann bist Du nicht vom Zyklus abhängig, das ganze wird dann noch genauer.
Hab so was schon in der Art realisiert.
Das ganze Timer-geraffel ist dadurch weg.

Gruß Jörg
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Re: etwas anderer Ansatz....

Hallo Jörg,

stimmt, da die Sache mit dem OB13 erst nachträglich als Umgehung eines anderen Problems dazu kam, habe ich das noch gar nicht realisiert. Ich werde es morgen dann gleich testen. Danke!

Gruß,
Stefan

jogi schrieb:
Hallo Stefan,

Du hast doch den OB13 mit 10mS getriggert.
Zähl doch einfach bei jedem OB13-Aufruf in einem MW oder DW immer 10 dazu. Das sind dann Deine mSec.
Wenn Du dann in Deinem normalen FB einen Sekundenwechsel feststellst, schreibst Du das Wort einfach wieder auf 0.
Das kannst Du noch besser auch gleich vom OB13 erledigen lassen, dann bist Du nicht vom Zyklus abhängig, das ganze wird dann noch genauer.
Hab so was schon in der Art realisiert.
Das ganze Timer-geraffel ist dadurch weg.

Gruß Jörg
 
Zurück
Oben