Analoge Eingänge normieren und skalieren

BiLLyGuN

Level-1
Beiträge
40
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin moin!

Leider fehlt mir wieder etwas an Programmierwissen und die Internetsuche kann/will mir einfach nicht helfen. ich würde gerne mehrere analoge Eingänge (0-10V) auf Temperaturen und Leistungen normieren und skalieren. Die 0-27648 Int-Werte habe ich (und kann sie auch mit einem Poti verändern). Ich weiß leider nur nicht, wie ich aus den Int-Werten Real-Werte mit Skalierung machen kann. Vielleicht kann mir ja einer von Euch weiterhelfen.

Vielen Dank!!!
 
Was für einen Bereich möchtest du den Skaliert haben ? Min bzw max ? Daraus skaliert man sich dann seinen Wert oder habe ich dich falsch verstanden ?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für deine Antwort.

Es sind verschiedene Skalierungen. Z.B. 0V=0KW bis 10V=5KW oder 0V=20°C bis 10V=90°C. Hatte jetzt gehofft, dass man das mit einem Beispiel erklären kann und ich mir die Skalierung so "hinwieseln", wie ich sie brauche. Die 0V=0 bis 10V=27648 Int_Werte kann ich ja schon testweise verändern (also von 0-27648 ).
 
Zuletzt bearbeitet:
Für einfache Verhältnisgleichungen brauchst du keine Programmierkenntnisse sondern Mathematikwissen aus der 5. Klasse.
 
Bei deinen 5kW wäre das bspw 5000Watt/10 das was daraus kommt multipliziert mit dem Istwert.
Also in etwa so 500Watt pro Volt * 5 Volt = 2.500Watt oder 2.5kW und so geht das mit jedem Wert
 
Jetzt hab ich noch eine andere Frage :D Ich hab einfach nur mal zum probieren eine Beispielrechnung gemacht, wo eine Gleitkommazahl rauskommt. Variable hab ich global als REAL deklariert. Wenn ich das teste, steht da aber nur eine Ganzzahl und alles nach dem Komma wird nicht angezeigt. Hat jemand ne Ahnung warum??

Edit: Ich glaube, ich habs. Ich hab einfach eine .0 an meine Konstanten gehängt und dann gehts... Verrückt!
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

vieleicht hilft dir das hier ja ein wenig. Ich hatte mal vor seeehr langer Zeit folgenden FB in ST geschrieben.

FUNCTION_BLOCK Temp_Input
VAR_INPUT
bInputOutputDefinition: BYTE;
iAnalVal: INT;
rTempUpperLimit: REAL;
rTempLowerLimit: REAL;
iAnalValUpperLimit: INT;
iAnalValLowerLimit: INT;
rAnzeigefaktor: REAL;
bSensor_0C_1K_2R_3Re_4F: BYTE;
bDisplay_0C_1K_2R_3Re_4F: BYTE;
END_VAR
VAR_OUTPUT
iActualVal: INT;
END_VAR
VAR
AnalValRange: INT;
TempRange: REAL;
MulFactor: REAL;
AddVal: REAL;
ActualTemp: REAL;
ConversionFactorInput: REAL;
END_VAR

(*Range des Analogeinganges berechnen *)

AnalValRange := iAnalValUpperLimit - iAnalValLowerLimit ; (*z.B. Range = 32761 - 0 = 32761*)

(* Range der möglichen Temperatur berechnen *)

TempRange := rTempUpperLimit - rTempLowerLimit; (* z.B. Range= 35,4 - 25,0 = 10,4 *)

(* Multiplikationsfaktor aus Analogeingangswert berechnen *)

MulFactor := INT_TO_REAL(iAnalVal) / INT_TO_REAL(AnalValRange); (* Ergebnis z.B. 0,6845 *)

(* Additionswert für Temperaturbestimmung ausrechnen *)

AddVal := TempRange * MulFactor; (* Ergenis z.B. 6,845*)

(* Addieren des Additionswertes zum unteren Temperaturlimit mit Unterscheidung nach verschiedenen Temperatureinheiten
--> Das Ergebnis wird in °C ausgegeben! *)

IF bSensor_0C_1K_2R_3Re_4F = 0 THEN (*0=Celsius*)
ActualTemp := (rTempLowerLimit +AddVal);
ELSIF bSensor_0C_1K_2R_3Re_4F = 1 THEN (*1=Kelvin*)
ActualTemp := (rTempLowerLimit +AddVal)-273.15;
ELSIF bSensor_0C_1K_2R_3Re_4F = 2 THEN (*2=Rankine*)
ActualTemp := ((rTempLowerLimit +AddVal) - 491.67)/1.8;
ELSIF bSensor_0C_1K_2R_3Re_4F = 3 THEN (*3=Réaumur*)
ActualTemp := (rTempLowerLimit +AddVal)/0.8;
ELSIF bSensor_0C_1K_2R_3Re_4F = 4 THEN (*4=Fahrenheit*)
ActualTemp := ((rTempLowerLimit +AddVal) -32)/0.8;
END_IF;

(* Multiplizieren mit AnzeigeFaktor und Runden der Zahl durch Umwandlung in Integer mit Umrechnung in verschiedene Temperatureinheiten*)

IF bDisplay_0C_1K_2R_3Re_4F = 0 THEN
iActualVal := REAL_TO_INT(ActualTemp * rAnzeigefaktor);
ELSIF bDisplay_0C_1K_2R_3Re_4F = 1 THEN (*1=Kelvin*)
iActualVal := REAL_TO_INT((ActualTemp +273.15) * rAnzeigefaktor);
ELSIF bDisplay_0C_1K_2R_3Re_4F = 2 THEN (*2=Rankine*)
iActualVal := REAL_TO_INT(((ActualTemp +273.15)*1.8)* rAnzeigefaktor);
ELSIF bDisplay_0C_1K_2R_3Re_4F = 3 THEN (*3=Réaumur*)
iActualVal := REAL_TO_INT((ActualTemp *0.8)* rAnzeigefaktor);
ELSIF bDisplay_0C_1K_2R_3Re_4F = 4 THEN (*4=Fahrenheit*)
iActualVal := REAL_TO_INT(((ActualTemp *1.8)+32)* rAnzeigefaktor);
END_IF;


(* Ergebnis z.B. 31,845 * 100,0 = 3185 *)

(* ENDE *)
 
Zurück
Oben