Laufzeiterfassung

A

Anonymous

Guest
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute!
Hab da ein kleines Problem.
In einer Anlage befinden sich mehrere Motoren,die nacheinander angesteuert werden,d.h.Motor 1 läuft an,Laufzeit xsec,Motor geht aus,Motor 2 läuft an ,Laufzeit xsec,Motor geht aus,Motor 3 läuft an,usw.Nun möchte ich die Gesamtlaufzeit jedes einzelnen Motors zu Wartungszwecken in einem Datenbaustein erfassen.Wie stelle ich das an?

Danke schon mal

Grüsse

Bernd
 
als takt kannst du die positive flanke der taktmerkerbytes benutzen.

Code:
      L     B#(31, 3)
      L     W#16#2000
      L     'BY'
      L     'VL'

//;   Betriebsstundenzähler

//;  Takt = Impuls für 1 Zyklus alle 1 Sekunde


      UN    #Reset                      // alle Werte auf Null setzen
      SPB   m000
      L     0
      T     #Sek
      T     #Min
      T     #Std

m000: UN    #Takt                       // Takt
      SPB   ENDZ
      UN    #Freigabe
      SPB   ENDZ

//;                      // --------------------------------
//;
      L     #Sek
      L     1                           // Sekunden um 1 erhoehen
      +I    
      T     #Sek
//;
      L     60
      >=I   
      SPB   M001
      SPA   ENDZ
//;                      // --------------------------------
M001: L     0
      T     #Sek
      L     #Min
      L     1                           // Minuten um 1 erhoehen
      +I    
      T     #Min
//;
      L     60
      >=I   
      SPB   M002
      SPA   ENDZ
//;                      // --------------------------------
M002: L     0
      T     #Min
      L     #Std
      L     1                           // Stunden um 1 erhoehen
      +I    
      T     #Std

//;                      // --------------------------------
//;
ENDZ: NOP   0
 
noch einfacher ?

zur funktion:

mit der positiven flanke des taktes werden die sekunden um 1 erhöht. wenn 60 sekunden erreicht sind wird die minute um 1 erhöht und gleichzeitg die sekunde wieder auf null gesetzt. das gleiche ist bei den minuten der fall.

mit dem reset werden alle auf 0 gesetzt.
a 1.0 ist der motor.

ist in fup darstellbar
Code:
      U     M      5.5
      FP    M     90.0
      =     L     20.0
      BLD   103
      U     M     90.1
      =     L     20.1
      BLD   103
      U     A      1.0
      =     L     20.2
      BLD   103
      CALL  FC   120
       Takt    :=L20.0
       Reset   :=L20.1
       Freigabe:=L20.2
       Std     :=DB80.DBW10
       Min     :=DB80.DBW11
       Sek     :=DB80.DBW12
      NOP   0
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
eine ähnliche Aufgabe habe ich mit dem ZeitOB gelöst.

z.B. alle 100ms aufaddiert, wenn der Motor lief. War eine Stunden voll dann Übertrag auf Stunde und vom ms Zähler 1h abgezogen. Das ganze in einen FB gepackt und schon war es sehr übersichtlich und für diverse Aggregate einsetztbar.
 
Hmm, die Umrechnung auf Minuten, Stunden usw. muss nicht unbedingt sein!

Angenommen ich lasse in einem DB ein DWORD jede Sekunde um 1 erhöhen, ergibt das eine Laufzeit von 136,19 Jahren zu je 365 Tagen.
Bei einer Auflösung von 0,1 Sekunden wären es maximal 13,619 Jahren.

Angenommen, das Taktmerkerbyte ist das Merkerbyte 2 würde das folgenden Code ergeben:

Code:
// Flanke 10Hz erzeugen
U     M2.0          // Taktmerker 10Hz
FP    M3.0
=     M3.1

// Zähler
ON    M3.1
ON    A4.0          // Ausgang Motor
SPB   M010

L      DB1.DBD 0     // Zählerwort
INC   L#1
T      DB1.DBD 0

M010: NOP 0


Um das ganze dann als "Betriebsstunden" in einem Bediengerät anzuzeigen, empfiehlt es sich, die lineare Umrechnung von ProTool zu verwenden.

Wertebereich Bediengerät: 0 bis 1
entspricht
Wertebereich Steuerung: 0 bis 3600

Hab ich so im Einsatz als Betriebsstundenzähler für Maschinen bzw. als Zeitzähler "CPU-RUN"
 
@Maxl

Mit was für einer CPU arbeitest du?

INC ist bei meinem Step7 ein Byte-Befehl und arbeitet nicht mit 16- oder 32-Bit-Werten?

Siemens:

INC <Ganzzahl, 8 Bit> (Inkrementiere AKKU1-L-L) addiert die Ganzzahl (8 Bit) zum Inhalt von AKKU1-L-L und speichert das Ergebnis in AKKU1-L-L. AKKU1-L-H, AKKU1-H und AKKU 2 werden nicht verändert. Die Operation wird ausgeführt, ohne die Statusbits zu berücksichtigen oder zu beeinflussen.

Hinweis Diese Operation eignet sich nicht für arithmetische Operationen (16 oder 32 Bit), da vom niederwertigen Byte des niederwertigen Worts von AKKU 1 nichts in das höherwertige Byte des niederwertigen Worts von AKKU 1 übertragen wird. Verwenden Sie für arithmetische Operationen die Operation +I bzw +D.
 
sorry, mein Fehler, hab beim schreiben nicht nachgedacht

es muss naturlich so lauten:
Code:
L      DB1.DBD 0     // Zählerwort
+      L#1
T      DB1.DBD 0


Code:
INC
ist natürlich ein Byte-Befehl

mit
Code:
+      L#1

lässt sich
Code:
L      L#1
+D
abkürzen

und nur so steht die maximale Zählerlaufzeit zur Verfügung
 
Zurück
Oben