TIA Ob1 prev-Cycle ist größer als act_Cycle

Yadid

Level-1
Beiträge
9
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Morgen liebe Community,

hab ein kleines Problem das ich nicht lösen kann. Im Prinzip geht es darum die Ticks zwischen den Zyklen vom OB1 zu messen. Genauer will ich den Minimalen Zyklus den Maximalen und den Mittelwert raus lesen natürlich zur Laufzeit.

Hier mal der Code Abschnitt:

alle Cycles sind in ULint.
Über die Systemfunktion RD_SYS_T lass ich mir die Zeit raus geben Convertiere die Zeit in ULINT-Datentypen und fasse dann Jahre Monate Tage... Sekunden Milli Mico zu einer langen ULint NANO_Sekunden Variable --> GetUnixTime zusammen.
Die Zyklus Zeit im OB1 beträgt minimal 1ms und max. 150ms

Code:
"Unixtime_ext"(Unixtime_nano=>#GetUnixTime,
               Has_Error=>#HasError);


IF #First_Cycle  = TRUE THEN 
    #TestBeginn := #GetUnixTime;
    #prev_Cycle := #GetUnixTime;
    #mainOB_counter := 0;
    #Max_delta_intern := 0;
    #Min_delta_intern := 999999999;
    #First_Cycle := FALSE;
ELSE
    #act_Cycle := #GetUnixTime;
   


    #delta := #act_Cycle - #prev_Cycle;
    #mainOB_counter := #mainOB_counter + 1;
    
    IF (#delta > #Max_delta_intern) THEN
        #Max_delta_intern := #delta;
    END_IF;
    
    IF ((#delta < #Min_delta_intern)) THEN
        #Min_delta_intern := #delta;
    END_IF;

#prev_Cycle := #act_Cycle;

Das Problem das ich habe ist, dass nach dem 2,3,4 oder 5 Zyklus die prev_Cycle größer als act_Cycle ist. Was ja garnicht passieren dürfte. Weiter würde dadurch ein Overflow durch act_Cycle - prev_Cycle entstehen. Der Overflow wird in Max_delta gespeichert und zählt von da an als größter Wert.

Hat jemand eine Idee woran das liegen könnte?


Hier nochmal ein Screenshot falls es weiterhilft:
Max_Overflow.jpg

Lieben Gruß
Yadid
 
Wie und wo ist #prev_Cycle deklariert?
Was genau macht "Unixtime_ext"?
Meldet "Unixtime_ext" vielleicht sogar einen Fehler was Du heldenmütig ignorierst?

Wird die Uhr Deiner CPU nach einer externen Uhrzeit synchronisiert?

Ich denke, für das was Du vielleicht vorhast ist Dein Verfahren ungeeignet, weil es von der Uhr abgeleitet wird, die Uhrzeit sich aber unerwartet +/- ändern kann. Schau Dir mal die Funktion RUNTIME an - die ist unabhängig von der Uhr.

Harald
 
Danke Howard den Baustein RT_INFO kannte ich tatsächlich noch nicht und dieser scheint genau das zumachen was ich benötige.

Zu Harald:
Wie und wo ist #prev_Cycle deklariert?

bein ersten Aufruf bekommt prev_Cycle die aktuelle Zeit die über getUnixTime erstellt wird.

Was genau macht "Unixtime_ext"?
Ist ein Function Baustein den ich selbst geschrieben habe. Er wandelt die System Zeit der SPS die ich über den Baustein RD_SYS_T erhalte in eine ULINT Variable um das Ergebnis des ganzen ist eine Variable die mir die Unixtime ausgibt. Unixtime ist eine Variable die von dem 1. Januar 1970, 00:00 Uhr hochzählt. (Vorteil Sommer/Winterzeit und Zeitzonen müssen nicht berücksichtigt werden).

Meldet "Unixtime_ext" vielleicht sogar einen Fehler was Du heldenmütig ignorierst?

Leider nicht die Funktion selbst habe ich auch alleine Überprüft bevor ich sie ins ganze System eingebaut habe.

Wird die Uhr Deiner CPU nach einer externen Uhrzeit synchronisiert?
Nein, da ich mir die Uhrzeit aus der Systemzeit der CPU raus lese.​


Ich denke, für das was Du vielleicht vorhast ist Dein Verfahren ungeeignet, weil es von der Uhr abgeleitet wird, die Uhrzeit sich aber unerwartet +/- ändern kann. Schau Dir mal die Funktion RUNTIME an - die ist unabhängig von der Uhr.

Auch das habe ich überprüft und bestätige das mein Ergebnis immer positiv bleibt.
Die Funktion RUNTIME kann ich nicht benutzen, da diese mir die Zeit in Sekunden raus gibt. Ich aber die Zeit gerne im Unixformat wiedergeben möchte.

 
Wie und wo ist #prev_Cycle deklariert?
bein ersten Aufruf bekommt prev_Cycle die aktuelle Zeit die über getUnixTime erstellt wird.
Das ist keine Antwort auf meine Frage.
Angenommen #prev_Cycle ist in VAR_TEMP deklariert dann kann sich die Variable seinen Wert nicht bis zum nächsten Programmdurchlauf merken.

Wird die Uhr Deiner CPU nach einer externen Uhrzeit synchronisiert?
Nein, da ich mir die Uhrzeit aus der Systemzeit der CPU raus lese.
sorry :confused: Das ist auch keine Antwort auf die Frage.
RD_SYS_T liest die Uhrzeit von der System-Uhr - diese Zeit kann durch Uhrzeit stellen und Uhrzeit-Synchronisation "springen".


PS:
Auch das habe ich überprüft und bestätige das mein Ergebnis immer positiv bleibt.
Besonders gründlich war Dein "überprüft" anscheinend nicht...

Harald
 
Zuletzt bearbeitet:
Zurück
Oben