INFO - FAQ - CC2-Forum - CCPro-Forum |
Hier mein Programm: Hoffe, es hilft und die Erklärungen reichen ' C-Control STATION + WinRemote + Terminalprogrammm '************************************************************* ' K1 Schaltet LSR ' K2 Schaltet Lüfter (Dimmer überbrücken) ' D1 Schaltet NDL über Relais/Schütz ' Temp1 überwacht das VSA ' Temp2 überwacht (NDL) ' F1 = Menuwahl (Blatt) zum Werte ändern (EIN/AUS- Temperatur u.-zeit) ' F2 = Wert Plus ' F3 = Wert Minus ' F4 = sendet alle aktuellen Werte an Terminal (wenn Blatt = 0) ' F4 = sendet alle gespeicherte Daten an PC (wenn Blatt=7) ' F4 = Speicher löschen (wenn Blatt=8) ' F4+Blatt=9 schaltet D1 EIN/AUS (NDL) ' F4+Blatt=10 schaltet K1 EIN/AUS (LSR) ' F4+Blatt=11 schaltet K2 EIN/AUS (Lüfter) '************************************************************* ' Programmabschnitt 1: ' Die Standard-Definitionen der Ports '************************************************************* 'die Analogports define A1 AD[1] define A2 AD[2] define A3 AD[3] define A4 AD[4] define Temp1 AD[5] define Temp2 AD[6] define AKKU AD[7] define NETZ AD[8] 'die Digitalports define D1 port[1] define D2 port[2] define D3 port[3] define D4 port[4] define D5 port[5] define D6 port[6] ' die Relais define K1 port[7] define K2 port[8] ' die Folien-Funktionstasten define F1 port[9] define F2 port[10] define F3 port[11] define F4 port[12] ' die LEDs define LED1 port[13] define LED2 port[14] define LED3 port[15] define LED4 port[16] '************************************************************* ' Die Definitionen für das Remote-Modul... '************************************************************* ' alle Digital-Port auf einmal define DPort WordPort[1] '************************************************************* ' Programmabschnitt 2: ' Port-(Re-)Definitionen des Anwenders (optional) ' wer möchte kann hie die Ports mit eigenen Namen versehen... '************************************************************* ' hier steht Ihr Quellcode... '************************************************************* ' Programmabschnitt 3: ' Variablen & Konstanten für die Fernbedienung... '************************************************************* ' Arbeitsspeicher als Words ' dient nur zum Auslesen des Arbeitsspeichers. ' Ihr Programm kann den Speicher wie gewohnt ' einteilen und verwenden... define W1 word[1] define W2 word[2] define W3 word[3] define W4 word[4] define W5 word[5] define W6 word[6] define W7 word[7] define W8 word[8] define W9 word[9] define W10 word[10] define W11 word[11] define W12 word[12] ' Variablen RESERVIERT für Remote Control: ' Das Remote Modul benötigt lediglich zwei Bit, ' ein Byte und ein Word des Speichers... define Connected Bit[1] '=ON, wenn Verbindung zur PC-Software besteht define ModemBetrieb Bit[2] '=ON für Modemverb. =OFF für COM-Direktverb. define ReceiveByte Byte[2] 'nimmt Daten von der Schnittstelle auf define AltDPort word[2] 'Zustandsspeicher für 'DPORT' '************************************************************* ' Programmabschnitt 4: ' Variablen & Konstanten des Anwenders ' Sie können den Speicher wie gewohnt einteilen und ' verwenden. Achten Sie aber darauf, daß keine Überschneidungen ' mit den reservierten Variablen auftreten... '************************************************************* define T1 word [3] 'Temperatur Vergleichsvariabeln define T2 word [4] define D1EinStunde byte [9] define D1EinMinute byte [10] define D1AusStunde byte [11] define D1AusMinute byte [12] define K1EinStunde byte [13] define K1EinMinute byte [14] define K1AusStunde byte [15] define K1AusMinute byte [16] define Blatt byte [17] define LuefterEin byte [18] define LuefterAus byte [19] 'define VentiEin byte [20] 'define VentiAus byte [21] define flag bit [3]'[191] define NotStop bit [4]'[192] '************************************************************* ' Programmabschnitt 5: ' Initialisierung der Fernbedienung '************************************************************* #Anfang '!!!!!!!!!!!!!!! ModemBetrieb=OFF ' je nach Bedarf setzten!!!! ON= Modembetrieb; OFF= COM-Direktverbindung '!!!!!!!!!!!!!!! Connected=OFF ' zunächst keine Verbindung gosub initModem ' ggf. Modem empfangsbereit machen gosub OnDPortChange 'gosub OnTimeChange '************************************************************* ' Programmabschnitt 6: '************************************************************* 'änderbare Konstanten D1EinStunde = 10 : D1EinMinute = 0 D1AusStunde = 12 : D1AusMinute = 0 K1EinStunde = 11 : K1EinMinute = 0 K1AusStunde = 13 : K1AusMinute = 0 LuefterEin = 27 : LuefterAus = 25 '°C 'VentiEin = 2 'VentiAus = 15 'feste Konstanten define TempAlarmVSA 60 '°C define TempAlarmNDL 32 '°C define TempMaxVSA 85 '°C define TempMaxNDL 40 '°C define TempEinVSA 35 define TempEinNDL 25 'Anfangszustände K1 = OFF K2 = OFF D1 = OFF D1 = off D2 = off D3 = off D4 = off D5 = off D6 = off flag = Off Notstop = Off Blatt = 0 open# for write close# '************************************************************* ' Programmabschnitt 7: ' Hauptschleife '************************************************************* #loop 'gosub Remote 'Remote-Prozess regelmäßig aufrufen! gosub CheckTasten T1=temp1*5-250 'Umrechnung eines Byte- Wertes auf eine Temperatur in 1/10 °C T2=temp2*5-250 '********************* Einschaltbedingungen ********************************** '****** NDL ******** If Hour =D1EinStunde and Minute =D1EinMinute and NotStop=Off then gosub D1Ein If Hour =D1AusStunde and Minute =D1AusMinute then gosub D1Aus '****** LSR ******** If Hour =K1EinStunde and Minute =K1EinMinute then gosub K1Ein If Hour =K1AusStunde and Minute =K1AusMinute then gosub K1Aus '****** LTI ******** If T2 >= LuefterEin*10 and K2=Off then gosub K2Ein If T2 <= LuefterAus*10 and K2=On then gosub K2Aus '****** Venti ******** ' If Hour mod VentiEin = 0 and minute mod (VentiAus-1) = 0 then D2=On ' If minute mod (VentiAus-1) = 1 then D2=Off '**** Speichern gehen **** if (Flag = Off) and (minute mod 15 = 0) then gosub OnTimeChange 'wenn Minuten durch 5 = 0 (5, 10, 15 usw.) und Werte für diese 5-min noch 'nicht gespeichert dann Werte abspeichern if (Flag = On) and (minute mod 15 = 1)then Flag = Off 'wenn Minuten durch 5 = 1 (6, 16, 21 usw. dann Anzeiger für diesen fünf-min-Wert gespeichert 'zurücksetzen '************************* '**** Alarm und abschalten wenn zu warm **** If (T1 >= TempMaxVSA*10 or T2 >= TempMaxNDL*10) then goto Ueberhitzt If (T1 >=TempAlarmVSA*10 or T2 >= TempAlarmNDL*10) then goto Alarm 'Alarm wenns zu warm wird If (T1 <= TempEinVSA*10) and (T2 <= TempEinNDL*10) then Notstop=Off goto loop '************************************************************* ' Ende Hautschleife '************************************************************* '************************************************************* ' Programmabschnitt 8: ' Unterprogramme des Anwenderprogramms ' Ab hier stehen Ihre eigenen Subroutinen.... '************************************************************* #D1Ein D1=on: LED1=On return #D1Aus D1=off: LED1=Off return #K1Ein K1=On return #K1Aus K1=Off return #K2Ein K2=On return #K2Aus K2=Off return '**** abschalten wenns zuuu warm wird #Ueberhitzt Notstop = On 'Notstop EIN damit auch nix mehr eingeschaltet wird D1=OFF TOG LED4 TOG LED1 TOG LED2 TOG LED3 return #Alarm Beep 100,5,0 goto loop return #checkTasten If F1=on then goto MenuBlaettern wait F1=Off If F3=on then goto WertMinus If F2=on then goto WertPlus If F4=on and Blatt = 0 then goto SendeDatenAnPC If F4=on and Blatt = 7 then goto SendeSpeicher If F4=on and Blatt = 8 then goto SpeicherLoeschen 'wait F4=on 'ab hier neu If F4=On and Blatt=9 then Tog D1 If F4=On and Blatt=10 then Tog K1 If F4=On and Blatt=11 then Tog K2 wait F4=Off return #SendeSpeicher open# for read #ReadBlock 'T1=temp1*5-250 'T2=temp2*5-250 Input# hour Input# minute Input# T1 Input# T2 print hour;":"; Minute, T1/10;",";((T1 Mod 10)), T2/10;",";((T2 Mod 10)) If not EOF then goto ReadBlock close# Beep 100, 10, 3 Beep 100, 10, 3 goto Loop 'return #SpeicherLoeschen open# for write close# Beep 100,10,0 Beep 200,10,0 Beep 300,10,0 Beep 400,10,0 Beep 500,10,0 Beep 600,10,0 print "Speicher gelöscht!" Blatt=0 print "F4=Aktuelle Werte an PC" goto Loop 'return #SendeDatenAnPC print "" print "WinRemote_wirklich_nicht_gestestet_b.bas" If Dow = 1 then print "Montag ";Day;".";Month;".";"200";Year;" ";"Zeit:";" ";Hour;":";Minute;":";Second If Dow = 2 then print "Dienstag ";Day;".";Month;".";"200";Year;" ";"Zeit:";" ";Hour;":";Minute;":";Second If Dow = 3 then print "Mittwoch ";Day;".";Month;".";"200";Year;" ";"Zeit:";" ";Hour;":";Minute;":";Second If Dow = 4 then print "Donnerstag ";Day;".";Month;".";"200";Year;" ";"Zeit:";" ";Hour;":";Minute;":";Second If Dow = 5 then print "Freitag ";Day;".";Month;".";"200";Year;" ";"Zeit:";" ";Hour;":";Minute;":";Second If Dow = 6 then print "Samstag ";Day;".";Month;".";"200";Year;" ";"Zeit:";" ";Hour;":";Minute;":";Second If Dow = 0 then print "Sonntag ";Day;".";Month;".";"200";Year;" ";"Zeit:";" ";Hour;":";Minute;":";Second print "" print "Sollwerte:";" ";"(Variablen/Konstanten)" print "D1Ein:";" ";D1EinStunde;":";D1EinMinute;" ";"Uhr" print "D1Aus:";" ";D1AusStunde;":";D1AusMinute;" ";"Uhr" print "K1Ein:";" ";K1EinStunde;":";K1EinMinute;" ";"Uhr" print "K1Aus:";" ";K1AusStunde;":";K1AusMinute;" ";"Uhr" print "LüfterEin:";" ";LuefterEin;" ";"°C" print "LüfterAus:";" ";LuefterAus;" ";"°C" print "Aktuelle Werte:" Print "TempVSA:";" ";T1/10;",";(T1 Mod 10);"°C" Print "TempNDL:";" ";T2/10;",";((T2 Mod 10));"°C" print "Time:";" ";hour;":"minute print "Date:";" "; Day;":";month;".";"0";year Beep 10, 100, 0 pause 10 goto Loop return '************** Werte Ändern ********************** #MenuBlaettern 'Blatt, Seite, Zähler, Variable oder wie auch immer Blatt=Blatt+1 If Blatt>=12 then Blatt=0 If Blatt=0 then print "F4=Aktuelle Werte an PC" If Blatt=1 then print "1 ändere D1Ein (NDL) +F2,-F3" If Blatt=2 then print "2 ändere D1Aus (NDL) +F2,-F3" If Blatt=3 then print "3 ändere K1Ein (LSR) +F2,-F3" If Blatt=4 then print "4 ändere K1Aus (LSR) +F2,-F3" If Blatt=5 then print "5 ändere K2Ein (Lüfter) +F2,-F3" If Blatt=6 then print "6 ändere K2Aus (Lüfter) +F2,-F3" If Blatt=7 then print "7 F4=Sende Speicher an PC" If Blatt=8 then print "8 F4=Speicher löschen" If Blatt=9 then print "9 TOGGLE D1/F4" If Blatt=10 then print "10 TOGGLE K1/F4" If Blatt=11 then print "11 TOGGLE K2/F4" wait F1=off return #WertMinus pause 5 If Blatt=1 then D1EinMinute=D1EinMinute-1 If D1EinMinute >=60 then D1EinMinute=59 If Blatt=1 and D1EinMinute=59 then D1EinStunde=D1EinStunde-1 If D1EinStunde >=24 then D1EinStunde=23 If Blatt=2 then D1AusMinute=D1AusMinute-1 If D1AusMinute >=60 then D1AusMinute=59 If Blatt=2 and D1AusMinute=59 then D1AusStunde=D1ausStunde-1 If D1AusStunde >=24 then D1AusStunde=23 If Blatt=3 then K1EinMinute=K1EinMinute-1 If K1EinMinute >=60 then K1EinMinute=59 If Blatt=3 and K1EinMinute=59 then K1EinStunde=K1EinStunde-1 If K1EinStunde >=24 then K1EinStunde=23 If Blatt=4 then K1AusMinute=K1AusMinute-1 If K1AusMinute >=60 then K1AusMinute=59 If Blatt=4 and K1AusMinute=59 then K1AusStunde=K1AusStunde-1 If K1AusStunde >=24 then K1AusStunde=23 If Blatt=5 and LuefterEin >=1 then LuefterEin=LuefterEin-1 If LuefterEin=0 then LuefterEin=0 If Blatt=6 and LuefterAus >=1 then LuefterAus=LuefterAus-1 If LuefterAus=0 then LuefterAus=0 gosub Ausgabe return #WertPlus pause 5 If Blatt=1 then D1EinMinute=D1EinMinute+1 If D1EinMinute>=60 then D1EinMinute=0 If Blatt=1 and D1EinMinute=0 then D1EinStunde=D1EinStunde+1 If D1EinStunde >=24 then D1EinStunde=0 If Blatt=2 then D1AusMinute=D1AusMinute+1 If D1AusMinute>=60 then D1AusMinute=0 If Blatt=2 and D1AusMinute=0 then D1AusStunde=D1AusStunde+1 If D1AusStunde >=24 then D1AusStunde=0 If Blatt=3 then K1EinMinute=K1EinMinute+1 If K1EinMinute>=60 then K1EinMinute=0 If Blatt=3 and K1EinMinute=0 then K1EinStunde=K1EinStunde+1 If K1EinStunde >=24 then K1EinStunde=0 If Blatt=4 then K1AusMinute=K1AusMinute+1 If K1AusMinute>=60 then K1AusMinute=0 If Blatt=4 and K1AusMinute=0 then K1AusStunde=K1AusStunde+1 If K1AusStunde >=24 then K1AusStunde=0 If Blatt=5 then LuefterEin=LuefterEin+1 If LuefterEin>=102 then LuefterEin=102 If Blatt=6 then LuefterAus=LuefterAus+1 If LuefterAus>=102 then LuefterAus=102 gosub Ausgabe return #Ausgabe If Blatt=1 then print "D1Ein:";" ";D1EinStunde;":";D1EinMinute If Blatt=2 then print "D1Aus:";" ";D1AusStunde;":";D1AusMinute If Blatt=3 then print "K1Ein:";" ";K1EinStunde;":";K1EinMinute If Blatt=4 then print "K1Aus:";" ";K1AusStunde;":";K1AusMinute If Blatt=5 then print "LüfterEin:";" ";LuefterEin;" ";"°C" If Blatt=6 then print "LüfterAus:";" ";LuefterAus;" ";"°C" return '************************************************************* '------------- Ende des Anwender-Routinen ------------- '************************************************************* '************************************************************* ' Programmabschnitt 9: Unterprogramme der Fernbedienung ' Diese Routinen werden für die Fernsteuerung benötigt! '************************************************************* #Remote ' muß regelmaßig von der Hauptschleife aufgerufen werden if RXD then gosub OnRXD ' Zeichen von Schnittstelle vorhanden if AltDPort<>DPort then gosub OnDPortChange ' Änderungen der 16 Digital-Ports übertragen 'if (second=0) and (Connected) then gosub OnTimeChange ' Einmal pro Minute Datum&Zeit senden... return #OnDPortChange ' Veränderungen an Taste, LED und Digitalport zum PC melden altDPort=DPort ' Zustand merken if Connected then print "Port:";DPort ' return #OnRXD ' Zeichen von Schnittstelle empfangen und auswerten Get ReceiveByte ' Byte einlesen If ReceiveByte=67 then gosub Connect 'C= Verbindung mit Remote-Software herstellen if not Connected then return ' zurück, falls keine Verbindun besteht If ReceiveByte=68 then gosub Disconnect 'D= Verbindung mit Remote-Software beenden' ' Tastendruck am viruellen Bedienfeld auwerten.... If ReceiveByte=97 then gosub onV1Down 'a= V1 wurde gedrückt' If ReceiveByte=98 then gosub onV2Down 'b= V2 wurde gedrückt' If ReceiveByte=99 then gosub onV3Down 'c= V3 " If ReceiveByte=100 then gosub onV4Down 'd= V4 " If ReceiveByte=101 then gosub onV5Down 'e= V5 " If ReceiveByte=102 then gosub onV6Down 'f= V6 " If ReceiveByte=103 then gosub onV7Down 'g= V7 " If ReceiveByte=104 then gosub onV8Down 'h= V8 " If ReceiveByte=105 then gosub onV1Up 'i= V1 wurde losgelassen If ReceiveByte=106 then gosub onV2Up 'j= V2 wurde losgelassen If ReceiveByte=107 then gosub onV3Up 'k= V3 " If ReceiveByte=108 then gosub onV4Up 'l= V4 " If ReceiveByte=109 then gosub onV5Up 'm= V5 " If ReceiveByte=110 then gosub onV6Up 'n= V6 " If ReceiveByte=111 then gosub onV7Up 'o= V7 " If ReceiveByte=112 then gosub onV8Up 'p= V8 " ' Port auf Ausgang simuliert Tastendruck ... If ReceiveByte=49 then F1=Off '1= F1 wurde gedrückt If ReceiveByte=50 then F2=Off '2= F2 " If ReceiveByte=51 then F3=Off '3= F3 " If ReceiveByte=52 then F4=Off '4= F4 " ' Port beim Loslassen wieder auf Eingang schalten... If ReceiveByte=87 then Deact F1 'W= F1 wurde losgelassen If ReceiveByte=88 then Deact F2 'X= F2 " If ReceiveByte=89 then Deact F3 'Y= F3 " If ReceiveByte=90 then Deact F4 'Z= F4 " ' Sonstige Zustände auf Anforderung senden.... If ReceiveByte=65 then gosub sendAnalogPorts 'A= Analogports wurden angefordert If ReceiveByte=70 then print "Freq2:";Freq2 'F= Freq2 If ReceiveByte=71 then print "Freq1:";Freq 'G= Freq If ReceiveByte=77 then gosub sendMem 'M= Arbeitspeicher If ReceiveByte=80 then print "Port:";DPort 'P= Digitalports If ReceiveByte=84 then gosub PCZeit 'T= Uhrzeit & Datum zum PC übertragen If ReceiveByte=85 then gosub ReceiveTime 'U= Zeit vom PC empfangen If ReceiveByte=86 then gosub ReceiveDate 'V= Datum vom PC empfangen return #Connect 'wenn Verbindung angefordert.... Beep 100,10,0 Connected=On ' Verbindung aktivieren Print "C:+" ' Verbindung bestätigen return #Disconnect Connected=OFF ' Verbindung trennen Print "C:-" ' Trennung bestätigen Beep 200,10,0 if ModemBetrieb=OFF then return ' zurück, wenn Direkverbindung Pause 100 Print "+++" ' Modem in Befehlsmodus Pause 100 Print "ATH" ' Modem Reset... gosub InitModem ' ...und neu initialisieren return #OnTimeChange ' C-Control-Zeit zum PC melden... flag=On If Filefree >=3 then gosub speichern return #speichern open# for append print# hour print# minute print# T1 print# T2 close# return #sendAnalogPorts ' Analog-Ports zum PC melden... Print "A1:";A1 Print "A2:";A2 Print "A3:";A3 Print "A4:";A4 Print "A5:";Temp1 Print "A6:";Temp2 Print "A7:";Akku Print "A8:";Netz return #PCZeit print "Time:";Hour;":";Minute;":";Second print "Date:";Day;".";Month;".";Year;"-";DOW return #ReceiveTime ' Uhrzeit vom PC übernehmen Get Hour Get Minute Get Second return #ReceiveDate ' Datum vom PC übernehmen Get Day Get Month Get Year Get Dow return #sendMem ' Arbeitsspeicher zum PC melden... print "W1:";W1 print "W2:";W2 print "W3:";W3 print "W4:";W4 print "W5:";W5 print "W6:";W6 print "W7:";W7 print "W8:";W8 print "W9:";W9 print "W10:";W10 print "W11:";W11 print "W12:";W12 return #initModem ' Modem initialisieren if ModemBetrieb=OFF then return ' zurück bei Direktverbindung Baud R4800 ' höhere Baudraten funktionieren mit vielen Modems leider nicht! Print "ATZ" ' Modem-Reset Beep 200,10,0 Pause 150 Print "AT Q1" ' keine Modemantworten Beep 200,10,0 Pause 150 Print "AT E0" ' Kommandos nicht wiedergeben Beep 200,10,0 Pause 150 Print "AT &D0" ' DTR ignorieren Beep 200,10,0 Pause 150 Print "AT &K0" ' Flußkontrolle aus Beep 200,10,0 Pause 150 Print "AT S0=1" ' automatische Anrufannahme Beep 150,10,0 Pause 100 #PufferLeeren if not RXD then return ' zurück, wenn Puffer leer Get ReceiveByte ' sonst unnötige Zeichen auslesen Goto PufferLeeren ' solange bis Empfangs-Puffer leer ist '************************************************************* ' Programmabschnitt 10: Virtuelles Bedienfeld ' Diese Routinen werden angesprungen, wenn Tasten am ' virtuellen Bedienfeld betätigt werden, und können ' mit eigenem Programmcode gefüllt werden...... '************************************************************* ' beim Herunterdrücken der Tasten.... #onV1Down ' V1 wurde gedrückt... return #onV2Down ' V2 wurde gedrückt... return #onV3Down ' V3 wurde gedrückt... return #onV4Down ' V4 wurde gedrückt... return #onV5Down return #onV6Down ' V6 wurde gedrückt... return #onV7Down ' V7 wurde gedrückt... return #onV8Down return ' beim Loslassen der Tasten...... #onV1Up ' V1 wurde losgelassen... return #onV2Up ' V2 wurde losgelassen... return #onV3Up ' V3 wurde losgelassen... return #onV4Up ' V4 wurde losgelassen... ' hier steht Ihr Quellcode... return #onV5Up ' V5 wurde losgelassen... return #onV6Up ' V6 wurde losgelassen... return #onV7Up ' V7 wurde losgelassen... return #onV8Up ' V8 wurde losgelassen... return |
Antwort schreiben |