# Programmieren einer Uhr für Minuten und Sekunden



## bigrey (19 Oktober 2009)

*Beschreibung:*
Eine Uhr soll mit Hilfe von Zählern und Vergleichern programmiert werden, und die
Uhrzeit soll in Minuten und Sekunden auf einer 4-stelligen Anzeige zu sehen sein.
Der fertige Funktionsbaustein FB200 soll das multiplexen des 4-stelligen BCD Schalters übernehmen. Der FB200 soll im PB2 aufgerufen und parametriert werden.Der Sekundentakt soll im Programmbaustein 10 programmiert werden.
Die eigentliche Uhr soll im Programmbaustein 30 programmiert werden.​*Parameter:*
E0.0 = Uhr stellen (Die Zeit wird an EB2 vorgegeben)
E0.1 = Rückstellen der Uhr auf 00.00
E1.0 = Sekundentakt Ein
EB 2 =  Vorgabe Minuten und Sekunden (Multiplexbetrieb)
A4.0 = Sekundentakt
A5.0 = Multiplexausgang für höherwertiges Byte
A5.1 = Multiplexausgang für niederwertigeres Byte
AB 6 = Anzeige Minuten​AB 7 = Anzeige Sekunden

Kann mir bitte jemand helfen ich weiss einfach nicht weiter =((


----------



## Gebs (19 Oktober 2009)

Hallo bigrey,

Du machst noch ne Schulung auf S5???

Aber nun zu Deinem Problem:
Den PB 10 rufst Du in einem Zeit-OB auf und bildest da einen Sekundenimpuls.
(1 sek. lang 1, 1 sek. lang 0)

Im PB 30 zählst Du dann mit pos. und neg. Flanke einen Zähler hoch.
Ist der Zähler = 59 zählst Du einen zweiten Zähler hoch und setzt den Ersten zurück.
Dann hast Du schon Deine Minuten und Sekunden.

Uhr stellen geht mit "S Z".

Zum Multiplexen hilft Dir vllt. das weiter:
http://www.mikrocontroller.net/articles/Multiplexen

Grüße
Gebs


----------



## bigrey (19 Oktober 2009)

danke für deine schnelle Antwort 
ne bin schon bei S7 =))
Das mit dem Multiplexen brauch ich nicht...
Fehler von mir...
Sorry =)


----------



## online (19 Oktober 2009)

Welche S7 Steuerung? Die meisten S7 Steuerungen haben eine Uhr.


----------



## vierlagig (19 Oktober 2009)

online schrieb:


> Welche S7 Steuerung? Die meisten S7 Steuerungen haben eine Uhr.



und kaum noch PBs ...


----------



## Lars Weiß (19 Oktober 2009)

vierlagig schrieb:


> und kaum noch PBs ...



Die sind versteckt


----------



## bigrey (19 Oktober 2009)

also ich checks trotzdem nicht 
ausführliche erklärung bitte^^


----------



## Gebs (19 Oktober 2009)

Was checkst Du nicht?

Weshalb wir ne S5 vermutet haben?
In der Aufgabenstellung ist von PB's die rede. Die gabs in der S5. In der S7 gibt es keine mehr.


----------



## Larry Laffer (19 Oktober 2009)

... als Ergänzung zum Beitrag von Gebs :

Es kommt immer gut, wenn man selbst schon mal mit etwas angefangen hat und seine Frage konkret auch eine Einzelproblemstellung beziehen kann. Das vor Allem bezogen auf die bereits schon gemachte Arbeit (schon erstellter Code).

Gruß
LL


----------



## bigrey (19 Oktober 2009)

hab doch oben geschrieben das ich das multiplexen nicht brauche weil ich ne s7 benutze =)))
hab jetzt schon den sekundentakt nur versteh ich des mit dem BCD nicht wirklich und E=0.0 Uhr stellen weiss ich nicht wie ich des programmieren könnte


----------



## Gebs (19 Oktober 2009)

Hallo bigrey,

das Multiplexen ist unabhängig von der eingesetzten SPS!
Da Du für das Uhrzeitstellen nur ein Byte (EB2) zur verfügung hast, musst Du
wohl oder übel multiplexen, denn für Minuten und Sekunden brauchst Du jeweils ein Byte!
Zum BCD: BCD ist eine Art Zahlen darzustellen. Schau mal hier:
http://de.wikipedia.org/wiki/BCD-Code

Zum Uhrzeitstellen:

```
U E0.0 // Soll Zeit gestellt werden?
SPBN WEIT // Nein, dann weiter
L EB2 // Stellwert Min. oder Sek.
S Z 1 // Stellwert an Zähler übergeben
WEIT: NOP 0
```

Der Code soll nur eine Denkhilfe sein!!!

Grüße
Gebs


----------



## bigrey (19 Oktober 2009)

mir fehlt nur noch die uhr stellen 
alles andere hab ich soweit...
kann mir da jemand helfen bitte =))

jetzt mal zu dem was ich schon gemacht habe 

```
U     M    100.5
      ZV    Z      1
      NOP   0
      U     "Rückstellen auf 0.00 Uhr"
      L     C#0
      S     Z      1
      U     M      2.0
      R     Z      1
      L     Z      1
      T     MW     1
      NOP   0
      NOP   0
```
 


```
L     MW     1
      L     60
      ==I   
      =     L      0.0
      U     L      0.0
      ZV    Z      2
      NOP   0
      U     "Rückstellen auf 0.00 Uhr"
      L     C#0
      S     Z      2
      NOP   0
      L     Z      2
      T     MW     2
      NOP   0
      NOP   0
      U     L      0.0
      BLD   102
      =     M      2.0
```
 



```
L     MW     2
      L     60
      ==I   
      =     L      0.0
      U     L      0.0
      ZV    Z      3
      NOP   0
      U     "Rückstellen auf 0.00 Uhr"
      L     C#0
      S     Z      3
      U     M      4.1
      R     Z      3
      L     Z      3
      T     MW     3
      NOP   0
      NOP   0
      U     L      0.0
      BLD   102
      =     M      4.0
```
 


```
L     MW     3
      L     24
      ==I   
      =     M      4.1
```


----------



## Larry Laffer (19 Oktober 2009)

Also denn ...

Wenn man mal von den verwendeten Merkerworten absieht ist das Ergebnis schon ganz passabel ...
MW1 benutzt die MB's 1 und 2
MW2 benutzt die MB's 2 und 3
MW3 benutzt die MB's 3 und 4
usw.
Fällt dir da etwas auf ?

Um die "Uhr" zu stellen müßtest du die gleiche Funktion verwenden, die du nimmst um die Uhr auf 0:00 Uhr zu stellen. Du lädst dann halt nur nicht 0 ind die Zähler sondern den gewünschten Stunden-, Minuten- und/oder Sekundenwert. Das könntest du z.B. so lösen indem du den jeweiligen Wert zunächst in Hilfs-MW's schreibst un die dann auf die Zähler lädst und statt die Funktion "Uhr auf 0:00 stellen" zu nennen nennst du sie dann einfach "Uhr stellen".

Ach ja ... Vergleiche macht man besser auf >= statt auf == ...

Kommst du damit etwas weiter ?

Gruß
LL


----------



## bigrey (20 Oktober 2009)

hat mir geholfen danke =))
nur weiss ich nicht was du mit den MW´s meinst...
kannst mir des noch kurz erklären? wäre sehr nett
danke im Vorraus


----------



## vierlagig (20 Oktober 2009)

bigrey schrieb:


> nur weiss ich nicht was du mit den MW´s meinst...



ich nehm mal eine alte erklärung her, ist zwar für doppelwort, aber vielleicht verstehst du es ja trotzdem



vierlagig schrieb:


> MD 1 ist ein Doppelwort, bestehend aus MW 1 und MW 3, diese Worte bestehen aus jeweils zwei Byte, MW 1 aus MB 1 und MB 2, MW 3 aus MB 3 und MB 4, diese 4 Bytes bestehen aus je 8 Bit also von M1.0 bis M4.7 ...
> 
> btw: achtung! persönliche meinung: bytes, wörter und doppelwörter adressier ich gern mit durch 2 dividierbaren zahlen, macht es IMHO übersichtlicher


----------



## online (20 Oktober 2009)

Sieht so aus als ob er doch noch bei S5 ist, oder zumindest die Unterlagen dazu hat. Er hat nur aus den Datenwörtern (Bei S5 noch 2Byte lang!) Merkerwörter gemacht. Klappt natürlich nicht!


----------



## crash (20 Oktober 2009)

Was vierlagig sagen will...


```
|----------------MD0----------------|
|-------MW0-------|-------MW2-------|
|--MB0---|--MB1---|--MB2---|--MB3---|
|M0.0-0.7|M1.0-1.7|M2.0-2.7|M3.0-3.7|
```


----------



## bigrey (20 Oktober 2009)

unterlagen von s5 hab ich ja^^
aber mit s7 programmier ich =) zumindestens versuch ich es


----------



## vierlagig (20 Oktober 2009)

bigrey schrieb:


> unterlagen von s5 hab ich ja^^
> aber mit s7 programmier ich =) zumindestens versuch ich es



besorg dir mal die S7 ausbildungsunterlagen


----------



## Larry Laffer (20 Oktober 2009)

bigrey schrieb:


> hat mir geholfen danke =))
> nur weiss ich nicht was du mit den MW´s meinst...
> kannst mir des noch kurz erklären? wäre sehr nett
> danke im Vorraus


 
Anscheinend habe ich dir nicht wirklich geholfen ... 
Sieh dir doch bitte mal die Zuordnung von Crash an. Da wird das mit den MW's und MB's und den Merkern m.E. schön dargestellt.
Es gibt was das angeht auch übrigens KEINEN Unterschied zwischen S5 und S7 - das war bei der S5 auch so. Vielleicht solltest du dich mit dem Thema der Speicher-Zuordnung (am Beispiel des Merkerbereichs) noch einmal ein BISSCHEN beschäftigen. Das hilft dann auch bei der Erstellung von Programmen. 

Gruß
LL


----------



## online (20 Oktober 2009)

Nochmal zum verständniss:
Datenwörter werden in Step 5 Wortadressiert, in Step 7 jedoch Byteadressiert!!!

Beispiel:
Step 5: Step7:
DW0     DBW0
DW1     DBW2
DW2     DBW4
DW3     DBW6
. .
Merkerworte bei beiden Wortadressiert!


----------



## Larry Laffer (20 Oktober 2009)

online schrieb:


> Nochmal zum verständniss:
> . .
> Merkerworte bei beiden Wortadressiert!


Schön geschreiben ... aber *falsch* 

Bei Merkern, Eingängen und Ausgängen wird bei beiden Steuerungen die *Byte*-Adresse als *Basis* genommen. Das heißt z.B. das das MW1 die MB's 1 und 2 beinhaltet und das das MD1 dann gleich die MB's 1 bis 4 beinhaltet und natürlich entsprechend die MW's 1 bis 4 - das Alles wegen der Überlappung der Adress-Bereiche. Siehe hierzu auf jeden Fall die Darstellung im Beitrag von Crash !!!


----------



## online (20 Oktober 2009)

Klar, geschrieben ohne richtig zu überlegen, oben steht es doch richtig.


----------



## maxi (22 Oktober 2009)

Hallo, habe es mir mal angesehen.
Schriebe dir auf die schnelle wie ich es flink rein gehackt hätte.
Hoffe ist dir hilfreich.
Würde der zwingend bei den Impulesen und falls du möchtest bei den Schaltern die Flanken anraten.

M100.4 Zeitimpuls ist richtig. Du brauchst einen 1hz takt.


```
U     M    100.5 //[COLOR=red][B](Richtg!, 1hz, nicht 1s Impuls)[/B][/COLOR]
[B][COLOR=#ff0000]FP M 150.0 //(Flanke Positiv)[/COLOR][/B]
      ZV    Z      1
 
 
SET
      U     "Rückstellen auf 0.00 Uhr"
    FP M 150.1 //(Flanke Positiv)
      R    Z      1
 R Z 2
 
// Nun in MW kopieren, da wir sonst nicht rechnen können.
 
SET
 
L Z 1
T AW 10 //[COLOR=red][B](Wort benötigt immer 2 Byte, hier Adresse 10 und 11)[/B][/COLOR]
 
L Z 2 
T AW 12
 
// Minutenzähler um 1 hoch
 L     AW     10 
      L     60
      ==I   
SPBN N001 // (Nehme mal sprünge, dann kannst du hier auch Ladeoptionen hinein setzten)
// SPBN Bedeutet Springe Bedingt Nicht, also wenn der VKE auf 1 wird das nachfolgende abgearbeitet)
ZV Z 2
R Z 1
 
N001: Nop 0
 
// Minutenzähler Abfragen
 L     AW     12 // 
      L     60
      ==I   
SPBN N003
 
 
R Z 2
 
N002: Nop 0
 
 
SET
U E " Umkopieren"
FP M150.2
SPBN N004
 
L EW 10 //(Hier dein richtiges EW einstellen)
T Z 1 //(Das müsstest  du nun testen ob er den Wert so übernimmt oder umwandeln erforderlich ist)
 
L EW 12 //(Hier dein richtiges EW einstellen)
T T 2 //(Das müsstest  du nun testen ob er den Wert so übernimmt)
 
N004: Nop0
```


----------

