CODESYS und NTC Widerstand

entenhausen_dd

Level-2
Beiträge
55
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,
ich bin gerade dabei in CODESYS einen NTC Widerstand auszuwerten. Vom Hersteller habe ich die Tabelle wie die Werte dann umzurechnen sind. Ich dachte mir man hinterlegt diese Tabelle, die dann eine Kurve ergibt und der wahre Wert ergibt sich dann aus der Kurve. Hat da jemand eine Lösung für mich

Vielen Dank!
 
Hallo,

hier ein Lösungsvorschlag der allerdings noch Verbesserungen zulässt.
1. Die Interpolation zwischen zwei Werten erfolgt linear.
(Berechnung verbessern)
2. Liegt der Widerstandswert außerhalb der Tabelle wird 0 zurückgegeben was ja einem gültigen Wert entspricht.
(Rückgabewert als Struktur mit zusätzlichem x_Valid:BOOL; )

Code:
FUNCTION Fun_GetNTCSensorTemp_Real : Real 
VAR_INPUT 
    r_Resistance: REAL;                //Widerstand  
END_VAR 
VAR 
    by_i: BYTE;                        //Increment Variable 
    r_TC:REAL;                        //Errechneter Temperaturkoefizient ermittelten Widerstandsbereich 
END_VAR 
VAR CONSTANT 
    r_ValueResistance: ARRAY[0..10]OF REAL :=[850,1300,2000,2450,3100,4100,5400,7200,9500,13000,18000];   //NTC Widerstandswertetabelle 
    r_ValueTemperature: ARRAY[0..10]OF REAL :=[40,30,20,15,10,5,0,-5,-10,-15,-20];       //NTC Temperaturtabelle 
END_VAR 
 
IF NOT ((r_Resistance < r_ValueResistance[0]) OR (r_Resistance >  r_ValueResistance[10])) THEN                     //Wenn Widerstand im gültigen Bereich 
    FOR by_i:= 0 TO 9 DO                                                                                              // Arrays(Tabelle) nach passender Widerstandsgrenze durchsuchen  
        IF (r_Resistance >= r_ValueResistance[by_i]) AND (r_Resistance < r_ValueResistance[by_i +1]) THEN             //Wenn Widerstandsgrenze gefunden interpolieren 
            r_TC:= (1/r_ValueResistance[by_i])*((r_ValueResistance[by_i+1] - r_ValueResistance[by_i]) / (r_ValueTemperature[by_i + 1] - r_ValueTemperature[by_i])) ; //Temperaturkoefizient 
            Fun_GetNTCSensorTemp_Real:= r_ValueTemperature[by_i] +( (1/r_ValueResistance[by_i]) *(r_Resistance - r_ValueResistance[by_i] )/ r_TC); 
            EXIT; 
        END_IF; 
    END_FOR; 
ELSE                                                                                   //Widerstand nicht im gültigen Bereich 
    Fun_GetNTCSensorTemp_Real:= 0; 
END_IF
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Peter,

vielen Dank! Läuft wunderbar. Was mich aber noch stutzig macht sind die Umrechnungswerte, da wo der Sensor ist es definitv etwas kühler ist.
Insgesamt habe ich 19 Werte vom Hersteller, also sollte es ziemlich genau sein, oder ist hier das Problem, dass die Berechnung linear ist. Wie würde dann hier eine Berechnung aussehen?
Der Widerstandswert ist vom Typ WORD, evtl. den hier noch konvertieren in REAL?
 
Zuletzt bearbeitet:
Du könntest Excel benutzen, um eine Näherungsformel y := f(x) zu finden/erhalten.
Dazu die Kurvenwerte in Excel eingeben und in einem X/Y-Diagramm darstellen. Dann zur Datenreihe eine Trendlinie hinzufügen - polynomisch 4. Grades liefert eine ganz gute Näherungsformel.

Harald
 

Anhänge

  • NTC_Diagramm.jpg
    NTC_Diagramm.jpg
    39,6 KB · Aufrufe: 22
Hallo @Entenhausen_dd,

hast Du den schon mal die Genauigkeit des NTC's durch eine Messung des Widerstands bei einer Temperatur
aus der Tabelle überprüft?
Wie groß ist den der Strom der für die Widerstandsmessung durch den NTC fließt?
Ein zu hoher Strom würde den NTC erwärmen und damit im Ergebnis zu höheren Temperaturen führen.


Zitat
Der Widerstandswert ist vom Typ WORD, evtl. den hier noch konvertieren in REAL?

Verstehe nicht was Du meinst.
Die Werte werden doch händisch in die Arrays vom Typ REAL eingetragen?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Harald,

das mit der Trendlinie ist eine gute Idee, jedoch muss das umgedreht werden, da ich ja die Widerstandswerte kenne. Wenn ich das in Excel mache, kann ich mit einer Polynomischen Trendlinie nicht zum Ergebnis, das weicht zu stark ab.

@Peter: Ich kann der Steuerung sagen, dass hier ein Widerstand angehängt ist, sodass ich hier keine weiteren Einstellungsmöglichkeiten mehr habe

Im Bild noch die Kennlinie des NTC´s
Anmerkung 2020-05-17 164855.png
 
Hallo @Entenhausen_dd,

bei welcher Temperatur misst Du und was bedeutet etwas kühler?
Liegt die Ungenauigkeit im Grad Bereich oder er darunter?
 
Es liegt eher darüber.
Widerstandswert ist 2226 und er zeigt mir eine Temperatur von etwa 25°C an, was aber nicht stimmen kann, denn ein anderer Thermostat zeigt 22 Grad an
 
Wenn ich das in Excel mache, kann ich mit einer Polynomischen Trendlinie nicht zum Ergebnis, das weicht zu stark ab.
In Excel passt ein logarithmischer Zusammenhang für 1/T

Hast Du die Steinhart-Hart-Koeffizienten des NTC-Sensors? Dann könntest Du die Steinhart-Hart-Gleichung für die Berechnung der Temperatur aus dem Widerstand verwenden. Ich habe aber keine Erfahrung, ob da der Datentyp REAL genau genug ist.

Wie genau brauchst Du die Umrechnung?
Code:
(1) Temperatur_Celsius = 100/(0.0255 * LN(Widerstand_Ohm) + 0.1395) - 273.15

(2) Temperatur_Celsius = 100/(0.0255 * LN(Widerstand_Ohm) + 0.1395) - 272.68
Die Näherungsformel (1) liefert im Bereich -30°C ... +110°C eine Abweichung max 1 Grad. Mit einem weiteren Koeffizient für ln³ könnte das noch genauer werden.
Ein leichter Offset in der Formel (2) liefert im Bereich -10°C ... +95°C eine Abweichung max 0.5 Grad.

Harald
 

Anhänge

  • NTC_Diagramm_2.png
    NTC_Diagramm_2.png
    39,6 KB · Aufrufe: 9
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Habe mit 2226 R gerechnet und es kommt 24,49 heraus.
Gebe doch mal die Widerstandswerte aus der Tabelle vor und schaue welche Temperaturen dabei herauskommen.
Ist den sicher das der NTC keine Abweichungen hat?
Vielleicht mal genau bei 20 und 30 Grad mit dem Widerstandswert aus der Tabelle vergleichen.
 
Zurück
Oben