Betriebsstundenzähler zu langsam...

Der Nils

Level-1
Beiträge
52
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo und Guten Tag

Ich bastel jetzt schon etwas länger an einem Betriebsstundenzähler.
Leider bekomme ich das nich so richtig an's Laufen.

Ich möchte die Laufzeit eines Motors erfassen wenn er steht muss der Zähler auch stehen bleiben (logisch)und wenn er wieder Läuft muss der Zähler weiter zählen bis zum Reset oder so.

Um möglichst genau zu sein möchte ich mit einer Uhr(RTC)synchronisieren.
Die Uhr lese ich regelmäßig aus dem PLC Rechner.

Folgenden Baustein hab ich bei oscat gefunden
Funktioniert auch alles nur is der Zähler bei mir immer etwas langsamer als die Uhr

PHP:
IF NOT init OR rst THEN
    init := TRUE;
    last := tx;
    SECONDS := 0;
    CYCLES := BOOL_TO_INT(in);
    ms := 0;
ELSIF IN THEN

    ms := (tx - last) + ms;
    IF ms >= 1000 THEN
        seconds := seconds + 1;
        ms := ms - 1000;
    END_IF;
    cycles := cycles + BOOL_TO_INT(NOT edge);
ELSE
    last := tx;
END_IF;
edge := in;
Sekunden:= SECONDS/100;
Minuten:=( SECONDS/100)/60;
Stunden:= Minuten / 60;

Das hochrechnen von seconds ist zu langsam so das der Zähler weniger anzeigt al eigentlich gelaufen.
Hat jemand ne Idee oder nen Tipp dann immer her damit.
 
Es gibt zwei möglichkeiten:

Mit einem TON Funktionsbaustein:
Code:
TimeTON(IN:= Start , PT:= T#60m, Q=> Ende, ET=>StopTime );
Mit diesem TON Baustein, kannst du die Stunden zählen. Die Zeit dazwischen kannst du aus StopTime auslesen.

Oder

Über die system Zeit:

Code:
FUNCTION_BLOCK FB_TimeDate
VAR_INPUT
         Enable:BOOL;
END_VAR
VAR_OUTPUT
        MachineTime: DATE_AND_TIME;
END_VAR
VAR
        ntGetTime: NT_GetTime;
        ntTime:TIMESTRUCT;
        GetTimeStart: BOOL;
        fbRTC:RTC;
        TriggerTON: TON;
        TriggerClock: BOOL;
        TimeBusy: BOOL;
        OldTimeBusy: BOOL;
        GetTimeError: BOOL;
        StartUp:BOOL:=TRUE;
        TriggerStart: BOOL;
END_VAR

IF Enable=TRUE THEN

    TriggerClock:=FALSE;
    IF TimeBusy=FALSE AND OldTimeBusy=TRUE THEN
        TriggerClock:=TRUE;
        StartUp:=FALSE;
    END_IF;
    OldTimeBusy:=TimeBusy;

    TriggerTON(IN:= NOT TriggerClock , PT:= T#5m, Q=> TriggerStart);

    GetTimeStart:=FALSE;
    IF StartUp=TRUE OR TriggerStart=TRUE THEN
        GetTimeStart:=TRUE;
    END_IF;

    ntGetTime(
        NETID:='',
        START:=GetTimeStart,
        TMOUT:=T#10s,
        BUSY=> TimeBusy,
        ERR=> GetTimeError,
        ERRID=>,
        TIMESTR=> ntTime);

    fbRTC(
           EN :=TriggerClock,
            PDT:=SYSTEMTIME_TO_DT(ntTime),
           Q=>,
            CDT=>MachineTime);

END_IF;
Aus diesem Funktionsblock kommt die Zeit. Die Zeit wird alle 5 min mit der Systemzeit verglichen und angepasst.

Gruss
Thomas
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin Moin
Super Teil habs gleich mal getestet.....
Aber um die gelaufene Zeit zu ermitteln muss ich doch den ersten anschaltwert festhalten und dann später von der gemessenen Zeit abziehen ...oder nich..??
Den gespeicherten Wert überschreibt man bei Bedarf mit einem Jüngeren.
(Reset Betriebsstunden) zB. nach einem Ölwechsel oder einer Wartung.
Blöde Frage aber wie merke ich mir die erste Startzeit bis zu einem Reset.??
 
Code:
FUNCTION_BLOCK FB_SpeedValues
VAR_INPUT
    EngineOn:BOOL;
END_VAR
VAR_OUTPUT
    StartTime:DATE_AND_TIME;
    EndTime:DATE_AND_TIME;
    RunTime:DATE_AND_TIME;
END_VAR
VAR    
    fbSystemDate:FB_SystemDate;
    SystemTime:DATE_AND_TIME;
    OldEngineOn:BOOL;
END_VAR

fbSystemDate(Enable:=TRUE,MachineTime=>SystemTime);

IF OldEngineOn=FALSE AND EngineOn=TRUE THEN
    StartTime:=SystemTime;
ELSIF OldEngineOn=TRUE AND EngineOn=FALSE THEN
    EndTime:=SystemTime;
    RunTime:=EndTime-StartTime;
ELSIF EngineOn=TRUE THEN
    RunTime:=SystemTime-StartTime;
END_IF;
OldEngineOn:=EngineON;

So etwa ?

Gruss
Thomas
 
Hi
Jetzt meckert er wieder das er TIME nich in DT konvertieren kann..
Das hat ich jetzt schon ein paar mal kann mir das aber nich erklären..
PHP:
RunTime:=EndTime-StartTime;
Das sind doch alles DT ...kann man die nich einfach subtrahieren??
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Dann musst du es zuerst in eine Time Variable convertieren

mTime:TIME;

mTime:=TOD_TO_TIME(DT_TO_TOD(MachineTime));

Dann musst du aber den Fall Mitternacht. nochmals überdenken.

Gruss
Thomas
 
Ja nicht nur das...

Ich weiß auch immer noch nicht wie ich den ersten Startwert
Speichern soll wenn der Motor zwischendurch mal aus ist darf er den ja nicht überschreiben .....
Ich brauche die Summe der einzelnen Laufzeiten von einem Reset zum nächsten.(500 bis 1000 Stunden)
Endweder sehe ich den Wald vor Bäumen nicht oder das is wirklich so kompliziert.?.!.
Hab im WWW auch noch nichts darüber gefunden..... Ich kann garnicht glauben das ich der einzige mit so einer Aufgabenstellung bin..
 
Die TIME Variable geht doch bis 1193.333 Stunden. Da haben deine 1000 Std platz.

Das Programm könnte so aussehen

Code:
FUNCTION_BLOCK FB_1000StdCounter
VAR_INPUT
    EngineOn:BOOL;
    DoLoadTime:BOOL;
    LoadTime:TIME;
END_VAR
VAR_OUTPUT
    RunTime:TIME;
END_VAR
VAR    
    fbSystemDate:FB_SystemDate;
    SystemTime:TIME;
    StartTime:TIME;
    SaveTime:TIME;
    OldEngineOn:BOOL;
END_VAR

(* Get Time *)
fbSystemDate(Enable:=TRUE,MachineTime=>SystemTime);
SystemTime:=TOD_TO_TIME(DT_TO_TOD(MachineTime));

IF DoLoadTime=TRUE THEN
    SaveTime:=LoadTime;    
END_IF;

(* Time counter *)
IF OldEngineOn=FALSE AND EngineOn=TRUE THEN
    StartTime:=SystemTime;
ELSIF OldEngineOn=TRUE AND EngineOn=FALSE THEN
    IF SystemTime>StartTime THEN
       SaveTime:=SaveTime+SystemTime-StartTime;
    ELSE
       SaveTime:=SaveTime+SystemTime+T#1440m-StartTime;
    END_IF;
ELSIF EngineOn=TRUE THEN
    IF SystemTime>StartTime THEN
       RunTime:=SaveTime+SystemTime-StartTime;
    ELSE
       RunTime:=SaveTime+SystemTime+T#1440m-StartTime;
    END_IF;
ELSE
    RunTime:=SaveTime;
END_IF;
OldEngineOn:=EngineON;
Das nächste Problem könnte dann das Abspeichern der Zeit sein, so dass es beim nächsten Maschinen Start noch da ist. Eine Lade Funktion habe ich schon rein gemacht.

Gruss
Thomas
 
Es nicht FB_SystemDate sondern FB_TimeDate. Aus dem ersten Beitrag von mir. Sorry es ist nicht ein getesteter code sonder eine start hilfe.
 
Jo danke

Ich möchte ja auch keine fertigen Bausteine auf dem Sibertablett geliefert
bekommen.

Nur is es ohne Starthilfe nicht möglich (für jemanden wi mich) so eine Funktion zu realisieren.

Nur so Grundlegent wie lege ich eien Wert ab und rufe ihn später wieder auf ...
Gibt es da extra Befehle oder sowas..?
Kann mein BC 9050 das überhaubt ??
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja dein BC9010 sollte das können. Er hat 2kByte remanente Daten.

Beim BC9010 kenne ich mich nicht so aus. Bei einem CX1010 muss man die Variablen im Systemmanager mit dem Nvram verknüpfen. Bei dir genügt vielleicht die variablen in diesen Globalen Variablen zu definieren

Globale VariablenVAR_GLOBAL RETAIN
(* Variablendeklarationen *)
END_VAR


VAR_GLOBAL PERSISTENT
(* Variablendeklarationen *)
END_VAR
 
schau dir doch nochmal den ontime aus der oscat lib an
extern zeigt er zwar nur sekunden an, intern rechnet und zählt er aber millisekunden.
die ontime deines verbrauchers wird in millisekunden ermittelt und auch aufaddiert. immer wenn der interne millisekundenzähler über 1000 millisekunden läuft wird der ausgang um eine sekunde hochgezählt.
du hast dort beides, hohe auflösung und einen einafchen ausgang
der ausgang ist zusätzlich ein io und kann als remanent deklariert werden.
 
Hi
Ja den ON TIME hab ich ja benutzt aber der Lügt...
hab ich im ersten POST geschrieben...
Der verliert 3-5 Min pro Stunde am Ausgang.
Oder ich mach was Falsch (was leider viel zu offt vorkommt)

Aber trotzdem Danke
 
Zuviel Werbung?
-> Hier kostenlos registrieren
was meinst du mit er lügt, das würde ich gerne näher untersuchen.
onzime ist in hunderten von projekten im einsatz, bisher ohne probleme.
habe auch ein testprojekt aufgesetzt und nachgemessen, ohne probleme auflösung eine millisekunde

kannst du mir deine projekt posten wo er angeblich lügt dann kann ich dir sicher auch helfen

ontime nutzt den interen sps timer und dieser ist nach iec61131-3 sehr genau und stabil.
hast du eventuell in der simulation gemessen? dort (auf einem pc) gibt es diesen hardware timer nicht und der wird dann emuliert, was nicht besonders genau ist.
 
Zurück
Oben