Betriebsstundenzähler S7

hm die ausführung ist mir jetzt nicht ganz ersichtlich, wiso den wert 3000 und wiso +1 und wann zähle ich das wort hoch ???


Ich muss dazu sagen das ich bis jetzt vorallem in FUP programmiert habe vorallem weil ich die befehle in AWL noch nicht alle kenne(wens da nen guten guide gibt pls posten )

Ich dachte mir ich zähle ja erst sekunden hoch bei 3600 sekunden zähle ich ja die stunden.

Was ich jetzt eigentlich will ist alle 10000 stunden z.B den wert zu reseten und die stunden auf den aktualwert dazuzu zählen damit ich gar nie auf den endwert von 32 761 komme.

wenn ich mir nen eigenen zähler bastle wie bekomm ich dan die Remanenz hin ? der zähler darf ja auch beim Urlöschen nicht zurück gesetzt werden .
 
der zähler darf ja auch beim Urlöschen nicht zurück gesetzt werden

Dann würde ich die gezählten Stunden als Anfangswert eintragen


Hier mal ein kleiner Zähler:

diStunden/iMinuten/iSekunden in einem remanenten DB anlegen.

das ist die Schnittstelle des FC

in.JPG


Code:
UN    #xResetTimer
      SPB   kres
      L     0
      T     #diStunden
      T     #iMinuten
      T     #iSekunden
kres: NOP   0


      O     #xResetTimer
      ON    #xStartTimer
      ON    #xSekundenPuls
      SAVE  
      BEB   

      L     #iSekunden
      L     1
      +I    
      L     60
      >=I   
      SPB   min
      TAK   
      T     #iSekunden
      BEA   

min:  L     0
      T     #iSekunden

      L     #iMinuten
      L     1
      +I    
      T     #iMinuten
      L     60
      >=I   
      SPB   std
      TAK   
      T     #iMinuten
      BEA   

std:  L     0
      T     #iMinuten

      L     #diStunden
      L     1
      +D    
      T     #diStunden
      L     DW#16#7FFFFFFF
      >=D   
      SPBN  ende

      L     DW#16#0
      T     #diStunden

ende: BE
 
Mahlzeit die Herren!

Der Thread ist alt, ich weiß. Dennoch hätte ich eine Frage zum Betriebsstundenzähler in AWL.
Ich habe den Zähler etwas abgeändert. Zähle keine Minuten sondern meine Sekunden bis 3600 und inkrementiere danach die Stunde um +1. Nun soll dies alles im REAL-Format passieren. Meine Werte im Onlinebetrieb sind aber alles andere als brauchbar (siehe Bild).

Bitte um Hilfe; Was tun?
Betriebsstundenzähler_AWL.jpg

[EDIT]
Hier setze ich die Betriebsstunden gerade zurück, darum sind die Sekunden 0.
Aber warum habe ich bei meiner booleschen Variable #BETR_RES (Betriebsstunden RESET) den Wert 4352?
 
Zuletzt bearbeitet:
Was ist Dein Problem?

Vielleicht hilft es Dir, wenn Du den Wert des AKKU1 in der Gleitpunkt-Darstellung beobachtest? (Rechtsmausklick auf die Beobachtungsspalte > Darstellung > Gleitpunkt)

Warum zählst Du die Sekunden und Stunden im REAL-Format? Das ist meiner Meinung nach sinnfrei und bringt nur unnötig Ungenauigkeiten in die Berechnung, zumal Du eh' nur ganze Sekunden zählst, ganz davon abgesehen, daß der Stundenzähler irgendwann bei ca. 16.8 Millionen stehenbleiben wird.
Ein Zähler zählt naturgemäß ganze Einheiten.

Und wenn Du schon mit REAL arbeitest, dann solltest Du auch durchgängig den Datentyp REAL verwenden und z.B. beim Nullsetzen der Zähler 0.0 zuweisen und nicht die Ganzzahl 0.

Nachtrag:
Aber warum habe ich bei meiner booleschen Variable #BETR_RES (Betriebsstunden RESET) den Wert 4352?
Weil 4352 zufällig von den Operationen vor Deinem Code noch im AKKU1 steht.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Harald und danke für die schnelle Antwort!

Vielleicht hilft es Dir, wenn Du den Wert des AKKU1 in der Gleitpunkt-Darstellung beobachtest? (Rechtsmausklick auf die Beobachtungsspalte > Darstellung > Gleitpunkt)
Der wars! :D Hat eh funktoiniert!

Warum zählst Du die Sekunden und Stunden im REAL-Format?
Kann ich dir gern sagen. Weil es mein Auftrag ist, diesen Betriebsstundenzähler im REAL-Format zu realisieren. So sinnfrei das auch ist (ja ich stimme dir zu), der Herr hat gesprochen und seine Worte waren:" Programmiere den Betriebsstundenzähler in REAL". :p

Und wenn Du schon mit REAL arbeitest, dann solltest Du auch durchgängig den Datentyp REAL verwenden und z.B. beim Nullsetzen der Zähler 0.0 zuweisen und nicht die Ganzzahl 0.
Das fiel mir bereits auf und habs gesäubert.

Nochmals danke!
Das Ding läuft nun!
 
Wieso braucht man eigentlich bei einem Betriebsstundenzähler Sekundenimpulse?
Da reicht doch alle Stunde ein Impuls?

Hallo Silverfreaky!

Ich habs über den internen Taktgeber der CPU gemacht (darum).
Mein Merkerbit ist das M100.5 --> mit der .5 gibt mir die CPU alle 1Hz einen Signalwechsel aus.
So zähle ich mich dann bis 3600 und gebe der Stunde dann +1.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
der Herr hat gesprochen und seine Worte waren:" Programmiere den Betriebsstundenzähler in REAL". :p
Hat der Herr gesagt, daß Du den Betriebsstundenzähler in REAL programmieren MUSST oder wollte er nur den Zählerstand in REAL angezeigt bekommen (123.456 h)?
Code:
      L     #Sekunden_INT               //Sekunden INT (0..3599)
      DTR                               //Sekunden REAL
      L     3.600000e+003
      /R                                //Sekunden normiert 0.0 .. 0.999x

      L     #Stunden_DINT               //Stunden DINT
      DTR                               //Stunden REAL
      +R                                //Stunden+Sekunden REAL

      T     #Betriebsstunden_REAL

Harald
 
Wieso braucht man eigentlich bei einem Betriebsstundenzähler Sekundenimpulse?
Da reicht doch alle Stunde ein Impuls?
Wie willst du dann...
die Betriebsstunden erfassen wenn der Motor nur bis Minute 59 läuft?
oder gar noch schlimmer in irgendeinem Taktbetrieb mit gar nur 1/2-Sekunden läuft=​

Sekunden ist eigentlich eh schon das Minimum wenn der Zähler nur halbwegs stimmen soll.

Warum zählst Du die Sekunden und Stunden im REAL-Format? Das ist meiner Meinung nach sinnfrei und bringt nur unnötig Ungenauigkeiten in die Berechnung, zumal Du eh' nur ganze Sekunden zählst, ganz davon abgesehen, daß der Stundenzähler irgendwann bei ca. 16.8 Millionen stehenbleiben wird.
Ich hab mal eine gaaanz tolle Variante gesehen, da hatten die cleveren Jungs doch einfach 2.777777e-004 (1/3600) auf den Real addiert.
Hat sicher prima funktioniert, komischerweise existierten die "Zähler" nur in der SPS. Am Panel waren se nicht zu sehen... :ROFLMAO:

[EDIT]
Bei der Methode von PN/DP könntest du dir sogar den Sekunden-INT sparen und gleich einen Sekunden-DINT nehmen und nur diesen als REAL-Stunden anzeigen.
DINT-Sekunden sind immer noch ca. 68 Jahre.
 
Zuletzt bearbeitet:
Hat der Herr gesagt, daß Du den Betriebsstundenzähler in REAL programmieren MUSST oder wollte er nur den Zählerstand in REAL angezeigt bekommen (123.456 h)?

Gut gefragt; Wichtig ist der Ausgabewert, der soll in REAL ausgegeben werden.
Ich werde das Programm aber noch etwas verändern und die Sekunden durch 3600 rechnen, dann diesen Wert ausgeben --> 0.1Std, 0.5Std, 1.2Std usw...
Wenn ich mit REAL beim Betriebsstundenzähler über 1Mio. komme, genügt das vollkommen. Bis es soweit ist, sollten auch die Motoren getauscht werden.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Um meinen letzten Post zu vervollständigen, hier der Code des angepassten Bausteins.
Dieser ist nach wie vor komplett in REAL realisiert (denn der Herr sah, dass es gut war).

Code:
      UN    #BETRH_RES                  // alle Werte auf Null setzen      SPB   m000
      L     0.000000e+000
      T     #BETRH_SEK
      T     #BETRH


m000: U     #BETRH_TAKT                 // Takt
      FP    #FP_Flanke
      U(    
      O     #B_VOR
      O     #B_RUE
      )     


      SPBN  END
//; // -------------------------------
      L     #BETRH_SEK
      L     1.000000e+000               // Sekunden um 1 erhoehen
      +R    
      T     #BETRH_SEK
      L     3.600000e+003
      >=R   
      SPBN  END
//; // -------------------------------
      L     0.000000e+000
      T     #BETRH_SEK
      L     #BETRH_STD
      L     1.000000e+000               // Stunden um 1 erhoehen
      +R    
      T     #BETRH_STD
//; // --------------------------------
//;
END:  L     #BETRH_SEK
      L     3.600000e+003
      /R    
      L     #BETRH_STD
      +R    
      T     #BETRH

LG SPSZwerg

[EDIT]
Die Ausgabe sieht nun wie beschrieben aus:
0.0 Std ... 0.1 Std ... 0.9 Std ... 1.5 Std usw...
 
Zuletzt bearbeitet:
Hallo zusammen,

lang lang ist der Beitrag her. Also erstmal danke für die Vorschreiber... also Top Teil ..
Den Baustein würde ich gerne bei mir benutzen. und zwar möchte ich gerne die Betriebsstunden in eine DB reinschreiben und diese nachher mit WinCC flex anzeigen lassen. und das Pro Monat.

habe schon einen Ringbaustein gefunden versuch Ihn schon zu implementieren was bei mir auf Unverständlichkeit stößt
Code:
NW1

 U     E      0.0
      FP    M     25.1
      SPBNB _001
      L     MD    20
      L     L#4
      +D    
      T     MD    20
      UN    OV
      SAVE  
      CLR   
_001: U     BIE
      =     M     25.0

NW2

 U(    
      L     MD    20
      L     L#400
      >=D   
      )     
      FP    M     25.2
      SPBNB _002
      L     0
      T     MD    20
_002: NOP   0

NW3

 U     M     25.0                  //Erst Zählen, dann speichern
      SPBN  M001


      AUF   DB     1                    // Der DB, in den die Werte eingetragen werden sollen
      L     MD    20                    // Nummer des Datendoppelwortes, kann z.B. von einem Zähler abgeleitet werden
      SLD   3                           // Die Integerzahl muss ins Pointerfornmat gewandelt werden
      T     #DBD_Pointer                // Die Pointervariable muss ein Doppelwort sein!
      L     MD     0                    // Messwert, der ins DBW 1 geschrieben werden soll, z.B. aus einem Parameter
      T     DBD [#DBD_Pointer]          // es wird nun die Zahl 123 in das DB10.DBD??? geschrieben


M001: NOP   0

Ringspeicher.jpg

Vielleicht kann mir da jemand unter die Arme greifen? Danke im Vorraus
 
Allen Lesern noch ein Gutes neues Jahr.

Was genau verstehst du nicht oder anders, was hast du verstanden? Wie sieht deine jetzige Lösung aus? Zeig mal her. Dann wird dir sicher auch geholfen!

Gruß Tommy
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich leider weiss nicht, was bei Dir auf Unverständlichkeit stösst, bei mir sind es die beiden Kommentare:
// Messwert, der ins DBW 1 geschrieben werden soll, z.B. aus einem Parameter - was soll DBW 1 sein?
// es wird nun die Zahl 123 in das DB10.DBD??? geschrieben - wo kommt jetzt der DB10 her nach dem AUF DB 1?
 
Zuletzt bearbeitet:
also Top Teil ..
Den Baustein würde ich gerne bei mir benutzen.
Naja... wenn man umständliche Lösungen mag ;)

und zwar möchte ich gerne die Betriebsstunden in eine DB reinschreiben und diese nachher mit WinCC flex anzeigen lassen. und das Pro Monat.
Warum soll der Ringpuffer 100 Einträge haben?
Was ist E0.0 ?

Beschreibe mal mit einfachen Worten, was genau Du haben willst. Wenn man das kann, dann ist das meistens schon die halbe Lösung.

Harald
 
Warum soll der Ringpuffer 100 Einträge haben?
Wir sind doch in einem SchaltJahr, Harald! Da plant man lieber viel zu viel Reserve ein, als ein wenig zu wenig!!! :ROFLMAO:

Beschreibe mal mit einfachen Worten, was genau Du haben willst. Wenn man das kann, dann ist das meistens schon die halbe Lösung.
Das kann ich nur bestätigen. Oft ist das dann schon die "zweite halbe Lösung".
Wenn sich der Grund ergibt, etwas nachzufragen, hat man meistens schon die erste Hälfte der Lösung.
Während man sich dann überlegt, wie man die Frage formulieren soll, damit jemand verstehen kann, worum es geht, stolpert man oft schon z.B. über einen bisher unbemerkten GedankenSprung und hat damit schon die zweite Hälfte der Lösung.
 
Zuletzt bearbeitet:
Zurück
Oben