# Betriebsstundenzähler S7



## Stift1802 (16 Juni 2010)

Hallo Zusammen,

für eine Anlage benötige ich mehrer Betriebsstundenzähler. Jetzt habe ich bischen im Netz herum gesucht auch was gefunden nur als ich es getest habe hat es nicht wirklich geklappt. Nun dachte ich mir dann baue ich es mir eben selber. Nach bischen überlegen und herum spielen mit Zählern habe ich aber gemerkt das mein Zähler bei 999 nicht mehr weiter Zählt. Hat jemand eine Idee wie man einen Betriebsstundenzähle programmiert.
Am liebsten wäre mir natürlich FUB wenn AWL wäre super wenn es mir jemand Stück für Stück erklären könnte das ich es auch verstehe.

Vielen Dank im Vorraus.

Stift1802


----------



## IBN_Christian (16 Juni 2010)

Hast du einen "normalen" Siemenszähler benutz (Zx)?

Wenn ja probiers mal mit:

SFB 0 CTU (Vorwärtszählen mit dem SFB 0)

Findet man in der Standart Libary oder du schreibst eine mathematische Rechenoperation in AWL.


----------



## PN/DP (16 Juni 2010)

siehe Betriebsstundenzähler / Wartungsintervalle
und benutze unsere Forums-Suche nach "Betriebsstunden"

Gruß
Harald


----------



## Stift1802 (16 Juni 2010)

Hallo IBN-Christian danke für die schnelle Antwort. Dann muss ich mir mal die Zähler anschauen habe noch nie was mit SFB 0 CTU zutun gehabt. allerdings habe ich auch keine Ahnung von einer mathematische Rechenoperation in AWL.

@PN/DP auch dir danke die suche habe ich schon gemacht nur dringt nichts wenn ich es nicht verstehe  trotzdem danke


----------



## Paule (16 Juni 2010)

Stift1802 schrieb:


> @PN/DP auch dir danke die suche habe ich schon gemacht nur dringt nichts wenn ich es nicht verstehe  trotzdem danke


Hallo Stift,
was verstehst Du denn nicht?
Wir können es Dir doch dann erklären. 
Wenn man immer nur das macht was man kann lernt man ja nichts dazu.


----------



## Stift1802 (16 Juni 2010)

Hallo Paule,

langsam versteh ich das gar nicht mehr werde mit den SFB noch das mit dem addieren.

Wie macht ihr denn so Betriebsstundenzähler???

Habe jetzt nochmal in den Beiträgen gesucht aber da sind immer AWL-Cods die ich nicht versteh ich will doch nur ein ganz normaler Betriebsstundenzähler wenn möglich nichts einfach rein kopieren sondern selber programmiert das auch was hängen bleibt


----------



## Paule (16 Juni 2010)

Stift1802 schrieb:


> langsam versteh ich das gar nicht mehr werde mit den SFB noch das mit dem addieren.
> 
> Wie macht ihr denn so Betriebsstundenzähler???
> 
> Habe jetzt nochmal in den Beiträgen gesucht aber da sind immer AWL-Cods die ich nicht versteh ich will doch nur ein ganz normaler Betriebsstundenzähler wenn möglich nichts einfach rein kopieren sondern selber programmiert das auch was hängen bleibt


Also ich mach mir immer meinen eigenen, und dabei passiert folgendes:

Wenn der Antrieb läuft wird vom Sekundentakt die positive Flanke genommen.
Mit diesem Verknüpfungsergebnis (Antrieb & Sekundentakt) wird ein Merker- oder Datenwort um eins hoch gezählt.
Wenn es ein Merkerwort ist muss es auf jeden Fall remanent sein.
(Das ganze wird dann später in einen FB gepackt und mit einer Stat-Var) gezählt. Für den Anfang aber erst mal vergessen)
Wurden 3600 Sekunden gezählt wird der Betriebsstundenzähler der auch wieder ein Merker- oder ein Datenwort ist um eins erhöht und der Sekundenzähler wird wieder auf Null zurückgesetzt.
Somit wurde eine Stunde gezählt.

Vielleicht schaust Du Dir jetzt mit dieser Beschreibung irgendeinen Code noch mal an (werden alle ähnlich sein) und schreibst dann an welcher Stelle es nicht klar ist.


----------



## PN/DP (16 Juni 2010)

Hallo Stift,

schreckt Dich die Vorstellung vom Selber-Suchen und Selber-Denken ab?

In dem von mir verlinkten Thema ist gleich im Beitrag #6 ein FUP-Beispiel eines Betriebsstundenzählers.
Der benötigt gerade mal 1 Netzwerk, um Betriebs-Sekunden zu zählen. Teile das Zählergebnis durch 3600, 
dann hast Du Betriebs-Stunden. Wenn Du kein Wartungsintervall brauchst, dann laß das einfach weg.
Und Du brauchst als Zähltakt noch einen Sekundenimpuls, der genau 1 Zyklus lang ist.

Dort im Beitrag #7 habe ich ausführlich in Worten erklärt, wie ein Betriebsstundenzähler funktioniert, 
das bräuchtest Du nur in FUP umzusetzen.



Stift1802 schrieb:


> Nun dachte ich mir dann baue ich es mir eben selber. Nach bischen überlegen und herum spielen mit Zählern habe ich aber gemerkt das mein Zähler bei 999 nicht mehr weiter Zählt. Hat jemand eine Idee wie man einen Betriebsstundenzähle programmiert.
> Am liebsten wäre mir natürlich FUB wenn AWL wäre super wenn es mir jemand Stück für Stück erklären könnte das ich es auch verstehe.


Du hast also schon was programmiert und irgendwas gezählt. Dein Problem ist doch eigentlich nur noch,
daß Dein Zähler bei 999 stehen bleibt und nicht weiterzählt. Nimm also den FUP-Zähler aus dem Beitrag #6 
in Dein bestehendes Programm und Dein Betriebsstundenzähler dürfte fertig sein.

Sollte der dann nicht wie gewünscht funktionieren, dann stell hier rein, was Du bis dahin programmiert 
hast und wir finden die letzten Kleinigkeiten, die Deinem Ziel entgegenstehen.

Programme in FUP kann man hier im Forum nur als Screenshot einstellen, oder vorher in Step7 die Ansicht 
auf AWL umstellen und den AWL-Code hier in [CODE]-Tags einfügen (der #-Button im Beitragseditor).

Gruß
Harald


----------



## PN/DP (17 Juni 2010)

*Forums-Suche sucht nicht nach "Betriebsstundenzähler"*

Liebe Forums-Administratoren,

unsere Forums-Suche weigert sich, nach "*Betriebsstundenzähler*" zu suchen. 



Könnt Ihr da vielleicht etwas machen?
Der arme Stift und andere interessierte User können so leider nicht nach dem häufigen Thema 
"Betriebsstundenzähler" suchen, selbst wenn sie wollten.
Deshalb hatte ich dem Stift auch empfohlen, nach "Betriebsstunden" zu suchen. Das geht. 

Danke!
Harald


----------



## gita07 (9 Juni 2011)

Paule schrieb:


> Also ich mach mir immer meinen eigenen, und dabei passiert folgendes:
> 
> Wenn der Antrieb läuft wird vom Sekundentakt die positive Flanke genommen.
> Mit diesem Verknüpfungsergebnis (Antrieb & Sekundentakt) wird ein Merker- oder Datenwort um eins hoch gezählt.
> ...


 Hallo Paule!!

das habe ich auch gedacht, aber bei mir geht nicht!was habe ich falsch gemacht!????


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

m000: U    #Takt                       // Takt M0.5 1 Sekunde
           U #Start/stop          //Start und Stop Befehl
      L     #Sek
      L     1                           // Sekunden um 1 erhoehen
      +I    
      T     #Sek
//;
      L     60
      >=I   
      SPB   M001

//;                      // --------------------------------

M001: L     0
      T     #Sek
      L     #Min
      L     1                           // Minuten um 1 erhoehen
      +I    
      T     #Min
      L    60
      >=I   
      SPB   M002
//;                      // --------------------------------
M002: L     0
      T     #Min
      L     #Std
      L     L#1                           // Tage um 1 erhoehen
      +D    
      T     #Std
                     // --------------------------------


----------



## vierlagig (9 Juni 2011)

hiert fehlt ein sprung

```
*
m000: U #Takt // Takt M0.5 1 Sekunde
      U #Start/stop //Start und Stop Befehl
      L #Sek
```



und hier ein alternativer SPA

```
*
>=I 
SPB M001

//; // --------------------------------

M001: L 0
```


----------



## gita07 (9 Juni 2011)

vierlagig schrieb:


> hiert fehlt ein sprung
> 
> ```
> *
> ...


 
m000: U #Takt // Takt M0.5 1 Sekunde
U #Start/stop //Start und Stop Befehl
L #Sek
SPB ENDZ



>=I 
SPB M001
SPA ENDZ

ENDZ: NOP 0

So meinst du???
Danke!

Ich hab es probiert, aber  die Zeit läuft sehr schnell und ohne das der Start Befehl betätigt ist,Warum???
Danke


----------



## vierlagig (9 Juni 2011)

kopfschüttel...

der_iwan hatte heut die selben probleme: http://sps-forum.de/showthread.php?t=45854


----------



## gita07 (9 Juni 2011)

vierlagig schrieb:


> kopfschüttel...
> 
> der_iwan hatte heut die selben probleme: http://sps-forum.de/showthread.php?t=45854


 

UUUHH!! Sorry! ich bin heute nicht so Schlau!

Wo habe ich den Fehler???Konntest du mir bitte helfen??

Und Wenn ich Reset betätigt, werden Alle WErte auf Null gesetzt ausser Sek auf 1,warum??
Danke!!

Ich habe schon geschafft!!der Fehler war der Sprung...

    UN    #Reset                      // alle Werte auf Null setzen
      SPB   m000
      L     0
      T     #Sek
      T     #std
      T     #Min
m000: U     #Takt                       // Takt
      FP    #FP
      U     #Start_Stop
 SPBN  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                        // Minuten um 1 erhoehen
      L     1
      +I    
      T     #Min
//;
      L     60
      >=I   
      SPB   M002
      SPA   ENDZ
//;                      // --------------------------------
M002: L     0
      T     #Min
      L     #std
      L     L#1                         //  Stunden um 1 erhoehen
      +D    
      T     #std
//;                      // --------------------------------
//;
ENDZ: NOP   0


----------



## vierlagig (9 Juni 2011)

gita07 schrieb:


> Ich habe schon geschafft!!der Fehler war der Sprung...



nee, oder? kann doch gar nicht sein!


----------



## gita07 (9 Juni 2011)

vierlagig schrieb:


> nee, oder? kann doch gar nicht sein!


 
Ich probiere das Programm nochmal, aber ich glaube, es hat funktioniert,

Warum denkst du, dass es nicht gehen solltet?


----------



## Paule (9 Juni 2011)

gita07 schrieb:


> Ich probiere das Programm nochmal, aber ich glaube, es hat funktioniert,


Sollte schon passen! 



vierlagig schrieb:


> nee, oder? kann doch gar nicht sein!


 


gita07 schrieb:


> Warum denkst du, dass es nicht gehen solltet?


Das war doch nur Sarkasmus 

PS: Warum zählst Du nicht gleich 3600 Sekunden? Oder willst Du die Minuten separat haben?


----------



## gita07 (9 Juni 2011)

Paule schrieb:


> Sollte schon passen!
> 
> 
> 
> ...



mmm..OK!!hehe! es war nur Sarkasmus!! hehe!ok!
ich will die Minuten haben!deswegen!
danke!!


----------



## vierlagig (9 Juni 2011)

es war kein sarkasmus.



			
				wiki schrieb:
			
		

> Der Begriff Sarkasmus bezeichnet beißenden, bitteren Spott und Hohn.



es war rhetorische ironie



			
				wiki schrieb:
			
		

> Die einfachste Form der rhetorischen Ironie besteht darin, das Gegenteil von dem zu sagen, was man meint.



aber



			
				Volker Pispers schrieb:
			
		

> ...das kann man doch alles nachlesen! *Lesen* muß man können, das ist das Hauptproblem ...


----------



## Dword (2 Mai 2012)

wie weit zählt den ein sfb 0 ? 

mir ist auserdem aufgefallen das wenn der baustein neu geladen wird seine werte wieder auf 0 gesetzt werden kann man dass irgendwei schreibschützen oder anders lösen ? mit einem PW?


----------



## Verpolt (2 Mai 2012)

Hallo,




______________________


----------



## Dword (3 Mai 2012)

kann man das irgendwie erhöhen?sprich weiter zählen als 32 tausend?


----------



## Verpolt (3 Mai 2012)

Dword schrieb:


> kann man das irgendwie erhöhen?sprich weiter zählen als 32 tausend?



Ein weiteres Daten(doppel)wort hochzählen. Wert=30000 --> +1 im weiteren Wort2. Ergebnis =Wort2 * 32000 + Wort1.

Oder selber einen Zähler kreieren und mit Doppelwort arbeiten


----------



## Dword (3 Mai 2012)

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 .


----------



## Verpolt (3 Mai 2012)

> 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






```
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
```


----------



## Verpolt (3 Mai 2012)

Dword schrieb:


> 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 )



http://www.automation.siemens.com/m...oad_ausbildungsunterlagen/Seiten/Default.aspx

__________________________


----------



## SPSZwerg (8 September 2015)

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?



[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?


----------



## PN/DP (8 September 2015)

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:


SPSZwerg schrieb:


> 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


----------



## SPSZwerg (8 September 2015)

Hallo Harald und danke für die schnelle Antwort!



PN/DP schrieb:


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


Der wars!  Hat eh funktoiniert!



PN/DP schrieb:


> 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". 



PN/DP schrieb:


> 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!


----------



## silverfreaky (8 September 2015)

Wieso braucht man eigentlich bei einem Betriebsstundenzähler Sekundenimpulse?
Da reicht doch alle Stunde ein Impuls?


----------



## SPSZwerg (8 September 2015)

silverfreaky schrieb:


> 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.


----------



## PN/DP (8 September 2015)

SPSZwerg schrieb:


> der Herr hat gesprochen und seine Worte waren:" Programmiere den Betriebsstundenzähler in REAL".


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)?

```
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


----------



## RONIN (8 September 2015)

silverfreaky schrieb:


> 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.



PN/DP schrieb:


> 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... 

[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.


----------



## SPSZwerg (8 September 2015)

PN/DP schrieb:


> 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.


----------



## SPSZwerg (9 September 2015)

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).


```
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...


----------



## Metalesel (1 Januar 2020)

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

```
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
```




Vielleicht kann mir da jemand unter die Arme greifen? Danke im Vorraus


----------



## elektroniktommy (1 Januar 2020)

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


----------



## Heinileini (1 Januar 2020)

Ich leider weiss nicht, was bei Dir auf Unverständlichkeit stösst, bei mir sind es die beiden Kommentare:
// Messwert, der ins DB*W* 1 geschrieben werden soll, z.B. aus einem Parameter - was soll DBW 1 sein?
// es wird nun die Zahl 123 in das DB1*0*.DBD??? geschrieben - wo kommt jetzt der DB10 her nach dem AUF DB 1?


----------



## PN/DP (1 Januar 2020)

Metalesel schrieb:


> also Top Teil ..
> Den Baustein würde ich gerne bei mir benutzen.


Naja... wenn man umständliche Lösungen mag 



Metalesel schrieb:


> 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


----------



## Heinileini (1 Januar 2020)

PN/DP schrieb:


> 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!!! 



> 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.


----------



## Metalesel (2 Januar 2020)

Frohes neues jahr noch .. Stimmt ja 

also mir gehts einfach darum dass ich einen KwH Zähler basteln möchte. Diesen dann über WinCC Flex auslesen möchte. 

ich bräuchte vielleicht nur einen Anstups wie ich das programmieren könnte. Ich komm einfach mit den Pointern nicht ganz klar. 

Ob es sinnig ist die DBD ?? als IN/OUT Variable zu kennzeichnen. weiss ich nicht. 

auch nicht wie ich die Jahre damit trennen kann. 

Die 100 sind auch zuviel, dass stimmt. 

MFG


----------



## Blockmove (2 Januar 2020)

Metalesel schrieb:


> Frohes neues jahr noch .. Stimmt ja
> 
> also mir gehts einfach darum dass ich einen KwH Zähler basteln möchte. Diesen dann über WinCC Flex auslesen möchte.
> 
> ...



Überleg dir erstmal eine sinnvolle Datenstruktur wie du deine Daten speichern willst.
Wenn es um Verbrauch / Erzeugung geht, dann ist meist ein Tag eine gute Basis.
Also z.B. 366 Werte in einem DB. Und für jedes Jahr dann z.B. einen DB.

Persönlich würde ich für sowas WinCC flexible gar nicht verwenden, sondern irgendeine Homeautomation Software (openhab, ioBroker, Home assitant, ...)
Das ganze auf einem Raspberry Pi installieren und du hast mit wenig Aufeand eine Energiedatenerfassung, wie du sie mit Flex nie bauen kannst.


----------



## Heinileini (2 Januar 2020)

Metalesel schrieb:


> Ich komm einfach mit den Pointern nicht ganz klar.


Lässt sich Deine S7 auch in SCL programmieren? Dann könntest Du den Pointern aus dem Wege gehen und mit Arrays arbeiten.
Du weisst nicht, wie Du die Jahre trennen kannst? Du wolltest doch ohnehin "die Monate trennen", wenn ich das richtig verstanden habe. Das dürften ganz eng verwandte Themen sein.
Für wieviele Jahre willst Du die monatlichen Daten im Zugriff haben? Nur für das aktuelle oder auch für das vorausgegangene oder noch mehr?
Ich würde in dem Element des Arrays, das dem aktuellen Monat des aktuellen Jahres zugeordnet ist, den Zählerstand aktualisieren ... bis ein neuer Monat anfängt und mit dem dann aktuellen ArrayElement so weitermachen.
Beim Abspeichern nichts weiter berechnen. Wenn Du dann den "Verbrauch" in einem bestimmten Monat nachsehen willst, brauchst Du nur die Differenz des im jeweilgen Monat gespeicherten Wertes zum Vormonat zu bilden. Wenn Du den "Verbrauch" eines Jahres benötigst, die Differenz zwischen dem Wert vom Dezember des Jahres und Dezember des Vorjahres.
Ich finde es sinnvoll, beim Erfassen der Daten, diese nach Möglichkeit nicht aufwendig weiterzubearbeiten, sondern so wie sie sind abzuspeichern.
Bemerkst Du plötzlich, dass Deine Berechnungen nicht ganz korrekt waren, kannst Du deine Formel reparieren und auf die noch vorhandenen und unveränderten "Basis"-Daten anwenden.
Irgendwo müsstest Du natürlich noch abspeichern, welchem Monat welchen Jahres das erste ArrayElement entspricht.


----------



## Metalesel (2 Januar 2020)

Blockmove schrieb:


> Überleg dir erstmal eine sinnvolle Datenstruktur wie du deine Daten speichern willst.
> Wenn es um Verbrauch / Erzeugung geht, dann ist meist ein Tag eine gute Basis.
> Also z.B. 366 Werte in einem DB. Und für jedes Jahr dann z.B. einen DB.
> 
> ...




Super vielen dank.. werd mir die Raspi Versionen mal ansehen. 

@Heinileini

Ja soweit ich weiss kann die SPS SCL. 

Wenn das so läuft wie bei PHP könnte ich das sogar hinbekommen. Zwar lange her aber es geht. 


------

Die Anstupser reichen mir schon mal .. das ist schon mal ein Lösungsansatz. Ich melde mich wenn ich mal was gemacht habe. Danke an die Community!!!!!


----------

