Step 7 Uhr Programmieren mit ADD_I !!!

ich habe so gemacht weil unsere Dozent so erklärt hat. Falls wenn wir 1000 stunde haben dann benötigt man Doppelinteger.
Da hast Du Deinen Dozent möglicherweise falsch verstanden, oder der Dozent erzählt manchmal Quatsch? ;)
In einen Integer kann man Zahlen -32768 .. +32767 speichern. Erst bei größeren Werten braucht man DoppelInteger.
In Deiner Aufgabe soll Stunden nur die Werte 0..23 haben können. Int reicht völlig.

Vielleicht hat der Dozent von einer anderen Aufgabe gesprochen, wo in der Uhr nur die Sekunden gezählt werden sollen (24 Stunden lang), und die Minuten und Stunden sollen aus dem Sekundenzähler berechnet werden? Dann braucht man für die Sekunden einen DoppelInteger, weil ein Tag 86400 Sekunden hat.
Das wäre übrigens auch eine sinnvolle Übungsaufgabe - hast Du Lust?

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja richtig, das kann ich gleich verbessern. Die Aufgabe mir vorgeschlagen hast ist dass selber Prinzip eigentlich oder? Aber da muss ich ein Formel festlegen.

1h-3600s
24-86400s
1min-60s
60min-3600s
0-60s
 
Ich weiß nicht ob Ihr außer dem ADD schon andere Rechenoperationen hattet?

1) um aus der Anzahl Sekunden die Stunde herauszurechnen, muß man den Wert nur durch die Anzahl Sekunden pro Stunde teilen (Ganzzahl-Division DIV_DI)
2) um die Minute der aktuellen Stunde (0..59) herauszurechnen, muß man
2.1) zunächst die Sekunden der aktuellen Minute entfernen: durch 60 dividieren
2.2A) und danach die Anzahl Minuten der vollen Stunden abziehen (MUL_DI + SUB_DI),
2.2B) oder durch die Anzahl Stunden dividieren - die Minuten stecken dann im Divisionsrest (Modulo-Division MOD_DI)
3) um die Sekunde der Zeit herauszurechnen, dividiert man am einfachsten durch 60 und nimmt den Divisionsrest (MOD_DI)
Code:
1)   Stunde_hh := Sekunden / 3600
2A)  Minute_mm := (Sekunden / 60) - (Stunde_hh * 60)
2B)  Minute_mm := (Sekunden / 60) MOD 60
3)   Sekund_ss := Sekunden MOD 60
Beispiel: 86398 Sekunden entspricht 23:59:58 (hh:mm:ss) und soll deshalb ergeben:
Stunde hh = 23
Minute mm = 59
Sekund. ss = 58

PS:
Du hast eigentlich nirgends geschrieben, daß die Uhr Deiner ersten Aufgabe nach 24 Stunden wieder auf 0 springen soll - das haben wir in Deine Aufgabe hineininterpretiert. Vielleicht sollte Deine Uhr eine Stoppuhr sein, die max bis ca. 2 Milliarden Stunden Zeit messen kann (ca. 245000 Jahre)? Dann braucht man natürlich die Stunden als DINT.

Harald
 
Du hast eigentlich nirgends geschrieben, daß die Uhr Deiner ersten Aufgabe nach 24 Stunden wieder auf 0 springen soll - das haben wir in Deine Aufgabe hineininterpretiert.
Stimmt, das hat der TE nirgends geschrieben. Mea culpa. Das hatte ich trotzdem ganz bewusst unterstellt, weil ich dachte, das kann man leichter wieder "aufrubbeln", wenn's nicht erwünscht ist, als nachstricken, falls es doch benötigt wird.
Allerdings, durch diese Entscheidung habe ich mir selbst den Blick dafür verstellt, eine sinnvolle Verwendung des StartEingangs zu finden und habe ihn deshalb weggelassen.
Jeder Thread, jede Aufgabenstellung läuft anders. Und jeder von uns interpretiert sie unterschiedlich - nicht zuletzt abhängig von der Tagesform der Glaskugel.
Die Unterschiede unserer beiden Lösungen, Harald, sind grösstenteils auf dieselbe Ursache zurückzuführen:
Meine totale Unerfahrenheit mit der "normalen" FUP-Programmierung. Habe bisher nur ein wenig mit der LOGO!-FUP-Variante gebastelt ... und die ist einfach anders!
Von der LOGO! hatte ich im Hinterkopf "AsynchronZähler ist GlücksSache, wenn's in 1 Zyklus fertig werden soll" und habe mich deshalb spontan und unreflektiert auf die Variante SynchronZähler gestürzt.
Deine Idee, den Reset auch auf die ADD_Is zu leiten, vereinfacht den FUP ebenfalls erheblich. Im Endergebnis stört's nicht, weil die MOVEs das letzte Wort haben.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Harald,

ich werde dein Vorschläge und Anweisungen richtig überlegen und Programmieren, ich hoffe das ich schaffe :)

Kann ich so bleiben wie alte Programm und Vergleiche aber natürlich mit Mathematische Formel einfügen.

Ja es gibt ein Funktionen über Mathematik.

Ersoy_78
 
Jetzt beginne ich, den Start-Eingang zu verstehen ... soll vielleicht ein BetriebsStundenMinutenUndSekundenZähler werden? ;)
*anDieStirnKlopp*
Für die Aufgabe "Betriebsstundenzähler" passt die FB-Parameter-Deklaration sehr gut. Da ist meine Glaskugel nicht drauf gekommen. Ich hatte schon überlegt, wieso die Stunden/Minuten/Sekunden per IN_OUT aus dem FB herausgeführt sind - damit man sie außen mit remanentem Speicher verschalten kann ohne Gefahr für den Zählerstand bei eventueller Reinitialisierung des Instanz-DB. Allerdings sollte man da außen nicht Merker verschalten...

Andererseits hat meine Glaskugel mir die Funktion des start-Eingangs richtig signalisiert. Doch auch da habe ich nicht richtig hingeschaut - auf den links-gekippten Fotos war mir gar nicht aufgefallen, daß die Verknüpfung bei start ein OR ist anstatt ein AND. Mein Gehirn wollte ein AND sehen weil da normalerweise ein AND hingehört... ;)

Deine Idee, den Reset auch auf die ADD_Is zu leiten, vereinfacht den FUP ebenfalls erheblich. Im Endergebnis stört's nicht, weil die MOVEs das letzte Wort haben.
:D :cool:

Harald
 
Hallo Harald,

gerade habe ich versucht leider dauert länge, diese Aufgabe für mich sehr schwer. Du hast oben ein code gegeben da habe bin durcheinander.
 
Bitte vergleiche nochmal Dein Programm mit der Aufgabenstellung. In der neuen Aufgabenstellung soll nur noch ein Sekundenzähler vorhanden sein, der alle Sekundenpulse zählt und außer bei Reset nie zurückgesetzt oder anderweitig verändert wird. Aus diesem Zählerwert werden die 3 Zeit-Teile hh mm ss berechnet, diese werden nie auf 0 gesetzt sondern bekommen ausschließlich das Ergebnis der Berechnungen zugewiesen.

Netzwerk 1: In der neuen Aufgabenstellung soll nur noch ein Sekundenzähler (Sekunden) vorhanden sein (siehe Beitrag #22)
Netzwerk 2: aus dem Wert des Sekundenzählers soll die Stunde (Stunde_hh) ausgerechnet werden (Formel siehe Beitrag #24)
Netzwerk 3: aus dem Wert des Sekundenzählers soll die Minute (Minute_mm) ausgerechnet werden (Formel siehe Beitrag #24)
Netzwerk 4: aus dem Wert des Sekundenzählers soll die Sekunde (Sekund_ss) ausgerechnet werden (Formel siehe Beitrag #24)

(Falls eine Berechnung zu umfangreich wird, kannst Du sie auf mehrere Netzwerke aufteilen.)

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Zuerst mußt Du die nötigen Variablen anlegen bzw. bereits vorhandene Variablen im Datentyp anpassen.
Code:
IN_OUT: Sekunden : DINT

OUTPUT: Stunde_hh : DINT
OUTPUT: Minute_mm : DINT
OUTPUT: Sekund_ss : DINT

TEMP: diTemp : DINT // für Aufnahme von Zwischenergebnissen der FUP-Boxen
Das erste Netzwerk kannst Du von der vorherigen Aufgabe übernehmen, mußt nur das ADD_I zu ADD_DI anpassen
Code:
        #pf0
       +-----+   +-----+
#takt--|  P  |---|  &  |   +--------+
       +-----+   |     |   | ADD_DI |
         #start--|     |---|        |
                 +-----+   |        |
                #Sekunden--|        |-#Sekunden
                           |        |
                      L#1--|        |
                           +--------+
Jetzt nimmst Du Dir nacheinander die Berechnungsformeln vor und versuchst die in je einem Netzwerk zu erstellen.

Harald
 
Mit Zähler meine ich die ADD-Box mit der Variable "Sekunden", die bei jedem Puls 1 zum gespeicherten Sekunden-Wert addiert - das funktioniert also wie ein Zähler

Harald
 
Zurück
Oben