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: Taster entprellen und kleinigkeiten... Kategorie: C-Control I V1.1 (von Achim - 10.04.2005 19:10)
 Als Antwort auf Re: Taster entprellen und kleinigkeiten... von Achim - 10.04.2005 19:01
Und hier noch die hoffentlich unvermurkste Version:

> Problem1:
> Wenn ich an der Station eine der F-Tasten betätige wird ständig an/aus geschaltet... wie kann ich das unterbinden ?

Mit entsprechender Programmlogik. Im Moment macht Dein Programm ja auszugsweise das:

#loop

Wenn F1 gedrückt, dann wechsele Pumpenstatus von an nach aus und umgekehrt

goto loop

Wenn dann F1, wie zu erwarten, länger als den Bruchteil einer Sekunde gedrückt gehalt wird, klackert's, bis F1 wieder losgelassen wird. Mit Entprellen hat das nichts zu tun. Du musst Dir also merken, dass Du Fx erkannt und das entsprechende veranlasst hast, bis die Taste wieder losgelassen wurde, also skizziert, ungetestet ungefähr so.

define F1gedrueckt bit[192]
define F2gedrueckt bit[191]
define F3gedrueckt bit[190]
define F4gedrueckt bit[189]

#loop
...
if F1 then F1gedrueckt = OFF ' F1 losgelassen merken

if F1 or F1gedrueckt then goto NotF1 ' F1 neu gedrueckt?
  ' ja
  F1gedrueckt = ON ' F1 gedrueckt merken
  tog Pumpe ' Zustandswechsel nur einmal, bis F1 wieder losgelassen
  wait 1 ' Taste entprellen
#NotF1

...
goto loop


> Problem2:
> Wenn ich möchte das sich die Station mit dem DCF-Modul die Zeit selbst holt und ich das nicht immer
> im Programm vorgeben muss. Allerdings weiß ich nicht wie ich das im Programm umsetzen muss.

Das geht automatisch. Du siehst am DCF-Lämpchen, wann er sychronisiert hat. Ich warte in meinem Progrämmle beim Start so darauf:

#dcfloop

if (ccstatus and 1) then goto dcfok
...
goto dcfloop

#dcfok
...

mit ccstatus aus der FAQ abgeschrieben.

'##########################
'
' Mit dem untenstehenden Programm kann das C-Control-Statusregister
' abgefragt werden. Das Register liegt an Adresse $7b und enthält zwei
' Bits, die zu diesem Zweck von Interesse sind: Bit 0 gibt an, ob in
' diesem Moment ein gültiges Zeitsignal empfangen wird und Bit 4 ist
' gesetzt, wenn die C-Control-Systemzeit wenigstens einmal vom
' DCF77-Signal oder über die RS232-Schnittstelle gestellt wurde. Wenn
' nur Bit 4 gesetzt ist, kann davon ausgegangen werden, daß die
' Systemzeit die richtige Ortszeit enthält (wenn auch eventuell mit
' einigen Sekunden Abweichung).
'
' if (ccstatus and 1) then print "Es wird augenblicklich ein gueltiges DCF77-Signal empfangen
' if (ccstatus and 16) then print "Die Systemzeit wurde mindestens einmal gestellt
' if (ccstatus and 32) then print "Der Slowmodus ist aktiv."

#ccstatus
  table ccstatustab
      2938 '11*256+$7b-1
  tabend
return


Damit mir das Warten nicht zu lang wird, gebe ich jede Sekunde an den ggf. angeschlossenen PC eine Meldung aus und lasse LED3 und LED4 im Halbsekunden-Rythmus blinken:

#dcfloop

if (ccstatus and 1) then goto dcfok

 if second = oldsecond then goto BlinkLeds
   oldsecond = second

   gosub printdate
 #BlinkLeds

 'mal blinkend anzeigen, was abgeht
 pause 25 ' 0,5 Sekunden
 tog led3
 tog led4

goto dcfloop


> Problem3:
> Von Zeit zu Zeit fällt die Station einfach "aus" alle gespeicherten Daten sind dann weg...
> warum die Station ausfällt weiß ich leider nicht aber wie kann ich die Daten fest speichern auch wenn die SPS  mal ausfällt ? (Die Daten werden aööe 4 - 5 tage mit einem Excel-Programm ausgelesen)

Stromausfall? Du musst das close# öfter machen und dann "open# for append".Dabei gilt es aber zu beachten, dass die CC nur ca 10^6 close# abkann - also auch nicht zu oft.

> ...und hier das Prog was in der CCStation läuft...:

noch ein paar Anmerkungen ...
> If Pumpe1  = ON  then LED1 = ON
> If Pumpe1  = OFF then LED1 = OFF

Das kann man auch

LED1 = Pumpe1

schreiben
 
> if rxd then gosub loop12        'Kommandosignal vom Leitrechner abfragen
>
> #loop12
> get Kommando
> if Kommando = 27 then gosub Auslesen
>
> Gruppe = Kommando / 16
> on Gruppe gosub G0, G1, G2, G3, G4, G5
> goto Loop           'Endlosschleife

Wenn Du mit gosub in loop12 reinspringst, musst Du auch mit return wieder raus. Ansonsten geht nach dem 4. Mal keines der anderen gosub/returns mehr gut.

> ' Copyright by Björn Riemer 1999 - 2009

Sehr vorrausschauend ... ;-)

HTH

Bye
 Achim


 Antwort schreiben

Bisherige Antworten: