Das Open-Control-Projekt - Die Alternative zur C-Control-I


Das Forum zur C-Control-1
Welche C-Control-Varianten existieren?
Übersicht - Suchen - Neueste 50 Beiträge - Neuer Beitrag - Login - Registrieren
INFO - FAQ - CC2-Forum - CCPro-Forum 

 Re: Überschneidung von Variablen Kategorie: Programmierung Basic (von Laika - 7.04.2007 12:20)
 Als Antwort auf Überschneidung von Variablen von Leo - 6.04.2007 22:24
Laika nutzt:  CC1-Unit V1.1
Hallo Leo,

die Variablenverwaltung ist nicht nur bei CCBASIC eine heikle Sache, sondern auch allgemein. Bei CCBASIC ist die Beschränkung auf 24 Variablen ein sehr unangenehmes Problem.
Folgend meine Variablendefinitionen, die dir als Beispiel dienen mögen. Wie schon mein Vorredner sagte haben die Variablen und Ports nix miteinander zu tun. Wenn du nicht aufpasst, hast du auch eine Überschneidung zwischen Bit-, Byte- und Wortvariablen, unkontrollierte Veränderungen passieren leicht.


'*** Variablen  ************************************************************************
'word 1
define bitvar1 word    '16 Bit für Bitmerker; hier an ERSTER Stelle, da die
                       'folgenden Bit-Def's zwingend eine Bitnr. haben müssen.

  define vorher_be_1   byte[1]   'Vergleichsbyte für die "schnellen" Digitaleingaben
                                 '==> "cast" auf die folgenden Bitmerker zur
                                 '    schnellen Abfrage in der Sekundenschleife

  'ACHTUNG: Die Belegung der folgenden 8 Bitmerker ist angepaßt an die DE 1 - 8 !!
  '         Siehe oben bei Port-Def's.
'  define    bit[1]     'da liegt das MUX-Select-Signal drauf
                        'könnte aber für irgendwas verwendet werden
  define rn_vorher     bit[2]   'RN-Zustand vorheriger Zyklus (Flankenerkennung)
'  define      bit[3]   '
  define ww_vorher     bit[4]   'Merker für WW-Boiler
  define ht_vorher     bit[5]   'Haustür-Zustand vorheriger Zyklus
  define quit_vorher   bit[6]   'Merker für nicht quittierten Anlagen-Fehler
  define netz_vorher   bit[7]   'DE-Netzausfall vorheriger Zyklus
  define fehler_vorher bit[8]   'Fehler vorheriger Zyklus

  define bit1          bit[9]   'allgemeine
  define bit2          bit[10]  '  Bitmerker
  define ww_war_schon  bit[11]  'Merker, dass WW-Boiler schon eingeschaltet war
  define start         bit[12]  'Programmstart-, Erstlaufkennung
  define start_tag     bit[13]  'erster Tag nach Start bis RN-kommen
  define sh_vorher     bit[14]  'Merker für HzEntlade, damit der Mischer etwas zugefahren wird
  define urlaubs_bit   bit[15]  '= HI, wenn Urlaubsabsenkung
  define bit16_nbel     bit[16]  '

' ACHTUNG: Wegen der direkten "casts" der Variablen aufeinander, die folgenden Definitionen
'          nur mit großer Vorsicht ändern !!
'word 2
define i1              word     'allgemeine Integer-Variable
define b1_i1           byte[3]  'gecastete Byte-Variablen: Das Lesen EEPROM erfolgt
define b2_i1           byte[4]  '  "word"-weise, 'bx_i1' erlaubt einfachen Bytezugriff
                                '  auf das linke/rechte Byte eines gelesenen Wortes
'word 3
define i2              word     'allgemeine Integer-Variable
define b1_i2           byte[5]  'gecastete Byte-Variablen
define b2_i2           byte[6]  '

'word 4
define i3              word     'allgemeine Integer- und
define b1_i3           byte[7]  'gecastete Byte-Variablen
define b2_i3           byte[8]  '

'word 5
define tmit            word     'Tagesmittelwert, wird stündlich aktualisiert/aufsummiert
                                'tmit ist Fertigwert und hat IMMER den Faktor 10 !!
'word 6
define m_w_erf         word     'erforderliche Aufladeenergie in kWh; Benutzung NUR in 'Sub rn'
define m_sel_send      word[6]  'selektives Senden von daten an den PC; Benutzung NUR bei Bedienung
define m_stellgroesse  word[6]  'Stellgröße für Mischerlaufzeit-Berechnung
define m_anlaufkennung byte[11] 'Anlaufkennung bei der Datums- + Uhrzeiteingabe, wird NUR bei Anlauf benutzt
define m_xxx           byte[12] 'noch frei

'word 7
define wartezeit       word     'Wartezeit bis zum Einschalten der Aufladung in min

'word 8
define tmax            byte     'Aussentemp. Rohwert: Tagesmaximal- und
define tmin            byte     '  -minimaltemperatur

'word 9
define letzte_sekunde  byte     'Merker, zum Prüfen auf "Minutenwechsel"
define letzte_minute   byte     'Merker, zum Prüfen auf "Stundenwechsel"

'word 10
define letzte_stunde   byte     'Merker, zum Prüfen auf "Tageswechsel"
define byte20  byte     '

'word 11
define ereignisklasse  byte     '8 Bit für Ereignisklassen
define byte22          byte     '

'word 12
define mischerlaufzeit byte     'Mischerlaufzeit in sek, wird im Minutenzyklus gesetzt, im
                                '  Sek.zyklus dekrementiert, geprüft und der Mischer ggf. ausgeschaltet
define tv_vorher       byte     'Vorlauftemp. Rohwert vorheriger Zyklus für die Differenzbildung


Nach diversen Problemen habe ich die Variablen mit der Wortnr. kommentiert. Es erscheint zweckmäßig, alle Variablen mit einer Nummer [nr] zu definieren. So wie oben muss man aufpassen, das die Belegung stimmt, da der Compiler sonst einen anderen Speicherplatz belegt!
Einige Variablen habe ich mit "m_..." begonnen. Das sind "mehrfach benutzte Variablen", die zwar über eine längere Codestrecke für einen bestimmten Zweck benutzt werden, mit den im gleichen Wort/Byte liegenden anderen "m_..."-Variablen aber nicht ins Gehege kommen können, da sie bei völlig unabhängigen Programmdurchläufen benutzt werden.

Ist ein bisschen viel, aber wirst es schon schaffen.

Gruß und schöne Ostern
Laika

 Antwort schreiben

Bisherige Antworten:

DllSwitcher auf Idel's Homepage oder OCBASIC (von Dietmar - 7.04.2007 21:01)