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

 Nachtabsenkung

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“

nach_oben

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

nach_oben

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.5) Einfache Schaltuhr

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 

Kostenlose Zähler und Statistiken für Ihre Website bei www.motigo.com