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.