Mitsubishi: Timer-Problem

franzz

Level-2
Beiträge
23
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo!

Auf einer Mitsubishi/Melsec Q-CPU (GX IEX Developer) soll folgender code laufen:

Code:
T_3 := DINT_TO_TIME(REAL_TO_DINT(MIN_PUMPING_TIME * 60.0) * 1000);
t_pumping_time(in := PUMPING, pt := T_3);
T_3_ET := t_pumping_time.ET;

MIN_PUMPING_TIME ist REAL und hat den Wert 60.0
T_3 ist TIME und hat den Wert T#1h
t_pumping_time ist ein lokaler TON-Timer

Das Problem ist:
Etwa 5 Minuten bevor der Timer abläuft wird T_3_ET negativ. Die Zeit läuft korrekt ab, nur der Angezeigte Wert für T_3_ET wird etwa T#-49h...

Da ich die Restzeit aber für die Visualisierung brauche passt mir das gar nicht. Meinem Verständnis nach sollte die Null werden, wenn der Timer abgelaufen ist, und dann stehenbleiben.

Was mache ich falsch?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
ohne die Software genauer zu kennen:
eine Subtraktion (PT Minus ET) sollte das richtige Ergebnis der Restzeit liefern?

Genauer gesagt geht es so weiter:

Code:
T_3 := DINT_TO_TIME(REAL_TO_DINT(MIN_PUMPING_TIME * 60.0) * 1000);
t_pumping_time(in := PUMPING, pt := T_3);
T_3_ET := t_pumping_time.ET;

 T := DINT_TO_REAL(TIME_TO_DINT(T_3_ET)) / 1000.0;
WAITING_TIME := MIN_PUMPING_TIME *60.0 - T;

Ich wandele also ET zurück in REAL-Sekunden und mache die Subtraktion danach. Das könnte man natürlich auch andersrum machen - auf die Idee bin ich noch nicht gekommen. Probiere ich morgen aus.

Aber ich sehe einfach nicht, warum es so nicht geht.
 
Aber ich sehe einfach nicht, warum es so nicht geht.

Weil bei jeder Zahl in einer SPS irgendwann ein Überlauf kommt, rechnet man dann die Differenz (und hat hierbei auch wieder einen Überlauf weil man mit den gleichen Anzahl Bits rechnet), dann stimmt's wieder.
 
Zurück
Oben