Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum

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: