OnTime funktioniert nicht sehr lange (... glaub ich zumindest mal)

Begonnen von mg, 25. Juli 2007, 13:33:30

Vorheriges Thema - Nächstes Thema

0 Mitglieder und 3 Gäste betrachten dieses Thema.

mg

WAGO 750-841:
Ich glaube mal der Befehl OnTime geht nicht korrekt. Wenn die Stundenzahl größer wird (zB >256 ... das hängt aber von der Programmgröße ab, da bei großen Durchrechnungszeiten das Ganze besser funktioniert), erfolgt keine Addition auf die Variable ontime.. Meiner Meinung ist das wegen der Ungenauigkeit der Addition bei größeren Werten.

Evtl ist das Ganze mit einem Task besser zu lösen. Aber da ich erst seit 1 Woche mit dem Ding rumspiele - kennne ich mich eigentlich GARNICHT aus.

mg

 :o... habe das in den falschen Ordner getan ... Bitte korrigieren. Danke

hugo

kannst du uns mehr infos zu deinem projekt sagen.
einen auszug der den fehler reproduziert wäre super

mg

Das ist 100% Deine Software. Die Ein- und Ausgänge wurden mit der Visu belegt. NUR - der Reset wurde auf OnTime:=255.9 geändert
Dh.: Nach einem Reset sollte das Ding bei 255.9 anfangen zu zählen. Bleibt aber auf dem Wert stehen. Nach weiteren Analysen hab ich gesehen, daß das mit dem Summierer irgendwie zusammenhängt.

Super!  :) Danke für Deine schnelle Antwort

Mario


M_runtime measures the ontime of a signal in hours.
the output is of type real because the time type will overflow within 49 days.
the units are hours.

*)
(* @END_DECLARATION := '0' *)
(* at first we need to determine if the sps was powered off *)

tx := TIME();
IF NOT power THEN
   power := TRUE;
   cycles := cycles +1;
ELSIF rst THEN
   ontime := 255.9;        (*----------------------------------- zum Testen verändert ------------------------------------------------*)
   cycles := 0;
   last_on := 0;
ELSIF in THEN
   ontime := ontime + DWORD_TO_REAL( TIME_TO_DWORD(tx - last))/3600000.0;  (*----------- da taucht das Problem auf -------------*)
   last_on := last_on + DWORD_TO_REAL(TIME_TO_DWORD(tx - last))/3600000.0;
   IF in AND NOT edge THEN
      cycles := cycles +1;
      last_on := 0;
   END_IF;
END_IF;
last := tx;
edge := in;

(* revision history
hm 22.2.2007      rev 1.1
   changed VAR RETAIN PERSISTENT to VAR RETAIN for better compatibility
   wago lon contollers do not support persisitent

*)


mg

Wenn man den Programmbereich ....

>   ontime := ontime + DWORD_TO_REAL( TIME_TO_DWORD(tx - last))/3600000.0;
>   last_on := last_on + DWORD_TO_REAL(TIME_TO_DWORD(tx - last))/3600000.0;
>   IF in AND NOT edge THEN
>      cycles := cycles +1;
>      last_on := 0;
>   END_IF;
>END_IF;
>last := tx;

mit dem Programmbereich ....

>   IF ontime <> ontime + DWORD_TO_REAL( TIME_TO_DWORD(tx - last))/3600000.0 THEN
>      ontime := ontime + DWORD_TO_REAL( TIME_TO_DWORD(tx - last))/3600000.0;
>      laston := laston + DWORD_TO_REAL(TIME_TO_DWORD(tx - last))/3600000.0;
>      last := tx;
>   END_IF;
>   IF in AND NOT edge THEN
>      cycles := cycles +1;
>      last_on := 0;
>   END_IF;
>END_IF;

... ersetzt funktionierts einwandfrei.

Das mit der Ungenauigkeit des REAL war wirklich das Problem.
Evtl. könnte man das mit dem LREAL auch lösen (ist bei sehr kurzen Einschaltungen auch besser aber in der HLK uninteressant und braucht mehr Speicher) aber es löst das Problem nicht.
Irgendwann hat man das Problem (da existiert unsere Welt dann aber nicht mehr)

Mario
(aber bitte nochmals vorher testen)

hugo

ja das problem habe ich erkannt. bei größer werdenden werten von ontime wird die auflösung kleiner und kurze zeitabstände werden nicht mehr addiert.
wir werden die nächsten tage ein korrigiertes modul nachliefern

hugo

lreal ist keine lösung weil dieser typ nicht auf allen plattformen zur verfügung steht.
wir werden das problem über einen anderen weg lösen.