|
Software-Beispiel
für den Controller
|
Das Listing unten enthält ein
voll funktionsfähiges Prinzip-Beispiel für die
Meßwerterfassung der Anzeige der Meßwerte am vierzeiligen
LCD-Display und der Ansteuerung der Schaltausgänge. Sie ist
deshalb hier direkt lesbar zur Ansicht dargestellt und sofort nach
Kompilieren und Übertragen in die CControl-Unit lauffähig.
Sie kann aber nicht mit einem PC kommunizieren. Es ist
empfehlenswert, bis zur vollständigen Funktion aller Elemente
den Controller mit dieser Software zu fahren. Später kann
jederzeit auf die erweiterte Betriebssoftware mit Datenlogger und
Fernsteuerung umgestellt werden.
Soll die CControl Unit per PC
kontrolliert werden, steht dafür eine alternative
Betriebssoftware
mit eingebauter Datenlogger-Routine und Fernabfrage zum Download
bereit. Diese Software arbeitet optimal mit der ebenfalls
herunterladbaren, fertigen PC-Fernabfrage-Software AQUARIUS
zusammen. Der Datenlogger, mit dem stündlich 10 Bytes in das
EEprom des Controllers geschrieben werden, kann im Remotebetrieb (per
Fernsteuerung) aktiviert und ausgelesen werden.
- '****************************************************************************************************
-
'***** INITIALISIERUNG
DER VARIABLEN
**************************************************************
-
'****************************************************************************************************
-
-
'***** GLOBALE VARIABLE
*****
-
define command byte
-
define startbyte byte
-
define value byte
-
define LastSecond byte
-
-
'Temperatur
-
define TempMess AD[1]
-
define TempMin byte
-
define TempMax byte
-
define Heizung port[1]
-
-
'pH-Wert
-
define pHMess AD[2]
-
define pHMin byte
-
define pHMax byte
-
define CO2 port[2]
-
-
'Leitwert
-
define LeitMess AD[3]
-
define LeitMin byte
-
define LeitMax byte
-
define Osmose port[3]
-
define Salz port [4]
-
-
'Redoxpotential
-
define RedMess AD[4]
-
define RedMin byte
-
define RedMax byte
-
define Ozon port[5]
-
-
'Pegel
-
define PegMess AD[5]
'Pegelhöhe im Filter
-
define PegMin byte
-
define PegMax byte
-
define Pumpe port[6]
-
-
'Licht
-
define hMin_1 byte
-
define mMin_1 byte
-
define hMax_1 byte
-
define mMax_1 byte
-
define hMin_2 byte
-
define mMin_2 byte
-
define hMax_2 byte
-
define mMax_2 byte
-
define Licht port[7]
-
-
'Port 8 ist unbenutzt
-
-
'*****
ASCII-ZEICHENVARIABLE FÜR LCD-DISPLAY *****
-
define C_ &H43
-
define D_ &H44
-
define F_ &H46
-
define H_ &H48
-
define M_ &H4D
-
define S_ &H53
-
define V_ &H56
-
define kA &H61 'a#
-
define kI &H69 'i#
-
define kM &H6D 'm#
-
define kO &H6F 'o#
-
define kP &H70 'p#
-
define kR &H72 'r#
-
define kU &H75 'u#
-
define LEERZ &H20 '
-
define MINUS &H2D '-
-
define NULL &H30 '0
-
define GLEICH &H3D
'=
-
define DOPPELPUNKT &H3A
':
-
define PUNKT &H2E '.
-
define GRAD &HDF '°
-
-
'LCD-Variable
-
define lcd_buf byte
-
define lcd_param byte
-
-
'LCD-Ports
-
define lcd_port
byteport[2]
-
'define lcd_rw port[13]
'"Read/Write" control line
-
'define lcd_rs port[14]
'"Register Select" control line
-
define lcd_e port[15]
'"Enable" control line
-
-
-
-
'***************************************************************************************************
-
'***** PROGRAMMPARAMETER
INITIALISIEREN UND ZU MESS-SCHLEIFE SPRINGEN
****************************
-
'***************************************************************************************************
-
'zu verwendende Min. /
Max. - Werte aus EEProm auslesen
-
open# for read
-
input# TempMin
-
input# TempMax
-
input# pHMin
-
input# pHMax
-
input# LeitMin
-
input# LeitMax
-
input# RedMin
-
input# Redmax
-
input# PegMin
-
input# PegMax
-
input# hMin_1
-
input# mMin_1
-
input# hMax_1
-
input# mMax_1
-
input# hMin_2
-
input# mMin_2
-
input# hMax_2
-
input# mMax_2
-
close#
-
-
'Default
Schaltstellungen:
-
Heizung = off
-
CO2 = off
-
Osmose = off
-
Salz = off
-
Pumpe = off
-
Licht = off
-
Osmose = off
-
Salz = off
-
-
'LCD initialisieren
-
gosub LCD_INIT
-
-
'Zur Mess-Schleife
springen
-
goto MAINLOOP
-
-
-
-
'****************************************************************************************************
-
'***** LCD-ROUTINEN
*******************************************************************************
-
'****************************************************************************************************
-
'Display zurücksetzen
-
#LCD_INIT
-
'Organisation:
MSB.....LSB
-
'zuerst im 8-Bit-Modus:
-
lcd_param = &B00111000
: gosub LCD_WRITECMD 'Function Set: 8-Bit-Modus benutzen, mehrzeilig
-
lcd_port = &B00000010
'Function Set: zu 4-Bit-Modus umschalten, einzeilig
-
pulse lcd_e
-
'ab hier 4-Bit-Modus:
-
lcd_param = &B00101000
: gosub LCD_WRITECMD '4-Bit-Modus, mehrzeilig
-
lcd_param = &B00001000
: gosub LCD_WRITECMD 'Display off
-
lcd_param = &B00001100
: gosub LCD_WRITECMD 'Display on
-
lcd_param = &B00000110
: gosub LCD_WRITECMD 'Entry Mode: Cursor unsichtbar inkrementierend,
kein Display Shift
-
gosub LCD_CLS
-
return
-
'Display löschen,
Cursor Home
-
#LCD_CLS
-
lcd_param = &B00000010
: gosub LCD_WRITECMD 'Return Home
-
lcd_param = &B00000001
: gosub LCD_WRITECMD 'Clear Display
-
return
-
'Zeilenwechsel mit Set
CGRAM Adress: (DB7 = 1)
-
#LCD_GOTOLINE
-
'im 4-Bit Modus mit
DB4...DB7, Bit 7 ist immer 1 (N=1) bei Display mit mehr als 1 Zeile
-
if lcd_param = 1 then
lcd_param = &B10000000 'Zeile 1 = &H00
-
if lcd_param = 2 then
lcd_param = &B11000000 'Zeile 2 = &H40
-
if lcd_param = 3 then
lcd_param = &B10010000 'Zeile 3 = &H10
-
if lcd_param = 4 then
lcd_param = &B11010000 'Zeile 4 = &H50
-
goto LCD_WRITECMD
-
'Kommando senden
-
#LCD_WRITECMD
-
lcd_buf = &B00000000
'Buffer zurücksetzen
-
goto LCD_WRITE
-
'Zeichen senden an
Adresse
-
#LCD_WRITECHAR
-
lcd_buf = &B00100000
'CG RAM-Adresse vor Schreiben mit &B000000 vorbelegen
(DB0...DB6)
-
goto LCD_WRITE
-
'Kommando oder Zeichen
im 4-Bit-Modus an LCD senden
-
#LCD_WRITE
-
lcd_port = lcd_buf or
(lcd_param shr 4) ' Hi-Nibble
-
pulse lcd_e
-
lcd_port = lcd_buf or
(lcd_param and &B00001111) ' Lo-Nibble
-
pulse lcd_e
-
return
-
-
-
-
-
'****************************************************************************************************
-
'***** MESS-SCHLEIFE MIT
AUSGABE AN PORTS UND DISPLAY *****
-
'****************************************************************************************************
-
-
'***** MESSWERTE
ERFASSEN UND REGELN *****
-
#MAINLOOP
-
-
'Sekundentakt
synchronisieren
-
wait second <>
LastSecond
-
LastSecond = second
-
-
'Zeile 1
-
lcd_param = 1 : gosub
LCD_GOTOLINE
-
-
'Temperatur-Regler
-
if TempMess < 5 then
goto ExitTemp
-
if TempMess > TempMax
then Heizung = off else if TempMess < TempMin then Heizung = on
-
#ExitTemp
-
'Umrechnung für
LCD-Anzeige
-
'Auf LCD anzeigen
-
lcd_param = NULL +
TempMess / 100 : gosub LCD_WRITECHAR
-
lcd_param = NULL +
(TempMess mod 100) / 10 : gosub LCD_WRITECHAR
-
lcd_param = PUNKT :
gosub LCD_WRITECHAR
-
lcd_param = NULL +
TempMess mod 10 : gosub LCD_WRITECHAR
-
lcd_param = GRAD : gosub
LCD_WRITECHAR
-
lcd_param = C_ : gosub
LCD_WRITECHAR
-
lcd_param = LEERZ :
gosub LCD_WRITECHAR
-
lcd_param = LEERZ :
gosub LCD_WRITECHAR
-
lcd_param = LEERZ :
gosub LCD_WRITECHAR
-
lcd_param = LEERZ :
gosub LCD_WRITECHAR
-
-
'pH-Regler
-
if pHMess < 5 then
goto ExitpH
-
if pHMess > pHMax
then CO2 = on else if pHMess < pHMin then CO2 = off
-
#ExitpH
-
'Umrechnung für
LCD-Anzeige
-
'Auf LCD anzeigen
-
lcd_param = NULL +
PHMess / 100 : gosub LCD_WRITECHAR
-
lcd_param = PUNKT :
gosub LCD_WRITECHAR
-
lcd_param = NULL +
(PHMess mod 100) / 10 : gosub LCD_WRITECHAR
-
lcd_param = NULL +
PHMess mod 10 : gosub LCD_WRITECHAR
-
lcd_param = kP : gosub
LCD_WRITECHAR
-
lcd_param = H_ : gosub
LCD_WRITECHAR
-
-
'Zeile 2
-
lcd_param = 2 : gosub
LCD_GOTOLINE
-
-
'Leitwert-Regler
-
if LeitMess < 5 then
goto ExitLeit
-
if LeitMess > LeitMax
then Osmose = on else if LeitMess < LeitMin then Osmose = off
-
'Salzwasser zuschalten,
wenn 1/3 Messbereich unterschritten und abschalten, wenn 2/3
erreicht.
-
if Osmose = off and
LeitMess < 1 * (LeitMax + LeitMin) / 3 then Salz = on
-
if Osmose = off and
LeitMess > 2 * (LeitMax + LeitMin) / 3 then Salz = off
-
#ExitLeit
-
'Umrechnung für
LCD-Anzeige
-
'Auf LCD anzeigen
-
lcd_param = NULL +
LeitMess / 100 : gosub LCD_WRITECHAR
-
lcd_param = NULL +
(LeitMess mod 100) / 10 : gosub LCD_WRITECHAR
-
lcd_param = NULL +
LeitMess mod 10 : gosub LCD_WRITECHAR
-
lcd_param = kU : gosub
LCD_WRITECHAR
-
lcd_param = S_ : gosub
LCD_WRITECHAR
-
lcd_param = LEERZ :
gosub LCD_WRITECHAR
-
lcd_param = LEERZ :
gosub LCD_WRITECHAR
-
lcd_param = LEERZ :
gosub LCD_WRITECHAR
-
lcd_param = LEERZ :
gosub LCD_WRITECHAR
-
lcd_param = LEERZ :
gosub LCD_WRITECHAR
-
lcd_param = LEERZ :
gosub LCD_WRITECHAR
-
-
'Redox-Regler
-
if RedMess < 5 then
goto ExitRed
-
if RedMess >= RedMax
then Ozon = off else if RedMess <= RedMin then Ozon = on 'nur
Alarmsignal setzen
-
#ExitRed
-
'Umrechnung für
LCD-Anzeige
-
'Auf LCD anzeigen
-
lcd_param = NULL +
RedMess / 100 : gosub LCD_WRITECHAR
-
lcd_param = NULL +
(RedMess mod 100) / 10 : gosub LCD_WRITECHAR
-
lcd_param = NULL +
RedMess mod 10 : gosub LCD_WRITECHAR
-
lcd_param = kM : gosub
LCD_WRITECHAR
-
lcd_param = V_ : gosub
LCD_WRITECHAR
-
-
'Zeile 3
-
lcd_param = 3 : gosub
LCD_GOTOLINE
-
-
'Datum/Uhrzeit
-
'Wochentag 1. Buchstabe
-
if dow = 1 or dow = 3
then lcd_param = M_
-
if dow = 2 or dow = 4
then lcd_param = D_
-
if dow = 5 then
lcd_param = F_
-
if dow = 6 or dow = 7
then lcd_param = S_
-
gosub LCD_WRITECHAR
-
'Wochentag 2. Buchstabe
-
if dow = 1 or dow = 4 or
dow = 7 then lcd_param = kO
-
if dow = 2 or dow = 3
then lcd_param = kI
-
if dow = 5 then
lcd_param = kR
-
if dow = 6 then
lcd_param = kA
-
gosub LCD_WRITECHAR
-
lcd_param = LEERZ
-
gosub LCD_WRITECHAR
-
'Uhrzeit:
-
lcd_param = NULL + hour
/ 10 : gosub LCD_WRITECHAR
-
lcd_param = NULL + hour
mod 10 : gosub LCD_WRITECHAR
-
lcd_param = DOPPELPUNKT
: gosub LCD_WRITECHAR
-
lcd_param = NULL +
minute / 10 : gosub LCD_WRITECHAR
-
lcd_param = NULL +
minute mod 10 : gosub LCD_WRITECHAR
-
lcd_param = DOPPELPUNKT
: gosub LCD_WRITECHAR
-
lcd_param = NULL +
second / 10 : gosub LCD_WRITECHAR
-
lcd_param = NULL +
second mod 10 : gosub LCD_WRITECHAR
-
-
'Zeile 4
-
lcd_param = 4 : gosub
LCD_GOTOLINE
-
-
'Pegelüberwachung
im AQ (PegMax) und im Filter (PegMin)
-
if PegMess < 5 then
goto ExitPeg
-
if (PegMess > PegMax
or PegMess < PegMin) then Pumpe = off else Pumpe = on
-
#ExitPeg
-
-
'Zeitsteuerung der
Beleuchtung
-
'Zeitperiode_1:
-
if (hMin_1 + mMin_1 = 0)
then goto ExitTime_1
-
if hMin_1 <= hMax_1
and mMin_1 <= mMax_1 then gosub Start_1LTEnd_1
-
if hMin_1 > hMax_1
then gosub Start_1GTEnd_1
-
#Start_1LTEnd_1
-
if hour >= hMin_1 and
minute >= mMin_1 then Licht = on else Licht = off
-
return
-
#Start_1GTEnd_1
-
if (hour >= hMin_1
and minute >= mMin_1) or (hour < hMax_1 and minute <
mMax_1) then Licht = on else Licht = off
-
return
-
#ExitTime_1
-
'Zeitperiode_2:
-
if (hMin_2 + hMin_2 = 0)
then goto ExitTime_2
-
if hMin_2 <= hMax_2
and mMin_2 <= mMax_2 then gosub Start_2LTEnd_2
-
if hMin_1 > hMax_1
then gosub Start_1GTEnd_1
-
#Start_2LTEnd_2
-
if hour >= hMin_2 and
minute >= mMin_2 then Licht = on else Licht = off
-
return
-
#Start_2GTEnd_2
-
if (hour >= hMin_2
and minute >= mMin_2) or (hour < hMax_2 and minute <
mMax_2) then Licht = on else Licht = off
-
return
-
#ExitTime_2
-
-
'RxD auf auf
Übertragungssignal testen
-
if RXD then gosub
TEST_RxD
-
-
goto MAINLOOP
-
-
-
-
'****************************************************************************************************
-
'***** TESTEN AUF
ANLIEGENDES RxD-Signal *****
-
'****************************************************************************************************
-
'Eine PC-Anfrage erfolgt
durch die Zeichenfolge:AT
-
'65 als 1. Prefix-Byte
(Dummy)= A
-
'84 als 2. Prefix-Byte
(Dummy)= T
-
'1,2,4,oder 8 als
Befehlsbyte für: 1=Datum/Uhrzeit lesen, 2=aktuelle Meßwerte
lesen, 4=EEprom lesen, 8=EEProm schreiben
-
'27 als zwingendes
Startbyte
-
'Ab hier folgen
unmittelbar die eigentlichen Datenbytes
-
-
#TEST_RxD
-
get command 'Eines der
oben definierten Vorspann- oder Befehlsbytes lesen
-
if command = 65 then
goto TEST_RxD 'A
-
if command = 84 then
goto TEST_RxD 'T
-
if Command = 1 then
gosub ReadClock
-
if Command = 2 then
gosub ReadCurrentValues
-
if Command = 4 then
gosub ReadConfigData
-
if Command = 8 then
gosub GetSaveConfigData
-
return
-
-
-
-
'****************************************************************************************************
-
'***** LESEN / SCHREIBEN
DER KONFIGURATION *****
-
'****************************************************************************************************
-
#ReadConfigData
'Konfigurationn aus EEPROM lesen und an PC senden (4)
-
get Startbyte
-
if Startbyte <> 27
then return
-
open# for read
-
#NextRead
-
input# Value
-
put Value
-
if not EOF then goto
NextRead
-
close#
-
return
-
-
#ReadCurrentValues
'Aktuelle Messwerte an PC senden (2)
-
get Startbyte
-
if Startbyte <> 27
then return
-
'Messwerte:
-
put TempMess
-
put pHMess
-
put LeitMess
-
put RedMess
-
put PegMess
-
return
-
-
#ReadClock 'Aktuelles
Datum und aktuelle Zeit an PC senden (1)
-
get Startbyte
-
if Startbyte <> 27
then return
-
put dow
-
put day
-
put month
-
put year
-
put hour
-
put minute
-
put second
-
return
-
-
#GetSaveConfigData
'Daten von PC empfangen und ins EEPROM schreiben (8)
-
get Startbyte
-
if Startbyte <> 27
then return
-
get TempMin 'Werte vom
PC empfangen und in Variable sichern
-
get TempMax
-
get pHMin
-
get pHMax
-
get LeitMin
-
get LeitMax
-
get RedMin
-
get Redmax
-
get PegMin
-
get PegMax
-
get hMin_1
-
get mMin_1
-
get hMax_1
-
get mMax_1
-
get hMin_2
-
get mMin_2
-
get hMax_2
-
get mMax_2
-
gosub SaveConfigData
'Daten ins EEPROM schreiben
-
return
-
#SaveConfigData
-
open# for write 'Werte
ins EEPROM schreiben
-
print# TempMin
-
print# TempMax
-
print# pHMin
-
print# pHMax
-
print# LeitMin
-
print# LeitMax
-
print# RedMin
-
print# Redmax
-
print# PegMin
-
print# PegMax
-
print# hMin_1
-
print# mMin_1
-
print# hMax_1
-
print# mMax_1
-
print# hMin_2
-
print# mMin_2
-
print# hMax_2
-
print# mMax_2
-
close#
-
return
-
-
-
-
'****************************************************************************************************
-
'***** PROGRAMM BEENDEN
*****
-
'****************************************************************************************************
-
END 'Programmende
-
-
-
-
'****************************************************************************************************
-
'***** TABELLEN *****
-
'****************************************************************************************************
-
'table TempTab
"TempTab.tab"
-
'table RedTab
"RedTab.tab"
-
'table pHTab "pHTab.tab"
-
'table LeitTab
"LeitTab.tab"
-
-
Eine Alternative mit
Datenlogger
für die Kommunikationssoftware AQUARIUS
ist ebenfalls Downloadbar.
-