3 Beschreibung der
Steuereinheit
3.1.1 Beschreibung der
Funktionen:
3.5 Temperatursensoren(-eingänge)
4 Kurzbeschreibung des
Ablaufes
Die vorliegende Steuerschaltung ist “Abfallprodukt” meiner Arbeitstätigkeit. Zusätzlich wurden noch einige Stunden privater Entwicklungszeit in diese Aufgabe gesteckt (derzeit ca. 30 Stunden). Vielen Dank meiner Frau für Ihre Geduld.
Für Folgen, die aus der Verwendung dieser Schaltung sowie Software resultieren übernimmt der Autor keinerlei Haftung. Das System wurde für eine spezielle Konfiguration der PK-Erwärmung entwickelt.
Änderungs- und Verbesserungsvorschläge sind immer willkommen (thomas.kohler@gmx.de).
Der verwendete Basic 2-IC der Fa. http://www.parallaxinc.com/ besitzt 16 frei konfigurierbare I/O und einen Anschluss für die Datenübertragung zum PC (RS232/Programmierung/debug).
Beschaltung der I/O:
·
serielle Datenübertragung zur LCD-Anzeige
- P0..Enable-Ausgang
- P1..Taktausgang
- P2..Datenausgang
- P3..Steuerausgang elt. Heizung Stufe 1
- P4..Steuerausgang elt. Heizung Stufe 2
- P5..Steuerausgang Umschaltventil/Freigabemeldung
- P6..Reserveausgang
- P7..Lebensbit (wechselt mit 0.25..0.5 Hz, wenn Abarbeitung korrekt läuft)
·
Freier
I/O
-
P8
·
Digitale Eingänge
- P9..Write/Speicheranforderung (schreiben der Messwerte in den EEPROM)
- P10..Anzeigewahl (wechselnde Anzeige; Anzeige T1; Anzeige T2; Anzeige T3)
- P11..SOLL_PK (Anforderung der Freigabe)
- P12..VDK (Rückmeldung der Stellung des Umschaltventils)
·
Digitale
Temperaturmesseingänge
-
P13..Temp3
(tH)
-
P14..Temp2
(tP)
-
P15..Temp1
(tt)
Das Programm ist Modular aufgebaut.
..ruft Initialisierung auf und läuft dann mit Endlosschleife durch
Dabei wird ein ZAEHLER (0..65535) hochgezählt, der zur Häufigkeit des Anzeigewechsels sowie Anzeigerefresh genutzt wird. Der PARAMETER gibt an, in welchem Anzeigestatus sich das Ganze befindet (0,1..Init; 2..T1;4..T2;8..T3). Diese Information wird je nach Inhalt des Speichers ANZEIGE hochgezählt oder gesetzt.
a)
In der IOVERWALTUNG
werden die Eingänge gelesen bzw. gesetzt. Diese Eingänge sind ANZEIGEWAHL,
SPEICHERANF, PULSIN_T1, PULSIN_T2, PULSIN_T3. Die Ausgänge sind U1_OUT, U2_OUT, MLD_OUT,
LIVE.
Das Unterprogramm VK4203VERWALTUNG bedient die Ausgänge der LCD-Anzeige.
b) Die VK4203VERWALTUNG stellt die Anzeigedaten zusammen (alle Digits und Sonderzeichen)
c) Das UP WRITE_BCD schreibt die ersten 3 Digits direkt in die LCD-Anzeige (hier immer Buchstaben), danach wandelt es die Zahlen in BCD-Code um und schreibt sie in die restlichen Digits. Zum Schluss werden die Sonderzeichen direkt rausgeschoben.
d) UP BINAER_DEZIMAL wandelt Zahlen in die einzelnen Digits um und verwaltet außerdem negative Vorzeichen.
e) UP INIT setzt die Richtung der einzelnen I/O, und führt das Schreiben des EEPROM-Inhaltes auf die serielle Schnittstelle aus (bei jedem Netzein). Die Ausgaben sind so formatiert, das sie mit dem Programm http://www.parallaxinc.com/downloads/software/BASIC Stamps/Stampplot.zip als Textfile abgelegt und mit einem Datenverarbeitungsprogramm (z.B. Excel) eingelesen werden können. Weiterhin wird eine Displaymeldung initialisiert, welche eine fehlerhafte Stellung des Magnetventils beim Start meldet.
f)
Das UP DIVISION berechnet den Dividend aus dem übergebenen Nenner und Zähler.
Das Ergebnis ist dabei:
DUMMYWORD3=10^4*DUMMYWORD1/DUMMYWORD2
g)
UP REGELUNG stellt einen 3-Punkt –Regler mit Hysterese dar.
Folgende Funktion wird damit erreicht:
h) UP FREIGABE berechnet die Freigabemeldung aus den gemessenen Temperaturen.
i) UP WRITEEEPROM speichert die Temperaturwerte im EEPROM ab. Im WRITEEEPROM-Zyklus wird die Durchlaufzeit um 1s erhöht.
Die Anzeige ist ein LCD-Modul von http://www.electronic-assembly.de/,
welches seriell mit Daten gespeist werden kann. Der Arbeitstemperaturbereich
liegt bei
–30°C..+70°C. Es hat eine LED-Hintergrundbeleuchtung. Diese kann ohne
Vorwiderstand an +5V angeschlossen werden.
Folgender Ablauf ist beim Daten Schreiben einzuhalten:
1) Enable auf high
2) 56 Bits rausschieben (Begin ist 6tes Digit, Ende sind Sonderzeichen gefolgt von 3 Nullen)
3) Enable auf low
Die digitalen Eingänge sind unbeschaltet auf H (R gegen +5V) gelegt. Damit ergibt sich eine negierte Funktion. Die Ausgangsbeschaltung kann 2-Adrig erfolgen, oder aber 1-Adrig (vor Ort gegen Masse).
Die digitalen Ausgänge sind über Optokoppler und Darlington-Schaltung so getrennt, dass Verbraucher bis ca. 300mA/50V angeschlossen werden können (typische Relais haben ca. 75 Ohm Innenwiderstand). Durch Veränderung der Transistorbeschaltung können auch höhere Leistungen erreicht werden. Die Transistoren sind durch Freilaufdioden vor den Induktionsspannungen der Relais geschützt.
Die verwendeten Temperatursensoren der Firma http://www.hy-line.de/sensor/c-lieferanten.html - SMARTEC liefern eine gepulste Ausgangsspannung im
Bereich 1kHz..4kHz. Das Verhältnis von High-Zeit zur Gesamtzeit ist dabei ein
Maß der Temperatur. Die BS2-Software wurde für einen Temperaturbereich von
–30°C..130°C geschrieben.
Tabelle 5.1: Abschätzung der erreichbaren Zeiten des Temp.-Sensors
|
1kHz |
4kHz |
-30°C |
+130°C |
Zeit [ms] |
Gesamtzeit [ms] |
1 |
0.25 |
- |
- |
- |
Max. Low-Zeit bei |
X |
|
X |
|
0.820 |
Min. Low-Zeit bei |
|
X |
|
X |
0.018 |
Max. High-Zeit bei |
X |
|
|
X |
0.930 |
Min. High-Zeit bei |
|
X |
X |
|
0.045 |
Aus den gemessenen Low- und High-Zeiten lässt sich nun die Temperatur folgendermaßen berechnen:
T [°C]=HZ/(HZ+LZ)*212.76-68.08
Folgende Vorgehensweise wurde bei der Programmierung umgesetzt:
1) N_MESS-faches lesen der Low- und High-Zeit (1 Wert = 0.002 ms) für bessere Mittelung
2) Überprüfung der gelesenen Werte auf Sinnfälligkeit in jedem Zyklus
3) Korrektur der Messzeit auf T_MZEIT je nach N_MESS, LZ und HZ, um bei EEPROM-Speicherung immer konstante Abtastzeit zu bekommen
4)
Division über Unterprogramm: DUMMYWORD3 = 10^4*HZ/(LZ+HZ)
Bsp.: 0.413à
4130
5)
Kalibrierung des Messergebnisses
T=DUMMYWORD3*2.13-6809+T_OFFS*100
T enthält jetzt Temperatur in 1/100°C + 100°C Offset; Bsp. 23.07°C à
T=12307
6) Korrektur auf °C+100°C: T [°C+100]=T/100; Bsp. 23.07 à T=123
7) Bei Fehlern in der Messung wird die maximale Messzeit (132ms) auf T_MZEIT verlängert
Die Schaltung ist über eine 250mA-Sicherung gegen Überlast und über eine Diode gegen Verpolen geschützt. Achtung: Die Ausgangstransistoren besitzen keine Absicherung!! Diese ist je nach Relaisbeschaltung zu wählen und zusätzlich anzubringen.
Nach dem Netz-Ein werden die Ausgangsrichtungen gesetzt. Die Lebens-LED beginnt zu leuchten. Danach wird auf der Anzeige die Anzahl der EEPROM-Samples dargestellt (z.B.: SA_100) und der EEPROM ausgelesen. Über COM-Schnittstelle werden die Daten ausgegeben.
Im nächsten Schritt wird der Eingang VENTIL_DK (Schalter VDK) geprüft und bei fehlerhafter Stellung für ca. 15s die Meldung n_POEL (noch auf PK-Stellung) ausgegeben. Die Meldung erlischt vorzeitig bei Schalten in die richtige Stellung. Dies ist eine Warnung, um bei kaltem Motor auf die PK-Stellung hinzuweisen. Bei warmen Motor ist diese Meldung einfach zu ignorieren.
Jetzt fängt die Lebens-LED an zu blinken (1s-Rythmus), die Temperaturdaten werden gelesen und je nach Anzeigewahlstellung (wird beim Ausschalten gespeichert) die Temperatur angezeigt. Durch Tastendruck auf die ANZ_WAHL-Taste kann nun der anzuzeigende Temperaturwert gewählt werden. Die aktuelle Anzeige wird durch ein Voranstellen von tt (Tanktemperatur), tP (Pumpentemperatur) und tH (Heizwassertemperatur) verdeutlicht.
Die berechneten Ausgangswerte werden zusätzlich im Display über die Sonderzeichen sichtbar gemacht.
Dabei bedeuten:
Æ EEPROM-Aufzeichnung läuft
6 Temperatur zu tief (U1 und U2 an)
56 Temperatur i.O. (U1 an, U2 aus)
5 Temperatur zu hoch (U1 und U2 aus)
LIT Freigabemeldung (gib Liter!!!)
Während des normalen Betriebes kann jederzeit eine Aufzeichnung der aktuellen Daten durch betätigen der WRITE-Taste durchgeführt werden. Dabei werden die letzten Daten überschrieben. Die Aufzeichnung wird im Display durch das Æ sichtbar gemacht. Es ist zu beachten, dass sich während der Aufzeichnung die Durchlaufzeit um 1s erhöht (Lebens-LED blinkt auch langsamer).
Derzeit ist die Durchlaufzeit auf ca. 1s eingestellt. Sie kann in Sonderfällen, mit dem eingesetzten BS2-Chip auf ca. 200ms reduziert werden. Dies macht einige Softwareänderungen erforderlich.
Eine Änderung des Aufzeichnungsintervalls im Bereich 1s>Ta>1093s ist ebenfalls möglich. Dazu muss lediglich der PAUSE-Wert im EEPROM-UP zwischen 0 ms und 65520 ms variiert werden.
Die Tabelle enthält nicht unbedingt den günstigsten Anbieter. Die Preise gelten für die angegebene Stückzahl (kein Mengenrabatt) und enthalten keine Lieferkosten.
Pos. |
Anzahl |
Bezeichnung |
Lieferant |
Bestellnummer |
Preis inkl. MWst. |
1 |
1 |
LCD-Anzeige |
www.electronic-assembly.de |
VK4203L |
131.08 |
2 |
1 |
BS2-IC |
www.wilke.de |
BASIC-Brief-marke® II P |
114.84 |
3 |
3 |
Temperatursensoren |
www.hy-line.de |
SMT160-30 |
43.50 |
4 |
1 |
Optokoppler (PC847) |
Conrad |
187020-11 |
3.95 |
5 |
5 |
1 N4001 |
Conrad |
162213-11 |
0.60 |
6 |
1 |
C1 47/10 |
Conrad |
460648-11 |
0.15 |
7 |
1 |
C2 1000/24 |
Conrad |
472549-11 |
0.75 |
8 |
1 |
C3 100n |
Conrad |
461024-11 |
0.45 |
9 |
5 |
Low-Current-LED |
Conrad |
145998-11
(rt) 145971-11
(gn) 145980-11 (ge) |
1.95 |
10 |
1 |
Festspannungsregler +5V/1A (7805) |
Conrad |
179205-11 |
0.95 |
11 |
5 |
1K |
Conrad |
403253-11 |
0.85 |
12 |
1 |
4.7K |
Conrad |
403334-11 |
0.17 |
13 |
4 |
560 Ohm |
Conrad |
403229-11 |
0.68 |
14 |
2 |
Si –Halter |
Conrad |
533920-11 |
0.34 |
15 |
1 |
Si 250mA |
Conrad |
533041-11 |
2.40 |
16 |
1 |
9-pol SUB-D-Buchse |
Conrad |
742082-11 |
0.80 |
17 |
4 |
Npn-Transistoren (BC 517) |
Conrad |
154695-11 |
1.80 |
18 |
3 |
4-pol Steckverbinder |
Conrad |
|
Ca. 10DM |
19 |
4 |
2-pol Steckverbinder |
Conrad |
|
Ca. 10DM |
20 |
1 |
6-pol Steckverbinder |
Conrad |
|
Ca. 5DM |
21 |
2 |
Taster |
Conrad |
|
1-10DM |
22 |
2 |
Schalter |
Conrad |
|
1-20DM |
Summe der Bauteilkosten: ca. 300 DM
Für die Programmierung ist eine 1:1 9-pol. SUB-D-Verlängerung erforderlich !
Inhalt in Textdatei kopieren, Name: Control_PK.bs2
Die Temperaturen (LEV_XX, DT_LTG, HYS) sind im Programm für Testzwecke (Handerwärmung der Sensoren) so eingestellt, dass man die Reaktion der Ausgangs-LED’s bzw. Anzeigemeldungen beobachten kann. Die praxisrelevanten Werte sind im Kommentar unter STD:xxx abgelegt. Diese beim Einbau in den Chip spielen!!!
'{$STAMP BS2}
'Arbeitszeit:2h;4h;4h;8h
'Lesen
der Eingänge; T1, T2,T3 (sinnvolle
Werte der low und High-Zeiten sind (9..465)*2us bei BS2)
'Ventil=DK,
Soll=PK
'Ansteuern
der großen LCD-Anzeige
'Regeln
von U1,U2
'Freigabesignal
berechnen
'Änderung
zur Vorversion:
'Besonderheiten:
'Temperaturen
werden mit Offset +100°C berechnet und verwendet
'bei
einer unklaren Messung, wird Temp=1 gesetzt (-99°C)
'Korrektur
der Abtastzeit bei gemessenen Temperaturen auf T_MZEIT (200 ms)
'Negation
aller Eingänge laut Schaltplan
'Korrektur
der Durchlaufzeit auf 2s beim EEPROM schreiben (Ta=2s)
'Aufzeichnung
der Daten per Tastendruck -> EEPROM
'Ausgabe
des EEPROMS im Init-Zweig
'Warnung,
wenn bei Start VENTIL_DK=0 (Ventil steht noch auf PK)
'Freigabe
nur bei SOLL_PK=1
'weitere
Arbeiten:
'Temp.-Messroutine
in eigenes UP
'Zaehler
auf byte-Variable kuerzen (MELDUNGNDK<=255)
'++++++++++Temperaturlevel
und Reglerkonstanten++++++++++++++++++++++++++++++++++++
T_OFFS con 100 'Offset
der Temperaturen, um neg. Werte zu vermeiden
T_MZEIT con 200 'Messzeit
in ms, auf die die Temperaturmessg. korrigiert wird >133 und
>(N_MESS*T_MESS) !!
N_MESS con 20 'Häufigkeit
der T-Messung
T_MESS con 38 'Messzeit
einer T-Messung [*100 us] (mit Oszi bestimmt)
'Berechnung
der Gesamtmesszeit=(N_MESS*T_MESS)
SMAX_HZ con 930/2 'sinnvoller maximaler Wert für HZ (bei
130°C und 1KHz)
SMIN_HZ con 45/2 'sinnvoller
minimaler Wert für HZ (bei -30°C und 4KHz)
SMAX_LZ con 820/2 'sinnvoller maximaler Wert für LZ (bei
-30°C und 1KHz)
SMIN_LZ con 18/2 'sinnvoller
minimaler Wert für LZ (bei 130°C und 4KHz)
LEV_FR con 0+T_OFFS 'Temperatur
(T1), bei der Tankinhalt gefroren ist
LEV_FG con 31+T_OFFS 'Temperatur
(T1), ab der die Freigabemeldung erfolgt (theoret. berechnet) STD:40
LEV_H con 27+T_OFFS 'Temperatur (T2), bei der eine Heizung
ausgeht STD:85
LEV_VH con 29+T_OFFS 'Temperatur
(T2), bei der beide Heizungen ausgehen STD:95
DT_LTG con 10 'Temperaturerhöhung
der beheizten PK-Leitung STD:10
HYS con 1 '1/2
Hysterese des Reglers
'----------------------------------------------------------------------------------
ANZEIGE data 0 'Anzeigeoption: 0=Anzeige von T1, T2, T3 durchlaufend
' 1=Anzeige
von T1
' 2=Anzeige
von T2
' 3=Anzeige
von T3
SAMPLES con 100 '=Aufzeichnungszeit in s (max. 150)
TIEFE con 3 '3Temp-Daten
MEMORY con SAMPLES*TIEFE 'Anzahl der Byte-Daten im EEPROM
WPOS data (MEMORY) 'Position
der Temperaturdaten
WPOSMAX con WPOS+MEMORY-1 'Endposition der Daten
ZAEHLER var word 'Zähler für Refresh-Rate+blinkende LED
WZAEHLER var word 'Zähler für EEPROM-Position
DUMMYWORD1 var word
'Speicher für Divident
DUMMYWORD2 var word
'Speicher für Divisor
DUMMYWORD3 var word
'Speicher für Divisor
FEHLER
var byte 'Fehlerspeicher
TEMP1 var byte 'Temperatur
1 (0...255 = -100...155°C)
TEMP2 var byte 'Temperatur
2 (0...255 = -100...155°C)
TEMP3 var byte 'Temperatur
3 (0...255 = -100...155°C)
DUMMYBYTE1 var byte 'Byte-Hilfsvariable
DUMMYBYTE2 var byte
DUMMYBYTE3 var byte
DUMMYBIT var DUMMYBYTE3.bit1
U1AN var bit 'Heizwendel 1 ein
U2AN var bit 'Heizwendel 2 ein
MLDAN var bit 'Meldung der Freigabe ein
ANZ var bit 'Anforderung des Anzeigewechsels
ANZ_OLD var bit 'Vorhergehender Status
SPA var bit 'Speicheranforderung
SPA_OLD var bit 'Vorhergehender Status
'-----------------------------------------------------------------------------------
'-----------------------------------------------------------------------------------
PARAMETER var byte '0=
Initialisierung
'1= Init 2
'2=
Temp.1
'3= Temp.2
'4=
Temp.3
VK4203SONDER var byte 'Byte
für Sonderzeichen, und kodierte Dezimalpunkte (0..5) SSSS SDDD
VK4203ZAHL var byte 'Dezimalzahl,
die angezeigt werden soll und gleichzeitig Einer-Stelle (LSB)
VK4203ZEHNER var byte 'Zehner
Stelle
VK4203HUNDERT
var byte 'Hunderter
Stelle
VK4203BST1 var byte 'Buchstabe1
(Hunderttausender Stelle, MSB)
VK4203BST2 var byte 'Buchstabe2
(Zehntausender Stelle)
VK4203BST3
var byte 'Buchstabe3
(Tausender Stelle)
VK4203NULLEN var bit 'Kenner, ob fhrende Nullen geschrieben werden
VK4203ANZEIGE
con $0001 'Refreshrate
von VK4203 (alle 2 Durchläufe)
ANZEIGEWECHSEL
con $0002 'Refreshrate
von VK4203 (alle 4 Durchläufe)
MELDUNGNDK
con 600 'Meldungslänge
Non DK 600 = ca.15s
'++++++++++++++++Konstanten
für BCD-Anzeige+++++++++++++++++
' abcdefgx 'x...Kenner,
ob Zahl=0, oder Buchstabe=1
BCDMIN con %00000010 'Anzeige
"|-|"
BCD0 con %11111100 'Anzeige "0"
BCD1 con %01100000 'Anzeige "1"
BCD2 con %11011010 'Anzeige "2"
BCD3 con %11110010 'Anzeige "3"
BCD4 con %01100110 'Anzeige "4"
BCD5 con %10110110 'Anzeige "5"
BCD6 con %10111110 'Anzeige "6"
BCD7 con %11100000 'Anzeige "7"
BCD8 con %11111110 'Anzeige "8"
BCD9 con %11110110 'Anzeige "9"
BCDA con
%11101110 'Anzeige
"A"
BCDB con %00111110 'Anzeige "b"
BCDC con %10011100 'Anzeige "C"
BCDD con %01111010 'Anzeige "d"
BCDE con
%10011110 'Anzeige
"E"
BCDF con %10001110 'Anzeige "F"
BCDG con BCD6 'Anzeige
"G"
BCDH con
%01101110 'Anzeige "A"
BCDI con
%00001000 'Anzeige
"i"
BCDJ con %01111000 'Anzeige "J"
BCDL con %00011100 'Anzeige "L"
BCDN con %00101010 'Anzeige "n"
BCDO con
%00111010 'Anzeige
"o"
BCDS con BCD5 'Anzeige
"S"
BCDT con %00011110 'Anzeige "t"
BCDU con %00111000 'Anzeige "u"
BCDP con %11001110 'Anzeige "P"
BCDPULSU con %11000100 'Anzeige "|-|"
BCDPULSD con %00111000 'Anzeige "|_|"
BCDUSQ con %00000010 'Anzeige
" - "
VKDP con %00000001 'Anzeige
"DP4-DP1"
VKPUP con %10000000 'Anzeige "Pfeil oben"
VKPDN con %01000000 'Anzeige "Pfeil
unten"
VKGAL con %00100000 'Anzeige "Gal"
VKLIT con %00010000 'Anzeige "Lit"
VKGC con %00001000 'Anzeige "°C"
'+++++++++++++++++Portbelegung++++++++++++++++++++++
'Eingänge:
PULSIN_T1 con 15 'Dateneingang
für Pulsweite Temperatursensor1 (PK)
PULSIN_T2 con 14 'Dateneingang
für Pulsweite Temperatursensor2 (EP)
PULSIN_T3 con 13 'Dateneingang
für Pulsweite Temperatursensor3 (KW)
VENTIL_DK con 12 'Eingang
für Test auf Schaltstellung Ventil
VENTIL_DKPIN var in12
SOLL_PK con 11 'Eingang
für PK-Zyklus (0: U1,U2=0)
SOLL_PKPIN var in11
ANZEIGEWAHLPIN
con 10 'Eingang für
Taste zur Anzeigenwahl
ANZEIGEWAHL
var in10
SPEICHERANFPIN
con 9 'Eingang für
Taste zur Speicheranforderung
SPEICHERANF var in9
'Ausgänge:
VK4203E con 0 'Enableausgang für LCD-Anzeige
VK4203C con 1 'Taktausgang
für LCD-Anzeige
VK4203D con 2 'Datenausgang für LCD-Anzeige
U1 con 3
U1_OUT var out3 'Ausgang
für elt.-Tauscher1
U2 con 4
U2_OUT var out4 'Ausgang
für elt.-Tauscher2
MLD con 5
MLD_OUT var out5 'Ausgang für Freigabe zum Umschalten
RESERVE con 6 'Reserveausgang
LIVE con 7 'Wackelt,
wenn alles IO
'-------------Hauptprogramm--------------------------
'Initialisierung
nach Programmstart:
gosub INIT
'debug cr,"INIT OK!"
DURCHLAUF:'Eingabesteuerung
ist aktiv
ZAEHLER=ZAEHLER+1 'Zähler für Anzeigehäufigkeit und -wechsel
read ANZEIGE,DUMMYBYTE1 'Anzeigeart
lesen
'wechselnde Anzeige:
if DUMMYBYTE1<>0 then ENDEWECHSEL
if (ZAEHLER//ANZEIGEWECHSEL)<>0 then
ENDEWECHSEL
PARAMETER=PARAMETER*2
if PARAMETER<16 then ENDEWECHSEL
PARAMETER=2
ENDEWECHSEL:
'Anzeige T1
if DUMMYBYTE1<>1 then ENDEANZT1
PARAMETER=2
ENDEANZT1:
'Anzeige T2
if DUMMYBYTE1<>2 then ENDEANZT2
PARAMETER=4
ENDEANZT2:
'Anzeige T3
if DUMMYBYTE1<>3 then ENDEANZT3
PARAMETER=8
ENDEANZT3:
gosub IOVERWALTUNG 'IOs lesen und setzen
gosub WRITEEEPROM
pause 320 'Pause
für Ta=1s
goto
DURCHLAUF
'------------------Unterprogramme:
--------------------
IOVERWALTUNG:
'Eingänge-------------------------------------
'lesen:
'Anzeigewahl
'Flankenauswertung nur L-H-Flanke:
DUMMYBIT=-ANZEIGEWAHL
ANZ=DUMMYBIT & (ANZ_OLD^1)
ANZ_OLD=DUMMYBIT
if ANZ<>1 then ENDEKORRANZ
read ANZEIGE,DUMMYBYTE1
DUMMYBYTE1=DUMMYBYTE1+1
if DUMMYBYTE1<=3 then ENDEKORRANZ1
DUMMYBYTE1=0
ENDEKORRANZ1:
write ANZEIGE,DUMMYBYTE1
ENDEKORRANZ:
'Speicheranforderung
'Flankenauswertung nur L-H-Flanke:
DUMMYBIT=-SPEICHERANF 'Eingang negiert
SPA=DUMMYBIT & (SPA_OLD^1)
SPA_OLD=DUMMYBIT
if SPA<>1 then ENDESPANF
WZAEHLER=WPOS
ENDESPANF:
'Temperatur1+++++++++++
DUMMYWORD1=0
DUMMYWORD2=0
for DUMMYBYTE3=1 to N_MESS
pulsin
PULSIN_T1,1,DUMMYWORD3 'Eingang lesen in
word-Variable, High-Zeit
if
(DUMMYWORD3>SMAX_HZ)or(DUMMYWORD3<SMIN_HZ) then ENDEFT1
DUMMYWORD1=DUMMYWORD1+DUMMYWORD3
pulsin PULSIN_T1,0,DUMMYWORD3 'Eingang lesen in word-Variable, Low-Zeit
if
(DUMMYWORD3>SMAX_LZ)or(DUMMYWORD3<SMIN_LZ) then ENDEFT1
DUMMYWORD2=DUMMYWORD2+DUMMYWORD3
next 'DUMMYBYTE3
'Messung dauert maximal M_MESS*N_MESS ms
'Korrektur der Messzeit auf T_MZEIT ms
'debug cr,"reine Messzeit
T1[us]:",dec (DUMMYWORD1+DUMMYWORD2)*2
'debug cr, "PAUSE:",dec
(T_MZEIT-((T_MESS*N_MESS)/10)-((DUMMYWORD1+DUMMYWORD2)/500))
pause (T_MZEIT-((T_MESS*N_MESS)/10)-((DUMMYWORD1+DUMMYWORD2)/500))
'debug cr,"LZ1:",dec
DUMMYWORD1," HZ1:",dec DUMMYWORD2
'komplizierte Division wegen schlechter
Arithmetik
DUMMYWORD1=DUMMYWORD1/N_MESS 'Zähler
DUMMYWORD2=DUMMYWORD1+(DUMMYWORD2/N_MESS) 'Nenner
DUMMYWORD3=0 'sp“ter
Ergebnis
gosub DIVISION
'Kalibrierung:
DUMMYWORD2=DUMMYWORD3*2-6809+(DUMMYWORD3*1/10)+(DUMMYWORD3*3/100)+(T_OFFS*100)
TEMP1=DUMMYWORD2/100 'Temperatur1 in °C
'debug cr,"T1:",dec TEMP1-T_OFFS
goto ENDENFT1
'Fehlerverwaltung T1
ENDEFT1:
TEMP1=1
pause T_MZEIT-132 'zusätzliche Pause, um auf
T_MZEIT zu kommen
ENDENFT1:
'Temperatur2+++++++++++
DUMMYWORD1=0
DUMMYWORD2=0
for DUMMYBYTE3=1 to N_MESS
pulsin
PULSIN_T2,1,DUMMYWORD3 'Eingang lesen in
word-Variable, High-Zeit
if (DUMMYWORD3>SMAX_HZ)or(DUMMYWORD3<SMIN_HZ)
then ENDEFT2
DUMMYWORD1=DUMMYWORD1+DUMMYWORD3
pulsin PULSIN_T2,0,DUMMYWORD3 'Eingang lesen in word-Variable, Low-Zeit
if
(DUMMYWORD3>SMAX_LZ)or(DUMMYWORD3<SMIN_LZ) then ENDEFT2
DUMMYWORD2=DUMMYWORD2+DUMMYWORD3
next 'DUMMYBYTE3
'Messung dauert maximal 1.1*N_MESS ms
'Korrektur der Messzeit auf 1.5*N_MESS ms
'debug cr,"Messzeit T2:",dec
(DUMMYWORD1+DUMMYWORD2)/500
pause
(T_MZEIT-((T_MESS*N_MESS)/10)-((DUMMYWORD1+DUMMYWORD2)/500))
'debug cr,"LZ2:",dec
DUMMYWORD1," HZ2:",dec DUMMYWORD2
'komplizierte Division wegen schlechter
Arithmetik
DUMMYWORD1=DUMMYWORD1/N_MESS 'Zähler
DUMMYWORD2=DUMMYWORD1+(DUMMYWORD2/N_MESS)'Nenner
DUMMYWORD3=0 'sp“ter
Ergebnis
gosub DIVISION
'Kalibrierung:
DUMMYWORD2=DUMMYWORD3*2-6809+(DUMMYWORD3*1/10)+(DUMMYWORD3*3/100)+(T_OFFS*100)
TEMP2=DUMMYWORD2/100 'Temperatur2 in °C
'debug cr,"T2:",dec TEMP2-T_OFFS
goto ENDENFT2
'Fehlerverwaltung T2
ENDEFT2:
TEMP2=1
pause T_MZEIT-132 'zusätzliche Pause, um auf
T_MZEIT zu kommen
ENDENFT2:
'Temperatur3+++++++++++
DUMMYWORD1=0
DUMMYWORD2=0
for DUMMYBYTE3=1 to N_MESS
pulsin
PULSIN_T3,1,DUMMYWORD3 'Eingang lesen in
word-Variable, High-Zeit
if
(DUMMYWORD3>SMAX_HZ)or(DUMMYWORD3<SMIN_HZ) then ENDEFT3
DUMMYWORD1=DUMMYWORD1+DUMMYWORD3
pulsin PULSIN_T3,0,DUMMYWORD3 'Eingang lesen in word-Variable, Low-Zeit
if
(DUMMYWORD3>SMAX_LZ)or(DUMMYWORD3<SMIN_LZ) then ENDEFT3
DUMMYWORD2=DUMMYWORD2+DUMMYWORD3
next 'DUMMYBYTE3
'Messung dauert maximal 1.1*N_MESS ms
'Korrektur der Messzeit auf 1.5*N_MESS ms
debug cr,"Messzeit T3[ms]:",dec
(DUMMYWORD1+DUMMYWORD2)/500
pause
(T_MZEIT-((T_MESS*N_MESS)/10)-((DUMMYWORD1+DUMMYWORD2)/500))
'debug cr,"LZ3:",dec
DUMMYWORD1," HZ3:",dec DUMMYWORD2
'komplizierte Division wegen schlechter
Arithmetik
DUMMYWORD1=DUMMYWORD1/N_MESS 'Zähler
DUMMYWORD2=DUMMYWORD1+(DUMMYWORD2/N_MESS)'Nenner
DUMMYWORD3=0 'sp“ter
Ergebnis
gosub DIVISION
'Kalibrierung:
DUMMYWORD2=DUMMYWORD3*2-6809+(DUMMYWORD3*1/10)+(DUMMYWORD3*3/100)+(T_OFFS*100)
TEMP3=DUMMYWORD2/100 'Temperatur3 in °C
'debug cr,"T3:",dec TEMP3-100
goto ENDENFT3
'Fehlerverwaltung T3
ENDEFT3:
TEMP3=1 '-99°C solange kein Sensor dran
pause T_MZEIT-132 'zusätzliche Pause, um auf
T_MZEIT zu kommen
ENDENFT3:
'Ausgänge-------------------------------------
'schreiben
'U1-U2-Regelung
gosub REGELUNG
U1_OUT=U1AN
U2_OUT=U2AN
'Freigabe des Ausganges
gosub FREIGABE
MLD_OUT=MLDAN
'schreiben VK4203 nur alle n
Durchläufe
if (ZAEHLER//VK4203ANZEIGE)<>0 then
ENDEVK4203
gosub VK4203VERWALTUNG
ENDEVK4203:
'Lebensbit:
toggle LIVE
return
VK4203VERWALTUNG:
high VK4203E 'Bereit zum rausschreiben
if FEHLER=0 then ENDEVWF 'bei keinem Fehler
VK4203SONDER=%11111111 'alle Sonderzeichen
ein
VK4203BST1
=BCDF '"F"
VK4203BST2
=BCDN '"n"
VK4203ZAHL=FEHLER 'Fehlernummer holen
gosub BINAER_DEZIMAL 'in Dezimalstellen wandeln
goto ENDEVW0 'LSB..MSB
schreiben
ENDEVWF:
VK4203HUNDERT=0
VK4203ZEHNER =0
VK4203NULLEN =0 'fhrende Nullen
unterdrcken
VK4203SONDER =1 'Dezimalpunkt
'Pfeilverwaltung (3-Punkt-Regler)
if U1AN=0 then ZUHOCH
if U2AN=0 then GUT
ZUTIEF:
VK4203SONDER =VK4203SONDER|VKPDN 'Sonderzeichen:
Pfeil unten
goto ENDEPFEILE
GUT:
VK4203SONDER =VK4203SONDER|VKPDN 'Sonderzeichen:
Pfeil unten
ZUHOCH:
VK4203SONDER=VK4203SONDER|VKPUP 'Sonderzeichen:
Pfeil oben
ENDEPFEILE:
'LIT-Verwaltung (Freigabe PK)
if MLDAN=0 then ENDELIT
VK4203SONDER=VK4203SONDER|VKLIT 'Sonderzeichen:
Pfeil oben
ENDELIT:
'$-Verwaltung (Aufzeichnung läuft)
if (WZAEHLER+TIEFE)>WPOSMAX then ENDEAUFZ
VK4203SONDER=VK4203SONDER|VKGC 'Sonderzeichen:
GC
ENDEAUFZ:
branch
ncd(PARAMETER),[PARAM0,PARAM1,PARAM2,PARAM4,PARAM8,PARAM16,PARAM32,PARAM64,PARAM128]
PARAM0: 'Anzeige der Samples -----------------------------
VK4203SONDER =0 'Sonderzeichen: leer
VK4203BST1=BCDS '"S"
VK4203BST2=BCDA '"A"
VK4203BST3=0 '""
'Samples in Dezimalstellen wandeln (keine
Negation bei Werten>128)
VK4203ZAHL
=SAMPLES dig 0
VK4203ZEHNER =SAMPLES dig 1
VK4203HUNDERT=SAMPLES dig 2
goto ENDEVW0
PARAM1: 'Anzeige
der Samples -----------------------------
VK4203SONDER =0 'Sonderzeichen: leer
VK4203BST1=BCDn '"n"
VK4203BST2=0 '""
VK4203BST3=BCDP '"P"
VK4203HUNDERT=0 '"O"
VK4203ZEHNER =BCDE '"E"
VK4203ZAHL
=BCDL '"L"
VK4203NULLEN =1 'fhrende Nullen nicht
unterdrcken
goto ENDEVW0
PARAM2: 'Temperatur1---------------------------------------
VK4203BST1=BCDT '"t"
VK4203BST2=BCDT '"t"
VK4203BST3=0 '""
VK4203ZAHL=TEMP1-100 'Darstellung TEMPERATUR in øC
gosub BINAER_DEZIMAL 'in Dezimalstellen wandeln
VK4203HUNDERT=VK4203ZEHNER
VK4203ZEHNER =VK4203ZAHL
VK4203ZAHL=BCDC 'C
goto ENDEVW0
PARAM4: 'Temperatur2----------------------------------------
VK4203BST1=BCDT '"t"
VK4203BST2=BCDP '"P"
VK4203BST3=0 '""
VK4203ZAHL=TEMP2-100 'Darstellung TEMPERATUR in øC
gosub BINAER_DEZIMAL 'in Dezimalstellen wandeln
VK4203HUNDERT=VK4203ZEHNER
VK4203ZEHNER =VK4203ZAHL
VK4203ZAHL=BCDC 'C
goto ENDEVW0
PARAM8: 'Temperatur3----------------------------------------
VK4203BST1=BCDT '"t"
VK4203BST2=BCDH '"H"
VK4203BST3=0 '""
VK4203ZAHL=TEMP3-100 'Darstellung TEMPERATUR in øC
gosub BINAER_DEZIMAL 'in Dezimalstellen wandeln
VK4203HUNDERT=VK4203ZEHNER
VK4203ZEHNER =VK4203ZAHL
VK4203ZAHL=BCDC 'C
goto ENDEVW0
PARAM16: 'Frei----------------------------------------
gosub BINAER_DEZIMAL 'in Dezimalstellen wandeln
goto ENDEVW0
PARAM32: 'Frei----------------------------------------------
gosub BINAER_DEZIMAL 'in Dezimalstellen wandeln
goto ENDEVW0
PARAM64: 'Job--------------------------------------------
goto ENDEVW0
PARAM128: 'Reserveausgänge
1..7----------------------------------------
goto ENDEVW0
ENDEVW0:
gosub WRITE_BCD 'LSB..MSB
schreiben
low VK4203E 'Daten
parallel zur Verfügung stellen
return
WRITE_BCD: 'in BCD-Code wandeln und rausschieben
'debug cr,dec (VK4203SONDER&%00000111)
shiftout VK4203D,VK4203C,1,[VK4203BST1\8]
shiftout VK4203D,VK4203C,1,[VK4203BST2\8]
shiftout VK4203D,VK4203C,1,[VK4203BST3\8]
if
((VK4203HUNDERT=0)or(VK4203HUNDERT>9))and(VK4203NULLEN=0) then ENDEWBCDH 'führende "0" unterdrücken,
Buchstaben
lookup
VK4203HUNDERT,[BCD0,BCD1,BCD2,BCD3,BCD4,BCD5,BCD6,BCD7,BCD8,BCD9],VK4203HUNDERT
ENDEWBCDH:
if (VK4203SONDER&(%00000111))<>2
then ENDEWBCDDP2
VK4203HUNDERT.bit0=1
ENDEWBCDDP2:
shiftout VK4203D,VK4203C,1,[VK4203HUNDERT\8]
if VK4203ZEHNER>9 then ENDEWBCDZ 'Buchstaben
lookup VK4203ZEHNER, [BCD0,BCD1,BCD2,BCD3,BCD4,BCD5,BCD6,BCD7,BCD8,BCD9],VK4203ZEHNER
ENDEWBCDZ:
if (VK4203SONDER&(%00000111))<>1
then ENDEWBCDDP1
VK4203ZEHNER.bit0=1
ENDEWBCDDP1:
shiftout VK4203D,VK4203C,1,[VK4203ZEHNER\8]
if VK4203ZAHL >9 then ENDEWBCDE 'Buchstaben
lookup
VK4203ZAHL,[BCD0,BCD1,BCD2,BCD3,BCD4,BCD5,BCD6,BCD7,BCD8,BCD9],VK4203ZAHL
ENDEWBCDE:
if (VK4203SONDER&(%00000111))<>6 then ENDEWBCDDOL
VK4203ZAHL.bit0=1
ENDEWBCDDOL:
shiftout VK4203D,VK4203C,1,[VK4203ZAHL\8]
VK4203SONDER.bit0=0 'Sonderzeichen
VK4203SONDER.bit1=0
VK4203SONDER.bit2=0
shiftout VK4203D,VK4203C,1,[VK4203SONDER \8]
return
BINAER_DEZIMAL:
'Decoder für Binärzahl
if VK4203ZAHL<129 then ENDEMINUS
VK4203ZAHL=-VK4203ZAHL
VK4203BST3=BCDMIN
ENDEMINUS:
VK4203HUNDERT=VK4203ZAHL dig 2
VK4203ZEHNER =VK4203ZAHL dig 1
VK4203ZAHL
=VK4203ZAHL dig 0
return
INIT:
'Richtung setzen
input PULSIN_T1
input
PULSIN_T2
input
PULSIN_T3
input
VENTIL_DK
input SOLL_PK
input ANZEIGEWAHLPIN
input SPEICHERANFPIN
output VK4203D
output VK4203C
output VK4203E
output U1
output U2
output MLD
output RESERVE
output LIVE
U1_OUT =0
U2_OUT =0
MLD_OUT=0
high LIVE
'schreiben VK4203
PARAMETER=0
gosub VK4203VERWALTUNG
'Ausgabe des EEProms
debug
"!CLRM",13,"!DELM",13,"!SAVM ON",13
pause 20
for WZAEHLER = WPOS to WPOSMAX
read WZAEHLER,DUMMYBYTE1
WZAEHLER=WZAEHLER+1
read WZAEHLER,DUMMYBYTE2
WZAEHLER=WZAEHLER+1
read WZAEHLER,DUMMYBYTE3
'Ausgeben in Stampplotlight
debug dec DUMMYBYTE1,",",dec
DUMMYBYTE2,",",dec DUMMYBYTE3,13
next
debug "!SAVM OFF",13
WZAEHLER=WPOSMAX+1
FEHLER=0
ZAEHLER=0 'Zähler
für Refresh-Rate+LED-Blinken
REPEATNDK:
ZAEHLER=ZAEHLER+1
if (VENTIL_DKPIN^1)=0 then ENDENODK 'Eingang negiert
PARAMETER=1
gosub VK4203VERWALTUNG 'Warnung
ausgeben
ENDENODK:
if ZAEHLER<MELDUNGNDK then REPEATNDK
ZAEHLER=0
PARAMETER=2
return
DIVISION:'Ergebnis in
DUMMYWORD3
for DUMMYBYTE3=1 to 5
'debug cr, dec DUMMYWORD1," ",dec DUMMYWORD2,"
",dec DUMMYWORD3
DUMMYWORD3=(DUMMYWORD1/DUMMYWORD2)+(DUMMYWORD3*10)
DUMMYWORD1=DUMMYWORD1//DUMMYWORD2*10
next 'DUMMYBYTE3
return
REGELUNG:
'Dreipunktregler
'debug cr, dec (TEMP2-100)
if TEMP2>(LEV_H-HYS) then ENDEU2AN
U2AN=1
ENDEU2AN:
if TEMP2<(LEV_H+HYS) then ENDEU2AUS
U2AN=0
ENDEU2AUS:
if TEMP2>(LEV_VH-HYS) then ENDEU1AN
U1AN=1
ENDEU1AN:
if TEMP2<(LEV_VH+HYS) then ENDEU1AUS
U1AN=0
ENDEU1AUS:
return
FREIGABE:
MLDAN=0
if (TEMP1<LEV_FR)or(SOLL_PKPIN^1=0) then
ENDEFROST 'Tank
ist gefroren-->keine Freigabe
DUMMYWORD1=((TEMP1+DT_LTG)/2)+(TEMP2/2) 'Berechnung der zu erwartenden
PK-Temp
'Es wird unterstellt, daß die Heizleitung
eine Temperaturerhöhung von DT_LTG schafft
'Die Mischungstemp. ergibt sich dann aus
50/50 ALT/NEU (bei geringen Drehzahlen wahrscheinlich
'mehr ALT d.h. tatsächliche Temp. ist höher
als erwartete)
'Später kann hier die Formel des gelöteten
WT mit Kenntnis der KW-Temp (T3) eingesetzt werden.
if DUMMYWORD1<LEV_FG then ENDEZUKALT 'zu erwartende Temp.liegt unter Freigabelevel
MLDAN=1
ENDEZUKALT:
ENDEFROST:
return
WRITEEEPROM:
if (WZAEHLER+TIEFE)>WPOSMAX then ENDEWRITE
write WZAEHLER,TEMP1
WZAEHLER=WZAEHLER+1
write WZAEHLER,TEMP2
WZAEHLER=WZAEHLER+1
write WZAEHLER,TEMP3
WZAEHLER=WZAEHLER+1
'debug cr,dec WZAEHLER
pause 1000 'zusätzliche
Pause für Ta=2s
ENDEWRITE:
return