5. Softwarebausteine Teil 1 (Grundlagen) (Stand: 16.1.2008)
Zeittakte mit Uhrzeit und TIMER, Wartezeit, Funk-Uhr siehe Tipps
Temperaturmessung Messwertdämpfung MIN MAX und LCD-Ausgabe
Schrittsteuerung_mit_Wartezeiten für Ein- und Ausschaltvezögerung
Einschaltdauer_und_Pausendauer Betriebszeit messen
Softwarebausteine Teil 5.1.5 Schaltuhren
Einfache Zeitschaltuhr, Wochen-Schaltuhr mit Schaltzeiten je Wochentag (Montag bis Sonntag)
Schaltuhr
mit Startzeit und Zeitbegrenzung, Schaltuhr mit variabler Startzeit NEU
Tages-Schaltuhr mit Datum z.B. Heizung nach
dem Urlaub starten NEU
Weiter zu Softwarebausteine_Teil_2
Port-Erweiterung mit I2C-Bus PCF... Station V1.1 an Ports unveränderte
Station
LCD, Temperatur-Sensor DS 1631,
I2C-Bausteine (Assembler) NEU
Weiter zu Softwarebausteine_Teil_3
Variable
in RAM-Zelle, freie Bytes nutzen NEU mit RANDOMIZE
EEPROM Variable, einfache
oder komfortable Lösung
Werte remanent speichern, einzelne Variable,
gepackte Variable, Schieberegister byte und word
Beispiele:
Betriebsstunden je Tag, je Woche oder je
Monat, Daten komprimieren
Weiter zu Softwarebausteine_Teil_4
Bildschirm-Bedienung mit PC, Bedienmenue und Anzeige
Tastatatur mit LED-Quittung der Station,
LED und LCD –Anzeigen des IO-Terminals
Einbindung Treiber IO-Teminal
Tastatur , Methode der Fehleranalyse und Fehlerbeseitigung
LCD-Anzeige Applikationsboard mit Software Tastatur-Test und LCD
Fertige Programme: Tastatur, Zeichenvorrat LCD, byte , word, HEX-Zahl, ASCII ,
Relais schalten, Schrittsteuerung mit Wartezeit, Text- und Zahlenausgabe
Es
gibt nur einfache Lösungen. Einziges Problem:
Man muss sie finden.
(Robert M. Pirsig, amerik.
Schriftsteller)
5.1.0)
Define allgemein Zeitimpulse
siehe Tipps
define Wert12 word[4] ' = Byte 7,8 Zwischenspeicher
define wert1 byte [7] ' Zwischenspeicher
define wert1Bit0 Bit [49] ' für Bit-Handling des byte
wert1
define wert1Bit1 Bit [50]
define wert1Bit2 Bit [51]
define Bit81_88 byte [11] ' >>(Bit 81 bis 88)<<
define
FlankeMinpuls Bit [81] ' Flankenbit
für Minuten-Takt
define
FlankeSekpuls Bit [82] ' Flankenbit
für 4-Sek-Takt
define Sekpuls Bit [83] ' Bit 4-Sekunden Impuls
define Sek16puls Bit
[84] ' Bit
Impuls (viermal je Minute)
define Minpuls Bit [85] ' Bit Impuls (einmal je Minute)
define HalbMinpuls Bit [86]
' Bit Impuls (zweimal je Minute)
define ZweiMinpuls Bit
[87] ' Bit
Impuls (einmal je zwei Minuten)
define Wartezeit byte [ ]
'
define Schritt byte [
] '
5.1.1 *** Temperaturmessung und
Normierung ***
(1)
Allgemein
Der Sensor wird über einen Messumformer an den Analogport
AD (Analog-Digital-Wandler) angeschlossen.
Beispiel: Bei - 20 bis
+30 Grad liefert der Messumformer 0 bis 2,5 Volt, die in der c-control in eine
Zahl 0 bis 250 gewandelt werden.
Linearer Zusammenhang zwischen Temperatur und Analogwert
soll in diesem Beispiel vorliegen.
Im Programm muss nun mit einer Formel umgerechnet werden,
wobei –20 Grad dem Zahlenwert 0 entspricht.
Die Spanne – 20 bis +30 beträgt 50
Grad und entspricht dem Zahlenwert 250.
Define T1 AD [1] '
Anschluss Messumformer (z.B. 0 bis 2,55 V entspricht Zahl 0 bis 255)
Define Istwert word
Istwert = T1 / 5 – 20 '
Kontrolle: 250 / 5 – 20 = +30 Grad bzw. 0 / 5 – 20 = - 20 Grad
(2)
Station V1.1
Die Temperaturmessung erfolgt über die fertig
angeschlossenen Sensoren AD592 an Klemmen T1 bzw. T2.
Schwankende Messwerte entstehen durch Störeinstreuung, die
man verhindert bzw. ableitet, indem
Ground „geerdet“ wird. Dabei schließt man Ground z.B. an den
Potenzialausgleich oder an die Wasserleitung oder an das Heizungsrohr.
Jeder Sensor liefert mit der internen Schaltung
(Messumformer) in der Station den Wert von 0 bis 255.
Dies entspricht -50 bis 205 halbe
Grade oder -25 bis 102,5 Grad.
Define T1 AD [5] '
T1-Anschluss Sensor AD 592 (der interne Messumformer erzeugt die Zahl 0 bis
255)
Define wert12 word ' Zwischenspeicher für Istwert
Die Formel für den Messwert T1 lautet:
wert12 = T1 / 2
- 25 ' Zwischenspeicher (T1= -25 bis 102,5 Grad)
Istwert als -25 bis 102 Grad
PC-Anzeige: print “Istwert“;wert12;
' Istwert liegt fertig für die Anzeige
vor.
Bei Ausgabe mit Kommastelle:
wert12 = T1-50 ' (T1= -25 bis 102,5 Grad) Istwert als -50 bis 205 halbe
Grad
PC-Anzeige: print “Istwert “;wert12 / 2;“,“;wert12 MOD 2*5;
(3) Lösung mit GOSUB (das
Beispiel ist auf positive Temperatur begrenzt)
Anstelle der
Variablen Istwert1 benutzt man Zwischenspeicher und verwendet eine Unterroutine
mit dem Befehl GOSUB.
Nur die Vorkommastellen:
GOSUB T1 ' (T1= -25 bis
102,5 Grad) Istwert liegt im Zwischenspeicher Wert1
Möchte man Vor- und Nachkommastelle bereitlegen:
GOSUB T1K ' (T1= -25 bis 102,5 Grad) Istwert liegt im Zwischenspeicher
Wert1 und die Nachkommastelle in Wert2
Bei den
zugehörigen Unterprogrammen ist zu beachten, dass T1K (wert2) den Teil T1
(wert1) auch bearbeitet:
#T1K ' --> wert1
Grad , wert2 Kommastelle
wert2 = (T1-50)
MOD 2*5 ' Kommastelle zu T1 (halbe Grad)
#T1 ' --> wert1
Grad
Wert1 = T1/2-25
: RETURN ' (T1= -25 bis 102,5 Grad) Istwert
als Grad
(4) Lösung mit Pseudo-Variable (das Beispiel ist auf
positive Temperatur begrenzt)
Anstelle einer Variablen
benutzt man den Rechenwert einer Pseudo-Variablen.
Dies hat den Vorteil, dass man keine
der wenigen Variablen belegt, aber trotzdem den Namen wie bei einer Variablen
benennen kann.
Define T1 AD[5] ' Temperatursensor 1
Define Sollwert byte ' „echte“ Variable
#VorlaufTemp RETURN (T1 – 50) / 2 ' Pseudo-Variable liefert den Rechenwert
#VorlaufTKomma RETURN
(5 * T1 - 250) MOD 10 ' Kommastelle zu T1 (halbe Grad)
Programm
If
VorlaufTemp > Sollwert then ........
' Dadurch ist das Programm leicht lesbar.
Mit der
Pseudo-Variablen kann man auch wie mit einer Variablen rechnen z.B.
beträgt die Soll-Ist-Differenz:
Differenz = Sollwert – VorlaufTemp
(5)
Messwertberuhigung
(Dämpfung)
(T1 – 50) ist der Messwert in halben Graden. Bei jedem Programmlauf wird er zum Mittelwert addiert und anschließend wird der Mittelwert um ¼ reduziert. Hierdurch entsteht ein gleitender Mittelwert bestehend aus 4 Messwerten.
Mittelwert = Mittelwert + (T1 - 50) –
Mittelwert /4 ' 4 Messwerte halbe Grade
Für Ausgabe z.B. wert12 = Mittelwert
/ 8 ' gleichzeitig wird hier aus halbe Grade der Mittelwert Grad
(Vorkomma)
(6)
Max- und
Min-Temperatur erfassen
MaxTemp = MAX (MaxTemp , Istwert)
MinTemp = MIN (MinTemp , Istwert)
Rücksetzen
MaxTemp = Istwert
MinTemp = Istwert
(7)
Temperatur-Ausgabe für
LCD-Anzeige (auch Minus-Temperaturen)
Wert12 = Istwert bzw. wert12 = MaxTemp bzw.
wert12 = MinTemp
if wert12 < 0 then gosub Minus else gosub space ' Minus bzw. Leerzeichen ausgeben
wert12 = abs (wert12) ' Durch den
Befehl abs (absolut) wird negative Zahl zur positiven Zahl umgeformt.
Trennung der Zahl aus Beispiel (1) in Ziffern für die LCD-Ausgabe
Zehnerstelle: wert12 = Istwert / 10
Einerstelle:
wert12 = Istwert MOD 10
Weiteres Ausgabeprogramm siehe Kapitel „Softwarebausteine Teil 4“
Negative Zahl in einem Byte siehe Kapitel „Tipps und Tricks“
5.1.2) *** Schrittsteuerung mit Wartezeiten ***
'Die Steuerung wird in Ablaufschritte
strukturiert.
Dies hat den Vorteil, dass vom Programm nur das
bearbeitet wird, was im eingeschalteten Steuerungsschritt programmiert ist.
In jedem Schritt kann
man frei entscheiden ohne die Funktion der anderen Schritte zu beeinflussen.
Die Programmteile der anderen Schritte
werden nicht durchlaufen und brauchen deshalb jetzt nicht beachtet zu werden.
In jedem Schritt kann eine Wartezeit gesetzt
werden, die rückwärts gegen Null läuft.
Während die Wartezeit läuft, wird in einem eigenen
Schrittregister gearbeitet, z.B. um die Wartezeit abzubrechen.
Nach Ablauf der Zeit oder Abbruch
wird der eingeschaltete Schritt bearbeitet.
(1) Zeitimpuls für Wartezeit (siehe auch Tipps Zeittakt 4 sec)
sekpuls =OFF' Reset Sekunden-Impuls nach einem
Programmdurchlauf
wert1 = second 'Uhrzeit
wird nach Byte geladen (Bit 2 wechselt alle 4 Sekunden)
if wert1Bit2 =
FlankeSekpuls then goto EndeSekpuls' wenn Wert1 Bit 2 gleich
Flankenmerker, dann „nichts tun“
FlankeSekpuls = wert1Bit2 ' andernfalls
Flankenmerker = Bitwert setzen
sekpuls = ON ' Aufrufbit alle 4 sec
#EndeSekpuls
(2) Temperaturmessung (siehe oben)
GOSUB T1 ' (Beispiel T1= 40 Grad) Istwert liegt im Zwischenspeicher
Wert1
(3) Schrittsteuerung
if
(Wartezeit = 0) then goto Schritt 'Wartezeit
abgelaufen? ja ---> geh zu Schritt
if
(sekpuls = OFF) then goto SchrittWartezeit
Wartezeit = Wartezeit -1 'Wartezeit minus 1 x 4 sek
#SchrittWartezeit '
Schrittregister bei Wartezeit läuft
if
(Schritt = 1) then goto Schritt1w ' Wartezeit
abbrechen?
Goto Ende12 '---->
(Geh zu Ende von Steuerungsabschnitt 5.12)
#Schritt1w 'Schritt 1
bei Wartezeit läuft
if
(Wert1 > 38) or (NachtSenkung = ON) then goto Ende12'
Istwert im Tagbereich größer Sollwert 38 Grad --->
wartezeit
= 0 ' Wartezeit abbrechen!
Goto
Ende12 '----------------------------------->>>
#Schritt '
Schrittregister bei Wartezeit NULL
if
(Schritt = 1) then goto Schritt1 ' Heizen
einschalten?
if
(Schritt = 2) then goto Schritt2 ' Pumpe ein,
Wartezeit
if
(Schritt = 3) then goto Schritt3 ' Heizen
einschalten
if
(Schritt = 4) then goto Schritt4 ' Heizen
ausschalten? Heizen aus
if
(Schritt = 5) then goto Schritt5 ' Pausendauer aus
if
(Schritt = 6) then goto Schritt6 ' Wartezeit bei
Nachtabsenkung
if (Schritt = 7) then goto Schritt6 ' Schritt 7 startet die Wartezeit noch mal in Schritt 6
Schritt = 1 ' Neustart der Ablaufkette (wird die Schrittabfrage durchlaufen, wird Schritt 1 gesetzt )
wartezeit = 10 'Einschaltverzögerung 10x4 sec, Wartezeit setzen
Goto Ende12 '----------------->>>
#Schritt1 ' Heizen einschalten?
if (Wert1 > Sollwert) then goto Ende12' Istwert größer als Sollwert ---- > nicht einschalten
Goto Schrittweiter ' dort wird die Schritt-Nr um 1 erhöht
#Schritt2 'Pumpe ein
K2 = ON ' Pumpe Ein (Relais K2)
Wartezeit = 7 'x 4 sec Wartezeit setzen
Goto Schrittweiter
#Schritt3 ' Heizen ein
K1 = ON ' (Brenner ein)
Wartezeit = 7'x4 sec Wartezeit setzen
Goto Schrittweiter
#Schritt4 ' Heizen ausschalten? Heizen aus
wert1 = Sollwert + 5 + SollDiff/20 ' Ausschaltwert (mindestens 5 Grad Differenz)
if (istwert1 / 2 < wert1) then goto Ende12' Istwert1 (halbe Grad) kleiner als Wert 1 ---- > nicht ausschalten
K1 = OFF 'Brenner Aus
Wartezeit = 30 'x4 sek Wartezeit setzen (für Lesen der Anzeige)
Goto Schrittweiter
#Schritt5 ' Zeitzähler PausenDauer (rück)setzen
PausenDauer = 4 ' 4 Halbminuten (Ersatz für Wartezeit Schritt 4)
Wartezeit = 15 'x4 sek Wartezeit setzen (=1 Minuten)
Goto Schrittweiter
#Schritt6 ' Nachtabsenkung
if (NachtSenkung = OFF) then goto Schrittweiter
Wartezeit = 255 'x4 sek Wartezeit setzen (17 Minuten)
K2 = OFF 'Pumpe aus
#Schrittweiter
Schritt = Schritt + 1 ' Schritt-Nummer um 1 erhöhen
#Ende12
5.1.3) Einschaltdauer und Pausendauer (Betriebszeit)
if
(K1 = OFF) or (HalbMinpuls = OFF) then goto Pause' HalbMinpuls, halbe Minuten
if (EinDauer > 254) then goto Ende13 ' Begrenzung (1 Byte), Zähler stoppt
EinDauer = EinDauer +1' halbe Minuten Zeitmessung Einschaltdauer Brenner
Goto
Ende13
#Pause
if (K1 = ON)or(HalbMinpuls =
OFF)then goto Ende13'
HalbMinpuls halbe Minuten
if (PausenDauer > 254) then goto Ende13 ' Begrenzung (1 Byte)
PausenDauer = PausenDauer +1 ' halbe Minuten Zeitmessung Pausendauer Brenner
#Ende13
5.1.4) Nachtabsenkung (siehe auch Tipps Gepackte Variable)
Mit Tastenbits von Hand-Tasten „Nachtabsenkung AUS“ (Sperre)
und „Nachtabsenkung EIN“ (vorzeitig).
Die Variable Nachtzeit = &H36 (HEX 36) liegt in einem Byte und bedeutet, dass die Nachtzeit von 3 Stunden vor Mitternacht bis 6 Uhr reicht.
Das Unterprogramm legt mit Hilfe einer Maskierung die Uhrzeiten in Zwischenwerte, damit sie im Hauptprogramm mit der aktuellen Uhrzeit verglichen werden können.
Unterprogramm
#Nachtzeit '
wert1 = 24 - Nachtzeit / 16 ' Nachtzeit geteilt durch 16 ergibt 3. Nachtbeginn also 21 Uhr
wert2 = Nachtzeit MOD 16 ' Nachtzeit geteilt durch 16 ergibt Rest 6. Nachtende 6 Uhr
return
Hauptprogramm
if year > 90 then goto Tagbereich ' Funkuhr noch nicht gestartet
Gosub Nachtzeit ' Nachzeit (z.B. 21 bis 6 Uhr) wird in Wert1 und Wert2 abgelegt
' if (hour >= 21) or (hour
<= 6) then goto Nachtbereich
if (Hour >= Wert1) or (Hour <=
Wert2) then goto Nachtbereich' Uhr
Nachtbereich ? ja -->
#Tagbereich
if NachtUhr = OFF then goto NachtHand
NachtUhr = OFF ' (gleichzeitig Flankenauswertung)
NachtAusHand = OFF ' Reset NachtabsenkungAusHand
NachtSenkung = OFF '
NachtAbsenkung Ende (Flankenauswertung)
' zusätzliche Optionen
Betriebszeit =0 : Brennerstarts = 0 ' Betriebstundenzähler und Brennerstarts Null setzen
Goto SollNachtEnde ' Sollwert setzen für Ende Nachtabsenkung
#Nachtbereich
NachtEinHand = OFF' Reset NachtEinHand, wenn Absenkung laut Uhr
NachtUhr = ON ' Nachtabsenkung laut Uhr
if NachtAusHand = ON then goto Sperre ' NachtabsenkungAusHand (Sperre)
if NachtSenkung = OFF then goto SollNachtAnfang
Goto Ende14
#Sperre
if NachtSenkung = OFF then goto Ende14
NachtSenkung = OFF ' NachtAbsenkung Ende (Flankenauswertung)
Goto SollNachtEnde ' Sollwert setzen für Ende Nachtabsenkung
#NachtHand ' Vorzeitige Nachtabsenkung von Hand ?
if (NachtAusHand = OFF) then goto TasteNachtEinHand ' Nachtabsenkung Sperre von Hand
if NachtSenkung = OFF then goto Ende14
NachtSenkung = OFF ' NachtAbsenkung Ende (Flankenauswertung)
Goto SollNachtEnde ' Sollwert setzen für Ende Nachtabsenkung
#TasteNachtEinHand
if (NachtEinHand = OFF) then goto Ende14 ' nein --> (keine Nachtabsenkung von Hand im Tagbereich)
if NachtSenkung = ON then goto Ende14
#SollNachtAnfang ' Sollwert setzen für Anfang Nachtabsenkung einmalig!
NachtSenkung = ON'
(gleichzeitig Flankenauswertung!)
' zusätzliche Optionen, Sollwert wird einmalig gesetzt
SollWert = 35 : SollDiff = 9
Goto NeuStart
#SollNachtEnde ' Sollwert setzen für Ende Nachtabsenkung einmalig!
' zusätzliche Optionen
SollWert = 45 ' Start,
Aus bei 54 Grad
SollDiff = 9
#NeuStart
schritt = 0 :Wartezeit = 0
#Ende14
weiter zu Schaltuhren
5.1.6)
Wochen-Schaltuhr
5.1.7) Schaltuhr
Startzeit und Zeitbegrenzung
(1) Einfache Schaltuhr mit einer Einschaltdauer im
Sekundenbereich
(2) Schaltuhr mit
Einschaltdauer wählbar im Sekunden- und Minutenbereich
5.1.8)
Schaltuhr Startzeit aktuelle Uhrzeit
(1) Schaltuhr für zeitgegrenztes Einschalten in Stunden und
Minuten
5.1.9)
Tages-Schaltuhr mit Datum
Beispiel: Die Heizung soll am Ende des Urlaubs automatisch einschalten, mit Bildschirm-Bedienung
------------------------------------- ENDE Softwarebausteine Teil 1 ------------ nach_oben
Fortsetzung Softwarebausteine_Teil_2 Startseite