Kommentar: Einfügen von HTML im Kommentar: Link einfügen: <a href="LINKURL" target="_blank">LINKTITEL</a> Bild einfügen: <img src="BILDURL"> Text formatieren: <b>fetter Text</b> <i>kursiver Text</i> <u>unterstrichener Text</u> Kombinationen sind auch möglich z.B.: <b><i>fetter & kursiver Text</i></b> C Quellcode formatieren: <code>Quellcode</code> BASIC Quellcode formatieren: <basic>Quellcode</basic> (Innerhalb eines Quellcodeabschnitts ist kein html möglich.) Wichtig: Bitte mache Zeilenumbrüche, bevor Du am rechten Rand des Eingabefeldes ankommst ! -> I > > 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. > > <basic>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</basic>