Das Open-Control-Projekt - Die Alternative zur C-Control-I


Das Forum zur C-Control-1
Welche C-Control-Varianten existieren?
Übersicht - Suchen - Neueste 50 Beiträge - Neuer Beitrag - Login - Registrieren
INFO - FAQ - CC2-Forum - CCPro-Forum 

 Re: Zeitschleife programmieren Kategorie: Open-Micro/Open-Mini/Open-Midi/Open-Macro/Open-Maxi (von laika63 - 26.10.2009 9:18)
 Als Antwort auf Zeitschleife programmieren von Max - 25.10.2009 19:20
laika63 nutzt:  CC1-Unit V1.1
Hallo,

ich habe es etwas aufwendiger gemacht. Ich habe mehrere ineinander geschachtelte Zyklen konstruiert:
Schneller Zyklus -> Sekundenzyklus -> Minutenzyklus -> Stundenzyklus -> Tageszyklus

'       Anlaufteil
'           |<----------------------------------------+
'       Tagesbearbeitung                              |
'           |<-------------------------------------+  |
'       Stundenbearbeitung                         |  |
'           |<----------------------------------+  |  |
'       Minutenbearbeitung                      |  |  |
'           |<-------------------------------+  |  |  |
'       Sekundenbearbeitung                  |  |  |  |
'           |                                |  |  |  |
'       aktuelle_sekunde = second            |  |  |  |
'           |<----------------------------+  |  |  |  |
'       Schneller Zyklus fĂŒr PC-Eingaben  |  |  |  |  |
'           |                             |  |  |  |  |
'       aktuelle_sekunde = second? -- J --+  |  |  |  |
'           | N                              |  |  |  |
'       second >= 0? -- N -------------------+  |  |  |
'           | J                                 |  |  |
'       minute >= 0? -- N ----------------------+  |  |
'           | J                                    |  |
'       hour >= 0? ---- N -------------------------+  |
'           | J                                       |
'       Tagesbearbeitung 0:00 Uhr                     |
'           |                                         |
'           +-----------------------------------------+

UrsprĂŒnglich hatte ich das ĂŒber einen 'pause'-Befehl von einer Sekunde gemacht: 'pause 50'. Das hat den Nachteil, dass bei Bedienungen vom PC aus u.U. 1 sek Totzeit auftritt. Außerdem ist das Programm gelegentlich (selten) undefiniert ausgestiegen, warum ist mir bis heute nicht klar - nur Neustart schaffte Abhilfe.
Dann habe ich auf die vorgenannte Struktur umgestellt, auf eine Abfrage der Echtzeituhr, mit einem schnellen Zyklus, der mit ca. 75 Hz lÀuft. Seitdem, 2 Jahre, lÀuft es enwandfrei, auf PC- und andere Eingaben reagiert das Programm praktisch sofort, die Zyklen sind exakt auf die Echtzeituhr synchronisiert.

Hier der (fast) vollstÀndige Code:

b1_i1, letzte_sekunde usw. sind Bytevariablen.

'----------------------------------------------------------------------------------------
   'Minuten-, Stunden-, Tageswechsel bearbeiten
   '----------------------------------------------------------------------------------------

   'ACHTUNG:
   'Die Uhrzeit lĂ€uft in der MC-Hardware unabhĂ€ngig vom Programm,
   'daher nicht auf 'second = 0', 'minute = 0', 'hour = 0' prĂŒfen, da
   'diese Werte ĂŒbersprungen werden können.
   'Das wurde in div. Testreihen festgestellt, 2 - 3 mal am Tag war
   'minute = letzte_minute oder minute = letzte_minute + 2, im zweiten Fall
   'ist also ein Minutenwert ĂŒbersprungen worden. Die Stundenbearbeitung wĂŒrde
   'dann ausfallen, u. U. auch die Tagesbearbeitung.

   'WEITERHIN:
   'Die Zeitwerte dĂŒrfen nur genau einmal gelesen werden, da diese sich zwischen zwei
   'LesevorgĂ€ngen Ă€ndern können: letzte_sekunde = 58, second = 59, die Abfrage
   'ergibt noch keine "Sekundenbearbeitung", genau danach wechselt second = 0,
   'wenn jetzt letzte_sekunde = second gesetzt wird, wird das nĂ€chste Mal
   'letzte_sekunde = 0 mit second = 1 verglichen ... die Minutenbearbeitung
   'fĂ€llt wieder aus. Wenn das die minute = 0 ist, fĂ€llt auch die
   'Stundenbearbeitung aus usw.
   'Minuten-, Stunden- oder Tagesbearbeitung dĂŒrfen aber auf keinen Fall
   'ausfallen, da davon alle Steuerungen abhĂ€ngen.

   'WENN nicht Minutenwechsel, dann nĂ€chster Sekundenzyklus ...
   b1_i1 = second
   b2_i1 = letzte_sekunde
   letzte_sekunde = b1_i1
   if b1_i1 >= b2_i1 then goto sekunden_bearbeitung '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
   '----------------------------------------------------------------------------------------

   '... SONST in die Minutenbearbeitung, WENN nicht Stundenwechsel, dann nĂ€chster Minutenzyklus ...
   b1_i1 = minute
   b2_i1 = letzte_minute
   letzte_minute = b1_i1
   if b1_i1 >= b2_i1 then goto minuten_bearbeitung '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
   '----------------------------------------------------------------------------------------

   '... SONST in die Stundenbearbeitung, WENN nicht Tageswechsel, dann nĂ€chster Stundenzyklus, ...
   'Nach der Stundenbearbeitung lĂ€uft automatisch auch die Minutenbearbeitung
   b1_i1 = hour
   b2_i1 = letzte_stunde
   letzte_stunde = b1_i1
   if b1_i1 >= b2_i1 then goto stunden_bearbeitung '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
   '----------------------------------------------------------------------------------------

   '... SONST in die Tagesbearbeitung.
   'Ein Teil ist hier ("Tagesbearbeitung 0:00 Uhr"), einer vorne nach dem Anlauf.
   'Der Teil hier soll NICHT nach einem Anlauf laufen!
   'Nach der Tagesbearbeitung laufen automatisch auch Stunden- und Minutenbearbeitung

   goto tages_bearbeitung  '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>


Wenn noch Fragen sind ...

Gruss
laika

 Antwort schreiben

Bisherige Antworten: