S7-200; gezählte Sekunden als hh:mm ausgeben...

Servus_1

Level-1
Beiträge
4
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Servus an alle, die bei dieser Hitze trotzdem vor der Kiste sitzen (müssen)...

Ich bin leider nicht sonderlich bewandert, was die Programmierung anbelangt, aber eine so simple Routine hätte ich mir schon zugetraut - was scheinbar sehr überheblich war.

Problem:
Auf einer S7-226, programmiert mit Step 7-Micro/WIN, V 4.0.0.81 zähle ich für bestimmte Zustände die Dauer dieser Ereignisse in Sekunden mit.

In einem Unterprogramm sollen diese Sekunden für die Ausgabe in Stunden und Minuten umgewandelt werden. Hier meine Lösung für das Unterprogramm:

Code:
Network 1
LD     SM0.0
MOVR   LD0, LD8
/R     3600.0, LD8
TRUNC  LD8, AC1
DTI    AC1, LW4

Network 2 
LD     SM0.0
DTR    AC1, AC1
MOVR   LD8, AC2
-R     AC1, AC2                    //Std. als Real mit Nachkomma minus Ganzzahl
*R     60.0, AC2                   //Umrechnung in Minuten
ROUND  AC2, AC2
DTI    AC2, LW6

wobei LD0 die Eingangsvariable in Sekunden ist, LW4 und LW6 die Ausgabevariablen und LD8 eine temporäre Variable.


Im Prinzip funktioniert das auch alles wunderbar, ABER:
ab ca. 4.460 Stunden (also ca. 16.800.000 Sek) hat mein Tag plötzlich 48 Stunden, d. h. war Ereignis XY für 3 Stunden angestanden, werden 6 Stunden ausgegeben....

Nach Rücksetzen der Stundenzähler läuft wieder alles bestens - bis wieder über 4.460 Stunden zusammenkommen...

Kann mir jemand auf die Sprünge helfen???

Vielen Dank schon jetzt

Gruß
Servus
 
bitte um Erklärung

Guten Morgen Gemeinde,

nach vielen "Trys and Errors" hab' ich jetzt das Problem scheinbar behoben, aber ich versteh's nicht...
Vielleicht erklärt's mir jemand???

Der "Fehler" lag nicht im Unterprogramm sondern scheinbar beim Aufaddieren der Sekunden. Der Quellcode sah so aus:

Code:
Network 1 
// div andere Netzwerke

Network 2 
LD     SM0.5
EU
=      M1.0

Network 3 
// div andere Netzwerke

Network 4  //nur im Sekundentakt auslesen
LDN    M1.0
JMP    1

Network 5  //alle Sekunden 1 dazuzählen
LD     SM0.0
+R     1.0, VD1000

Network 6 
// div andere Netzwerke

Network 7 
LBL    1

Network 8  //VD1000 (Sekunden) umwandeln ins hh:mm
//Unterproggi siehe vorheriges posting

CALL   SBR1, VD1000, VW100, VW120

// wobei VW100 und VW120 die Ausgangsvariablen des Unterprogramms sind,
// eben die Zeit in Stunden und Minuten

Network 9 
// div andere Netzwerke

Wie gesagt, das hat gut funktioniert bis ca. 16.800.000 Sekunden aufgelaufen waren, dann wurde jede Sekunde 2 Sekunden dazuaddiert.

Das Problem gelöst habe ich mittlerweile durch Änderung von Netzwerk 5:

Code:
Network 5  //alle Sekunden 1 dazuzählen
LD     SM0.0
INCD  VD1000

und Änderung der Eingangsvariablen im SBR von Real auf DW und Änderung in Netzwerk1:

Code:
LD SM0.0
DTR LD0, LD8   //vorher: MOVR   LD0, LD8


So, ich bin ja froh, dass die SPS jetzt brav zählt, auch wenn die Anzahl an Sekunden größer wird,
ABER:
ich weiß nicht, weshalb es vorher nicht gefunzt hat!!!

Falls mir da jemand Nachhilfe geben könnte, wäre ich froh!

Viele Grüße
Servus
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Servus_1.

Habe mir dein Programm mal angeschaut weshalb bei 16.800.000 sek. immer plus 2 oder mehr gezählt wird. Das liegt an den Exponenten der Realzahlen, da du eine Exponente mit 7 stellen hast (16.800.000) und eine mit 1 stelle (1.0). Bei Realzahlen wird aber nur mit einer Genauigkeit von 6 Stellen gerrechtnet. Als Erklärung hängt ein Siemens FAQ bei. Des weitere ist mir noch augefallen, dass du schon nach 30 sek. eine Mintute hast. Ist das so gewollt?
Dein Code.
Code:
Network 2
LD     SM0.0
DTR    AC1, AC1
MOVR   LD8, AC2
-R     AC1, AC2                    //Std. als Real mit Nachkomma minus Ganzzahl
*R     60.0, AC2                   //Umrechnung in Minuten
ROUND  AC2, AC2 // Runde Realzahl
DTI    AC2, LW6
Mein Code
Code:
Network 2
LD     SM0.0
DTR    AC1, AC1
MOVR   LD8, AC2
-R     AC1, AC2                    //Std. als Real mit Nachkomma minus Ganzzahl
*R     60.0, AC2                   //Umrechnung in Minuten
TRUNC AC2, AC2 // Abschneiden Realzahl
DTI    AC2, LW6
Bei meinem Code werden erste nach 59 Sekunden 1 Minute Betriebszeit ausgegeben.

Ich hoffe ich konnte dir etwas weiterhelfen.
 

Anhänge

  • Genauigkeit von Realzahlen.pdf
    200,5 KB · Aufrufe: 12
Danke für die Hilfe, alles klar jetzt...

...oder auch nicht so ganz *gg*

Vielen Dank Hubert für die Aufklärung und die Siemens FAQ.

Versteh' zwar trotzdem nicht, weshalb es dann ausgerechnet ab 16.800.000 Sek. Probleme gab (=1,680000 Exp 8), denn bereits ab 10 Mio ist ja dann die letzte Stelle in der Ungenauigkeit...
Und auch weshalb den "2" addiert wird, statt Null habe ich noch nicht ganz verstanden...

Aber ehrlich gesagt: es soll mir jetzt auch egal sein ;-), ich weiß, dass ich in Zukunft nur bis 6 Stellen hinter dem Komma rechnen darf *gg*

Was die andere Sache anbelangt:
TRUNC verwende ich bei der Stundenausgabe, da sollen nur ganze Stunden angezeigt werden.
Bei den Minuten habe ich bewußt ROUND gewählt, da ja die Sekunden nicht extra ausgewiesen werden. Von daher wird tatsächlich ab 30 sec aufgerundet.

Noch Mal vielen Dank!

Gruß
Servus
 
Zurück
Oben