Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 15

Thema: Betriebsstundenzähler zu langsam...

  1. #1
    Registriert seit
    16.11.2008
    Beiträge
    51
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard


    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;[/php]

    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.
    Gruß
    vom Nils


    ------------------------------------------------
    Wer Rechtschreibfehler findet,darf Sie behalten !
    Zitieren Zitieren Betriebsstundenzähler zu langsam...  

  2. #2
    Registriert seit
    11.06.2007
    Beiträge
    162
    Danke
    3
    Erhielt 16 Danke für 16 Beiträge

    Standard

    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

  3. #3
    Registriert seit
    16.11.2008
    Beiträge
    51
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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.??
    Gruß
    vom Nils


    ------------------------------------------------
    Wer Rechtschreibfehler findet,darf Sie behalten !

  4. #4
    Registriert seit
    11.06.2007
    Beiträge
    162
    Danke
    3
    Erhielt 16 Danke für 16 Beiträge

    Daumen hoch

    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

  5. #5
    Registriert seit
    16.11.2008
    Beiträge
    51
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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;

    [/php]Das sind doch alles DT ...kann man die nich einfach subtrahieren??
    Gruß
    vom Nils


    ------------------------------------------------
    Wer Rechtschreibfehler findet,darf Sie behalten !

  6. #6
    Registriert seit
    11.06.2007
    Beiträge
    162
    Danke
    3
    Erhielt 16 Danke für 16 Beiträge

    Standard

    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

  7. #7
    Registriert seit
    16.11.2008
    Beiträge
    51
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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..
    Gruß
    vom Nils


    ------------------------------------------------
    Wer Rechtschreibfehler findet,darf Sie behalten !

  8. #8
    Registriert seit
    11.06.2007
    Beiträge
    162
    Danke
    3
    Erhielt 16 Danke für 16 Beiträge

    Standard

    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

  9. #9
    Registriert seit
    16.11.2008
    Beiträge
    51
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hi
    Nur mal so am rand [php]FB_SystemDate [/php]Hab ich auch nich....
    Gruß
    vom Nils


    ------------------------------------------------
    Wer Rechtschreibfehler findet,darf Sie behalten !

  10. #10
    Registriert seit
    11.06.2007
    Beiträge
    162
    Danke
    3
    Erhielt 16 Danke für 16 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Es nicht FB_SystemDate sondern FB_TimeDate. Aus dem ersten Beitrag von mir. Sorry es ist nicht ein getesteter code sonder eine start hilfe.

Ähnliche Themen

  1. Betriebsstundenzähler S7
    Von Stift1802 im Forum Simatic
    Antworten: 34
    Letzter Beitrag: 09.09.2015, 10:13
  2. Betriebsstundenzähler
    Von uz_ohio im Forum Simatic
    Antworten: 11
    Letzter Beitrag: 05.05.2010, 23:18
  3. Step 5 startet langsam Bedienung langsam
    Von mitchih im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 04.01.2010, 10:26
  4. Betriebsstundenzähler mit S7-314
    Von Anonymous im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 22.11.2007, 15:23
  5. Betriebsstundenzähler
    Von devolo im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 13.01.2006, 15:43

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •