Step 7 Uhr Programmieren mit ADD_I !!!

Das zweite Netzwerk mit dieser Berechnung:
Code:
1)   Stunde_hh := Sekunden / 3600
sieht so aus:
Code:
           +--------+
           | DIV_DI |
          -|EN      |
           |        |
#Sekunden--|IN1  OUT|-#Stunde_hh
           |        |
     3600--|IN2  ENO|-
           +--------+

Die letzten 2 Netzwerke bekommst Du nun hin?

Harald
 
Dein Netzwerk 4 ist korrekt! :s12:

Zu Netzwerk 3
Die Operanden (Variablen und Zahlen) der Formel (rechts vom :=) müssen am Eingang (links IN1,IN2) von Rechenoperationen stehen. Rechts ist der Ausgang (OUT), das Ergebnis der Rechenoperation
- das ist entweder das Endergebnis der Berechnung, dann kommt da die Variable links vom := der Formel dran
- oder es ist ein Zwischenergebnis, dann kommt da eine Zwischenergebnis-Variable dran, und mit dem Zwischenergebnis wird die Berechnung mit der nächsten Rechenoperation fortgesetzt.

Die Formel
2B) Minute_mm := (Sekunden / 60) MOD 60
wird so programmiert:
Sekunden / 60 ---> Zwischenergebnis ---> MOD 60 ---> Minute_mm
Code:
Netzwerk 3 Variante 2B)
           +--------+
           | DIV_DI |
          -|EN      |
           |        |
#Sekunden--|IN1  OUT|-#diTemp     +--------+
           |        |             | MOD_DI |
       60--|IN2  ENO|-------------|EN      |
           +--------+             |        |
                         #diTemp--|IN1  OUT|-#Minute_mm
                                  |        |
                              60--|IN2  ENO|-
                                  +--------+
Die Formel
2A) Minute_mm := (Sekunden / 60) - (Stunde_hh * 60)
ist komplizierter wegen der zweiten Klammer, das wird so programmiert:

Sekunden / 60 ---> Zwischenergebnis1
Stunde_hh * 60 ---> Zwischenergebnis2
Zwischenergebnis1 - Zwischenergebnis2 ---> Minute_mm

So ist es aber unschön, weil dabei der Wert des Ausgangs Stunde_hh gelesen wird (das ist manchmal verboten)
Deshalb besser die Formel so umwandeln, daß es nicht mehr nötig ist den Ausgang zu lesen:

Die Formel 1) Stunde_hh := Sekunden / 3600
in die Formel 2A) Minute_mm := (Sekunden / 60) - (Stunde_hh * 60)
anstelle des Stunde_hh einsetzen: Minute_mm := (Sekunden / 60) - (Sekunden / 3600 * 60) (Achtung! nicht kürzen wegen Ganzzahl-Division!)
das wird so programmiert:

Sekunden / 60 ---> Zwischenergebnis1
Sekunden / 3600 ---> Zwischenergebnis2 ---> * 60 ---> Zwischenergebnis2
Zwischenergebnis1 - Zwischenergebnis2 ---> Minute_mm

Code:
Netzwerk 3 Variante 2A)
           +--------+
           | DIV_DI |
          -|EN      |
           |        |
#Sekunden--|IN1  OUT|-#diTemp     +--------+
           |        |             | DIV_DI |
       60--|IN2  ENO|-------------|EN      |
           +--------+             |        |
                       #Sekunden--|IN1  OUT|-#diTemp2    +--------+
                                  |        |             | MUL_DI |
                            3600--|IN2  ENO|-------------|EN      |
                                  +--------+             |        |
                                               #diTemp2--|IN1  OUT|-#diTemp2    +--------+
                                                         |        |             | SUB_DI |
                                                     60--|IN2  ENO|-------------|EN      |
                                                         +--------+             |        |
                                                                       #diTemp--|IN1  OUT|-#Minute_mm
                                                                                |        |
                                                                      #diTemp2--|IN2  ENO|-
                                                                                +--------+
Harald
 
Hallo Harald,
Danke für die Lösung, ich werde heute nochmal Probieren. Wenn die Erfahrung nicht da ist krieg man Schwierigkeiten.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nochmal eine Zusammenfassung:
In ausgeschriebenen Formeln oder Berechnungsanweisungen bedeutet ':=' eine Zuweisung: zuerst wird der Term rechts vom := berechnet, dann das Ergebnis an die Variable links vom := zugewiesen

In FUP kann man nicht eine Linie von einem Box-Ausgang zu einem Box-Eingang ziehen, da müssen Zwischenergebnisse in Variablen zwischengespeichert werden.

Die Formel
Minute_mm := (Sekunden / 60) MOD 60
( Ergebnis <--- Berechnungsformel )

wird so programmiert:
Sekunden / 60 ---> Zwischenergebnis ---> MOD 60 ---> Minute_mm
Code:
           +--------+
           | DIV_DI |
          -|EN      |
           |        |
#Sekunden--|IN1  [COLOR="#FF0000"]OUT|-#diTemp[/COLOR]     +--------+
           |        |             | MOD_DI |
       60--|IN2  ENO|-------------|EN      |
           +--------+             |        |
                         [COLOR="#FF0000"]#diTemp--|IN1[/COLOR]  [COLOR="#00CC00"]OUT|-[/COLOR][COLOR="#0000FF"]#Minute_mm[/COLOR]
                                  |        |
                              60--|IN2  ENO|-
                                  +--------+
 
Hallo Harald,

ich habe gerade probiert es Funktioniert. :) Bei Minuten Anzeige steht als Sekundenwert, das war sinn von Aufgabe gewesen oder?
 
Sinn der Aufgabe war, daß nur die Sekunden in nur eine Gesamtzeitdauer-Variable gezählt werden, und man trotzdem die Zeitdauer als hh:mm:ss anzeigen kann.
In der ersten Aufgabe wurden die Sekunden und Minuten und Stunden getrennt in eigenen Variablen gezählt, und die vergangene Gesamtzeitdauer müsste man aus diesen 3 Teilen berechnen. Diese Aufgabe vom Dozent benötigt mehr Programmaufwand für trotzdem nicht mehr Nutzen als die "Zusatzaufgabe". Hier kann man sehen, daß es für die Programmgröße entscheidend sein kann, welchen Lösungsweg man wählt.

Bei Minuten Anzeige steht als Sekundenwert, das war sinn von Aufgabe gewesen oder?
Wie meinst Du das?

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
ok, aber bei PlCSim also minuten anzeige ist sekundenwert anzeigt also 35 min. --->2100s das ist ok oder? . Ich warte jetzt 3600s da muss 1 h anzeigen oder 3600s.

Danke sehr das hatmir viel geholfen, diese Information und Lösungen werde ich speichern falls das benötige.

Ersoy_78
 
ok, aber bei PlCSim also minuten anzeige ist sekundenwert anzeigt also 35 min. --->2100s das ist ok oder?
Hast Du vielleicht MD40 und MD48 verwechselt?
2100 s = 35 min
Bei mir arbeitet das Programm korrekt. siehe Bild

Ich warte jetzt 3600s da muss 1 h anzeigen oder 3600s.
Du musst nicht warten, Du kannst auch der Sekundenzähler-Variable zum Test direkt einen Wert zuweisen: mit der Variablenbeobachtungstabelle "steuern"
Wenn Du beim Aufruf des FB300 "Sekunden" mit MD36 beschaltet hast, dann mußt Du MD36 steuern.
Das Programm muß sofort mit diesem Sekundenwert neue Stunde_hh/Minute_mm/Sekunde_ss berechnen. (Das Programm kannst Du wie einen Sekundenumrechner benutzen)
Beispiel: 86398 Sekunden entspricht 23:59:58 (hh:mm:ss) und soll deshalb ergeben:
Stunde hh = 23
Minute mm = 59
Sekund. ss = 58
siehe Bild

PS: in dieser Zusatzaufgabe haben wir das Reset des Sekundenzählers vergessen. Das könntest Du noch programmieren.

Harald
 

Anhänge

  • Beobachten_Sekundenzähler.png
    Beobachten_Sekundenzähler.png
    19,8 KB · Aufrufe: 4
Also Stunde anzeige bei MD44 wenn 3600s komt steht 1 und bei minuten wenn 60s ist dann steht 60 aber da muss 1 stehen.

Ich habe MD 40 und Md 48 getauscht und das ist selber.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Dann suche mal (ganz praxisgerecht :) ) den Fehler - sowas gehört auch regelmäßig zur Arbeit eines SPS-Programmierers.
Vergleiche nochmal ganz genau Dein Programm mit den hier herumliegenden Programmschnippseln und/oder versuche den Fehler durch Beobachten und Logik zu finden.

Harald
 
Hallo Harald,

ich habe die Variabeltabelle auch gegeben und die wert bei sekunden also L#86398 eingegeben, leider hat nicht geklappt.
 
sorry jetzt habe gefunden ich habe bei netzwerk MULT_DI genommen nicht MOD_DI das ist meine fehler :)

Jetzt muss ich reset programmieren
 
Zuviel Werbung?
-> Hier kostenlos registrieren
ich habe die Variabeltabelle auch gegeben und die wert bei sekunden also L#86398 eingegeben, leider hat nicht geklappt.
In Beitrag #50 hatte ich geschrieben:
Wenn Du beim Aufruf des FB300 "Sekunden" mit MD36 beschaltet hast, dann mußt Du MD36 steuern.
Nur wenn beim Aufruf des FB300 der IN_OUT-Eingang "Sekunden" nicht beschaltet ist, dann kann man den steuern. Wenn er mit einer Variable beschaltet ist dann muß man diese Variable steuern (MD36 ?), weil beim Aufruf wird der Wert aus der Variable in den Eingang "Sekunden" kopiert (und überschreibt den Wert, der da drin steht!) und nach Ende des FB300 wird der Wert aus "Sekunden" zurück in die angeschaltete Variable kopiert.

Harald
 
Zurück
Oben