Re: Temperatur Regelung Kategorie: Programmierung C (von Daneie - 1.03.2017 20:53) | |
Als Antwort auf Temperatur Regelung von Loui - 1.03.2017 13:08
| |
> Ich habe eine C-Control Pro Pro Mini Station > und zwei Temperatursensoren DS18S20 und möchte damit eine Heizung steuern kann mir jemand mit dem Programm helfen ? Hallo, mein Code ist für 4 OneWire-Leitungen, CRC, Fehlermeldung und Messwiedrholung bei Fehler geschrieben. Kopiere einfach das was du brauchst. Die Kommentare sollten alles erklären. Sub TempMessung(OWP1 As Byte, OWP2 As Byte, OWP3 As Byte, OWP4 As Byte, OWP5 As Byte) Dim vRet, O As Integer Thread_Lock(1) 'verhindert einen Thread-wechsel If OWP1 = True Then 'wurde der 1WirePort ausgewählt For O = 1 To 7 '7 Versuche für ein fehlerfreies Reseten der 1Wireports vRet = OneWire_Reset(1WirePort1) 'starten aller Fühler auf Port 1 If vRet = 0 And O = 7 Then 'ist beim 7. Versuch immer noch gestört vStoerung = 32 vStoerTextLCD1 = "Fehler 1WireP. 1" 'Störtext für LCD Zeile 1 vStoerTextLCD2 = "Auss Kess Vorl" 'Störtext für LCD Zeile 2 vTextSD = "1WirePort 1 Fehler Aussentemp. Kesselund Vorlauf St.Nr.32" 'Störtext für Protokolldatei Protokoll(0) 'Aktion in die Störprotokolldatei speichern StoerStop() 'stoppt das Programm und schaltet alles was sich bewegt ab ElseIf vRet = 1 Then 'wenn alles OK ist Exit End If Thread_Delay(O * 4) 'die Pause wird nach dem Fehler länger Next OneWire_Write(0xcc) 'ROM überspringen Kommando OneWire_Write(0x44) 'starte Temperaturmessung aller Fühler End If If OWP2 = True Then 'wurde der 1WirePort ausgewählt For O = 1 To 7 '7 Versuche für ein fehlerfreies Reseten der 1Wireports vRet = OneWire_Reset(1WirePort2) 'starten aller Fühler auf Port 2 If vRet = 0 And O = 7 Then 'ist beim 7. Versuch immer noch gestört vStoerung = 33 vStoerTextLCD1 = "Fehler 1WireP. 2" 'Störtext für LCD Zeile 1 vStoerTextLCD2 = "Wohnz. Gang" 'Störtext für LCD Zeile 2 vTextSD = "1WirePort 2 Fehler Wohnzimmer und Gang St.Nr.33" 'Störtext für Protokolldatei Protokoll(0) 'Aktion in die Störprotokolldatei speichern StoerStop() 'stoppt das Programm und schaltet alles was sich bewegt ab ElseIf vRet = 1 Then 'wenn alles OK ist Exit End If Thread_Delay(O * 4) 'die Pause wird nach dem Fehler länger Next OneWire_Write(0xcc) 'ROM überspringen Kommando OneWire_Write(0x44) 'starte Temperaturmessung aller Fühler End If If OWP3 = True Then 'wurde der 1WirePort ausgewählt For O = 1 To 7 '7 Versuche für ein fehlerfreies Reseten der 1Wireports vRet = OneWire_Reset(1WirePort3) 'starten aller Fühler auf Port 3 If vRet = 0 And O = 7 Then 'ist beim 7. Versuch immer noch gestört vStoerung = 34 vStoerTextLCD1 = "Fehler 1WireP. 3" 'Störtext für LCD Zeile 1 vStoerTextLCD2 = "Bad und WC" 'Störtext für LCD Zeile 2 vTextSD = "1WirePort 3 Fehler Bad und WC St.Nr.34" 'Störtext für Protokolldatei Protokoll(0) 'Aktion in die Störprotokolldatei speichern StoerStop() 'stoppt das Programm und schaltet alles was sich bewegt ab ElseIf vRet = 1 Then 'wenn alles OK ist Exit End If Thread_Delay(O * 4) 'die Pause wird nach dem Fehler länger Next OneWire_Write(0xcc) 'ROM überspringen Kommando OneWire_Write(0x44) 'starte Temperaturmessung aller Fühler End If If OWP4 = True Then 'wurde der 1WirePort ausgewählt For O = 1 To 7 '7 Versuche für ein fehlerfreies Reseten der 1Wireports vRet = OneWire_Reset(1WirePort4) 'starten aller Fühler auf Port 4 If vRet = 0 And O = 7 Then 'ist beim 7. Versuch immer noch gestört vStoerung = 35 vStoerTextLCD1 = "Fehler 1WireP. 4" 'Störtext für LCD Zeile 1 vStoerTextLCD2 = "Vorl.Ob u.Rückl" 'Störtext für LCD Zeile 2 vTextSD = "1WirePort 4 Vorlauf oben und alle Rückläufe St.Nr.35" 'Störtext für Protokolldatei Protokoll(0) 'Aktion in die Störprotokolldatei speichern StoerStop() 'stoppt das Programm und schaltet alles was sich bewegt ab ElseIf vRet = 1 Then 'wenn alles OK ist Exit End If Thread_Delay(O * 4) 'die Pause wird nach dem Fehler länger Next OneWire_Write(0xcc) 'ROM überspringen Kommando OneWire_Write(0x44) 'starte Temperaturmessung aller Fühler End If If OWP5 = True Then 'wurde der 1WirePort ausgewählt For O = 1 To 7 '7 Versuche für ein fehlerfreies Reseten der 1Wireports vRet = OneWire_Reset(1WirePort5) 'starten aller Fühler auf Port 5 If vRet = 0 And O = 7 Then 'ist beim 7. Versuch immer noch gestört vStoerung = 37 vStoerTextLCD1 = "Fehler 1WireP. 5" 'Störtext für LCD Zeile 1 vStoerTextLCD2 = "WarmWasser" 'Störtext für LCD Zeile 2 vTextSD = "1WirePort 5 WarmWasser St.Nr.37" 'Störtext für Protokolldatei Protokoll(0) 'Aktion in die Störprotokolldatei speichern StoerStop() 'stoppt das Programm und schaltet alles was sich bewegt ab ElseIf vRet = 1 Then 'wenn alles OK ist Exit End If Thread_Delay(O * 4) 'die Pause wird nach dem Fehler länger Next OneWire_Write(0xcc) 'ROM überspringen Kommando OneWire_Write(0x44) 'starte Temperaturmessung aller Fühler End If Thread_Lock(0) 'lässt den Thread-wechsel wieder zu Thread_Delay(70) 'warten bis Temperatur im Sensor gemessen und abgespeichert ist If OWP1 = True Then 'wurde der 1WirePort ausgewählt vTVorlUnten = TFuehlerLesen(1WirePort1,40,255,101,51,43,4,0,37,1,100,690) 'Fühler lesen vTAussen = TFuehlerLesen(1WirePort1,40,255,64,158,34,20,0,89,3,-310,450) vTKessel = TFuehlerLesen(1WirePort1,40,237,4,218,5,0,0,77,4,100,980) End If If OWP2 = True Then 'wurde der 1WirePort ausgewählt vTWWohnz = TFuehlerLesen(1WirePort2,40,255,48,105,44,4,0,219,5,70,320) 'Fühler lesen vTZWohnz = TFuehlerLesen(1WirePort2,40,255,11,67,44,4,0,68,6,70,320) vTBGang = TFuehlerLesen(1WirePort2,40,255,105,57,45,4,0,206,8,70,320) vTZGang = TFuehlerLesen(1WirePort2,40,82,130,217,5,0,0,177,9,70,320) End If If OWP3 = True Then 'wurde der 1WirePort ausgewählt vTBBad = TFuehlerLesen(1WirePort3,40,169,88,218,5,0,0,80,11,70,320) 'Fühler lesen vTZBad = TFuehlerLesen(1WirePort3,40,255,206,66,45,4,0,144,12,70,320) vTBWC = TFuehlerLesen(1WirePort3,40,176,43,217,5,0,0,54,14,70,320) vTZWC = TFuehlerLesen(1WirePort3,40,255,137,93,44,4,0,33,15,70,320) vTWWOben = TFuehlerLesen(1WirePort3,40,255,221,56,43,4,0,192,20,70,849) End If If OWP4 = True Then 'wurde der 1WirePort ausgewählt vTRWC = TFuehlerLesen(1WirePort4,40,236,239,217,5,0,0,88,16,70,400) 'Fühler lesen vTVorlOben = TFuehlerLesen(1WirePort4,40,255,96,70,45,4,0,15,2,80,550) vTRWohnz = TFuehlerLesen(1WirePort4,40,255,214,68,45,4,0,219,7,70,470) vTRGang = TFuehlerLesen(1WirePort4,40,255,133,235,21,20,0,36,10,70,400) vTRBad = TFuehlerLesen(1WirePort4,40,255,150,70,45,4,0,53,13,70,400) End If If OWP5 = True Then 'wurde der 1WirePort ausgewählt vTWWBoiler = TFuehlerLesen(1WirePort5,40,255,5,83,44,4,0,222,17,100,849) 'Fühler lesen vTWWVorl = TFuehlerLesen(1WirePort5,40,255,244,199,21,20,0,230,18,100,849) vTWWRueckl = TFuehlerLesen(1WirePort5,40,255,210,197,21,20,0,133,19,70,849) End If Thread_Delay(2) End Sub Sub TFuehlerLesen(Port As Byte, B1 As Byte, B2 As Byte, B3 As Byte, B4 As Byte, B5 As Byte, B6 As Byte, B7 As Byte, B8 As Byte, FNr As Byte, MinT As Integer, MaxT As Integer) As Integer Dim I As Integer Dim vScratchPad(10) As Byte Dim vTemp As Integer Dim vZ As Integer Dim vFZ, vFZ2 As Byte Dim vCRC As Byte Dim Schleifen_count, Bit_Count As Integer Dim Pruf_Byte, CRC, Wert_Bit, X As Byte vFZ = 0 : vFZ2 = 0 Lab Again Thread_Lock(1) Thread_Delay(3) OneWire_Reset(Port) 'starten aller Fühler OneWire_Write(0x55) 'Fühler bereitmachen zum Empfang der Adressbytes (Match ROM) OneWire_Write(B1) 'Adressbyte 0 OneWire_Write(B2) 'Adressbyte 1 OneWire_Write(B3) 'usw OneWire_Write(B4) OneWire_Write(B5) OneWire_Write(B6) OneWire_Write(B7) OneWire_Write(B8) OneWire_Write(0xbe) 'Befehl zum Scratchpad lesen (nur der angesprochene Fühler) For I = 0 To 8 'komplettes Scratchpad des angesprochenen vScratchPad(I)= OneWire_Read() 'Fühlers lesen Next Thread_Lock(0) vZ = vScratchPad(1) * 256 vZ = vZ + vScratchPad(0) vTemp = vZ * 0.6255 'Umrechnug für DS18B20 vTemp enhält die Temperatur in 1/10°C 'CRC berechnen vCRC = 0 For Schleifen_count = 0 To 7 'die 8 Byte werden berechnet (0-7) Bit_Count = 8 Pruf_Byte = vScratchPad(Schleifen_count) Do 'jedes Bit wird extra hinzuberechnet Wert_Bit = &H01 And (vCRC Xor Pruf_Byte) If Wert_Bit = 0x01 Then vCRC = vCRC Xor 0X18 '0X18= X^8+X^5+X^4+X^0 End If vCRC = 0x7F And (vCRC >> 1) If Wert_Bit = 0x01 Then vCRC = vCRC Or 0x80 End If Bit_Count-- Pruf_Byte = Pruf_Byte >> 1 Loop While Bit_Count Next I = MinT If vCRC <> vScratchPad(8) Or vTemp < I Or vTemp > MaxT Then 'berechnete Prüfzahl mit der übertragenen Prüfzahl vergleichen und Max und MinTemp. prüfen vFZ2 = vFZ2 + 1 'Fehler zählen If vFZ < 5 Then 'zählt die Versuche mit Wandlerbefehl If vFZ2 < 6 Then 'zählt die Lesewiederholungen Goto Again 'den Fühler noch einmal lesen End If vFZ2 = 0 'Lesewiederholungenszähler löschen OneWire_Reset(Port) 'starten aller Fühler OneWire_Write(0xcc) 'ROM überspringen Kommando OneWire_Write(0x44) 'starte Temperaturmessung aller Fühler Thread_Delay(80) 'warten bis Temperatur im Sensor gemessen und abgespeichert ist vFZ = vFZ + 1 'Fehler zählen Goto Again 'den Fühler noch einmal lesen End If Thread_Delay(200) '2sec Pause If vFZ > 4 And vFZ < 11 Then 'zählt weitere Versuche mit Wandlerbefehl If vFZ2 < 6 Then 'zählt die Lesewiederholungen Goto Again 'den Fühler noch einmal lesen End If OneWire_Reset(Port) 'starten aller Fühler OneWire_Write(0xcc) 'ROM überspringen Kommando OneWire_Write(0x44) 'starte Temperaturmessung aller Fühler Thread_Delay(80) 'warten bis Temperatur im Sensor gemessen und abgespeichert ist vFZ = vFZ + 1 'Fehler zählen Goto Again 'den Fühler noch einmal lesen End If Str_Printf(vTextSD,"Fehlerhafte Temperaturmessung: ScratshPad = %d %d %d %d %d %d %d %d %d",vScratchPad(0),vScratchPad(1),_ vScratchPad(2),vScratchPad(3),vScratchPad(4),vScratchPad(5),vScratchPad(6),vScratchPad(7),vScratchPad(8)) : Protokoll(0) vStoerTextLCD1 = "Temp.Sensor" 'Störtext für LCD Zeile 1 Select Case FNr 'selektiert nach der Fühlernummer Case 1 vStoerung = 60 'Fehlernummer des Fühlers vStoerTextLCD2 = "Vorl.Unten def" 'Störtext für LCD Zeile 2 vTextSD = "Temperaturfühler Vorlauf Unten gestört St.Nr.60" 'Störtext für Protokolldatei Case 2 vStoerung = 61 'Fehlernummer des Fühlers vStoerTextLCD2 = "Vorl.Oben def" 'Störtext für LCD Zeile 2 vTextSD = "Temperaturfühler Vorlauf Oben gestört St.Nr.61" 'Störtext für Protokolldatei Case 3 vStoerung = 62 'Fehlernummer des Fühlers vStoerTextLCD2 = "Aussent. def" 'Störtext für LCD Zeile 2 vTextSD = "Temperaturfühler Aussen gestört St.Nr.62" 'Störtext für Protokolldatei Case 4 vStoerung = 63 'Fehlernummer des Fühlers vStoerTextLCD2 = "Kessel def" 'Störtext für LCD Zeile 2 vTextSD = "Temperaturfühler Kessel gestört St.Nr.63" 'Störtext für Protokolldatei Case 5 vStoerung = 64 'Fehlernummer des Fühlers vStoerTextLCD2 = "Wo.Wand def" 'Störtext für LCD Zeile 2 vTextSD = "Temperaturfühler Wohnzimmer Wand gestört St.Nr.64" 'Störtext für Protokolldatei Case 6 vStoerung = 65 'Fehlernummer des Fühlers vStoerTextLCD2 = "Wo.Zimmer def" 'Störtext für LCD Zeile 2 vTextSD = "Temperaturfühler Wohnzimmer Zimmertemperatur gestört St.Nr.65" 'Störtext für Protokolldatei Case 7 vStoerung = 66 'Fehlernummer des Fühlers vStoerTextLCD2 = "Wo.Rueckl. def" 'Störtext für LCD Zeile 2 vTextSD = "Temperaturfühler Wohnzimmer Rücklauf gestört St.Nr.66" 'Störtext für Protokolldatei Case 8 vStoerung = 67 'Fehlernummer des Fühlers vStoerTextLCD2 = "Ga. Boden def" 'Störtext für LCD Zeile 2 vTextSD = "Temperaturfühler Gaang Boden gestört St.Nr.67" 'Störtext für Protokolldatei Case 9 vStoerung = 68 'Fehlernummer des Fühlers vStoerTextLCD2 = "Ga.Zimmer def" 'Störtext für LCD Zeile 2 vTextSD = "Temperaturfühler Gang Zimmertemp gestört St.Nr.68" 'Störtext für Protokolldatei Case 10 vStoerung = 69 'Fehlernummer des Fühlers vStoerTextLCD2 = "Ga.Rueckl. def" 'Störtext für LCD Zeile 2 vTextSD = "Temperaturfühler Gang Rücklauf gestört St.Nr.69" 'Störtext für Protokolldatei Case 11 vStoerung = 70 'Fehlernummer des Fühlers vStoerTextLCD2 = "Ba.Boden def" 'Störtext für LCD Zeile 2 vTextSD = "Temperaturfühler Bad Boden gestört St.Nr.70" 'Störtext für Protokolldatei Case 12 vStoerung = 71 'Fehlernummer des Fühlers vStoerTextLCD2 = "Ba.Zimmer def" 'Störtext für LCD Zeile 2 vTextSD = "Temperaturfühler Ba Zimmertemp. gestört St.Nr.71" 'Störtext für Protokolldatei Case 13 vStoerung = 72 'Fehlernummer des Fühlers vStoerTextLCD2 = "Ba.Rueckl. def" 'Störtext für LCD Zeile 2 vTextSD = "Temperaturfühler Bad Rücklauf gestört St.Nr.72" 'Störtext für Protokolldatei Case 14 vStoerung = 73 'Fehlernummer des Fühlers vStoerTextLCD2 = "WC Boden def" 'Störtext für LCD Zeile 2 vTextSD = "Temperaturfühler WC Boden gestört St.Nr.73" 'Störtext für Protokolldatei Case 15 vStoerung = 74 'Fehlernummer des Fühlers vStoerTextLCD2 = "WC Zimmer def" 'Störtext für LCD Zeile 2 vTextSD = "Temperaturfühler WC Zimmertemp. gestört St.Nr.74" 'Störtext für Protokolldatei Case 16 vStoerung = 75 'Fehlernummer des Fühlers vStoerTextLCD2 = "WC Rueckl. def" 'Störtext für LCD Zeile 2 vTextSD = "Temperaturfühler WC Rücklauf gestört St.Nr.75" 'Störtext für Protokolldatei Case 17 vStoerung = 76 'Fehlernummer des Fühlers vStoerTextLCD2 = "WW Boiler def" 'Störtext für LCD Zeile 2 vTextSD = "Temperaturfühler Warwasser Boiler gestört St.Nr.76" 'Störtext für Protokolldatei Case 18 vStoerung = 77 'Fehlernummer des Fühlers vStoerTextLCD2 = "WW Vorlauf def" 'Störtext für LCD Zeile 2 vTextSD = "Temperaturfühler Warwasser Vorlauf gestört St.Nr.77" 'Störtext für Protokolldatei Case 19 vStoerung = 78 'Fehlernummer des Fühlers vStoerTextLCD2 = "WW Rueckl. def" 'Störtext für LCD Zeile 2 vTextSD = "Temperaturfühler Warwasser Rücklauf gestört St.Nr.78" 'Störtext für Protokolldatei Case 20 vStoerung = 79 'Fehlernummer des Fühlers vStoerTextLCD2 = "WW Oben def" 'Störtext für LCD Zeile 2 vTextSD = "Temperaturfühler Warwasser Oben gestört St.Nr.79" 'Störtext für Protokolldatei End Select Protokoll(0) 'Störung in Protokolldatei speichern StoerStop() 'stoppt das Programm und schaltet alles was sich bewegt ab End If Return vTemp 'die Temperatur zurückgeben End Sub | |
Antwort schreiben Antworten: |
Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum