Step 7 Problem Analogwertberechnung

bastler

Level-1
Beiträge
254
Reaktionspunkte
3
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo
Ich habe folgendes Problem:
Ein Analogwert 4-20mA wird von einen Sensor in eine Wago Analogeingangsbaugruppe (4-20mA) eingespeist.
Über eine Wago Analogausgangsbaugruppe (0-20mA) soll der Wert an ein Display (0-20mA) weitergegeben werden.

Im Programm skaliere ich mit dem FC105 wie folgt:
LO entspricht 0 und HI entspricht 6500



Danach habe ich den FC106 zum deskalieren genommen:
LO entspricht 0 und HI entspricht 6500

Der vom Sensor im Moment gelieferte Analogwert entspricht 2000.
Der Wert am Display sollte ja nun eigentlich auch 2000 sein, ist er aber leider nicht, er liegt bei ca. 2700.
Kann mir jemand sagen, wo da mein Fehler liegt?

MfG
bastler
 
Wie wird der Analgowert in den beiden Baugruppen skaliert.

Bei Siemens entspricht ja 4-20mA 0-27648 bzw. 0-20mA ebenfalls 27648.

Ich fürchte dass da was nicht ganz passt.

Es dürfte schon nicht passen wenn du den Analogwert von der E-Baugruppe direkt auf die A-Baugruppe hängen würdest.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bei Siemens entspricht ja 4-20mA 0-27648 bzw. 0-20mA ebenfalls 27648

Aber ich habe ja einen zur Eingangsbaugruppe passenden Analogwert (4-20mA) und das Signal (0-20mA) der Ausgangsbaugruppe ist passend zum Display.
Hab mal ein Bild von meinen Programm angehängt!

Skalierung.png
 
Zuletzt bearbeitet:
Du hast aber am Eingang den kleinstmöglichen Wert von 4mA und nicht 0mA. Das entspräche bei Deiner jetzigen SKalierung 1300.
Ich denke, die mußt Du beim LO des FC105 als Negativwert eingeben, damit die 4mA dann 0 entsprechen.
Also LO = -1300.

Bis jetzt machst Du ja im Prinzip nichts anderes als PAW272 = PEW272 über den Umweg Skalieren/Deskalieren (den Du ohne weitere Verwendung des MD200 Dir sparen könntest).
Ich denke es muß aber PAW = ( PEW - 1300 [Offset 4mA] ) / 16 [mA Messbereich] * 20 [mA Ausgabebereich] lauten.



PS: Ich hoffe, dass ich hier jetzt keinen Stuss erzählt habe. Ich mach' das nur gaaanz selten im RL.
:cool:
 
Du hast aber am Eingang den kleinstmöglichen Wert von 4mA und nicht 0mA. Das entspräche bei Deiner jetzigen SKalierung 1300.
Ich denke, die mußt Du beim LO des FC105 als Negativwert eingeben, damit die 4mA dann 0 entsprechen.
Also LO = -1300.

Bis jetzt machst Du ja im Prinzip nichts anderes als PAW272 = PEW272 über den Umweg Skalieren/Deskalieren (den Du ohne weitere Verwendung des MD200 Dir sparen könntest).
Ich denke es muß aber PAW = ( PEW - 1300 [Offset 4mA] ) / 16 [mA Messbereich] * 20 [mA Ausgabebereich] lauten.



PS: Ich hoffe, dass ich hier jetzt keinen Stuss erzählt habe. Ich mach' das nur gaaanz selten im RL.
:cool:

Genau das wollte ich mit der Frage eingangs wissen.

Welcher Zahlenwert kommt über das PEW bei 4mA?
Ausserdem ist für Scale und Unscale auch wichtig welcher Zahlenwert bei 20mA kommt. Die Berechnung im den FC´s basiert darauf, dass 20mA = 27648.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
..die Wago Analogbaugruppen haben einen anderen Wertebereich als die Siemens-Baugruppen
wie oben schon beschrieben haben Siemens Analogbaugruppen einen Wertebereich von 0 ... + 27648 [unipolar]
wogegen die Wago Baugruppen einen Wertebereich von 0... 32767 (750-474) haben da ist mit dem FC105 nix zu machen, da der nur Werte bis 27648 verarbeiten kann...

mfg.
 
Ich hab jetzt den FC105 bzw. FC106 so "hingebogen", dass es einigermaßen passt. Aber so richtig gefällt mir das nicht.
@Rayk, wie kann ich denn das Problem lösen, wenn der FC105 und FC106 nicht funktionieren?
 
@KingHelmer, so fit bin ich leider nicht mit programmieren!

Sorry, ich wollte auf keinen Schlips treten.
Hat man bei den Siemens Bausteinen eigentlich zugriff auf den Code oder ist dieser (vermutlich leider) passwortgeschützt?
Sonst könnte man den Baustein selbst eventuell auf deine Bedürfnisse zuschneiden.
 
Du bist auf keinen Schlips getreten, ich bin dankbar für jede Hilfe. Wie schon gesagt, ich bin kein Programmierer, deshalb hoffe ich hier eine Lösung zu finden, die ich mit meinen Kenntnissen realisieren kann.
 
Also im grunde willst du doch lediglich einen Anaogwert 4-20 mA Eingangskarte 0-32768 INTEGER WAGO, auf einen Analogwert 0-20 mA Ausgangskarte 0-32768 INTEGER bringen.
Hier wäre mal mein kleiner Codeschnipsel dazu den ich früher mal für Analogwerte (Temperatur, aber unwichtig) geschrieben habe:

zuerst der Input:

Code:
FUNCTION_BLOCK Temp_Input
VAR_INPUT
    iAnalVal: INT;
    rTempUpperLimit: REAL;
    rTempLowerLimit: REAL;
    iAnalValUpperLimit: INT;
    iAnalValLowerLimit: INT;
    rAnzeigefaktor: REAL;
END_VAR
VAR_OUTPUT
    iActualVal: INT;
END_VAR
VAR
    AnalValRange: INT;
    TempRange: REAL;
    MulFactor: REAL;
    AddVal: REAL;
    ActualTemp: REAL;
END_VAR

Code:
(*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(iActualVal) / 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 *)

ActualTemp := rTempLowerLimit +AddVal;                                          (* Ergebnis z.B. 31,845 *)

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

iActualVal := REAL_TO_INT(ActualTemp * rAnzeigefaktor);                        (* Ergebnis z.B. 31,845 * 100,0 = 3185 *)

(* ENDE *)

Und der Output:

Code:
FUNCTION_BLOCK Temp_Output
VAR_INPUT
    iAnalValUpperLimit: INT;
    iAnalValLowerLimit: INT;
    rTempUpperLimit: REAL;
    rTempLowerLimit: REAL;
    iSetVal: INT;
END_VAR
VAR_OUTPUT
    iAnalVal: INT;
END_VAR
VAR
    AnalValRange: INT;
    TempRange: REAL;
    DiffVal: REAL;
    MulFactor: REAL;
    rSetValReal: REAL;
END_VAR

Code:
(* Range des Analogausganges brechnen *)

AnalValRange := iAnalValUpperLimit - iAnalValLowerLimit;

(* Range der möglichen Temperatureinstellung ausrechnen *)

TempRange := rTempUpperLimit - rTempLowerLimit;

(* Umrechnung des Sollwertes unter Berücksichtigung des Anzeigefaktors *)

rSetValReal := INT_TO_REAL(iSetVal) / 100.0;

(* Differenz von Sollwert zum unteren Grenzwert berechnen *)

DiffVal := LIMIT(rTempLowerLimit, rSetValReal, rTempUpperLimit) - rTempLowerLimit;

(* Multiplikationsfaktor aus Differenzwert und Analogwertrange berechnen *)

MulFactor := DiffVal / TempRange;

(* Berechnung des einzustellenden Analogwertes *)

iAnalVal := REAL_TO_INT(INT_TO_REAL(AnalValRange) * MulFactor);

(* ENDE *)

Das habe ich aber im Codesys geschrieben.
Aber in der Art müsste dein einzelner Baustein dann auch geschrieben werden.
Bei meinem hier kannst du eben die Auflösung wählen und den Bereich der (in diesem Fall) Temperatur, sowie einen Anzeigefaktor (ich wollte die Temp mit zwei Nullen, z.B. 25,4 = 2540 als INT übertragen.
Kann man natürlich ändern und anpassen auf deine Bedürfnisse.

Vieleicht hilfts ja ....

Grüße,
Flo
 
Zuletzt bearbeitet:
Danke für die Hilfe.
Also im grunde willst du doch lediglich einen Anaogwert 4-20 mA Eingangskarte 0-32768 INTEGER WAGO, auf einen Analogwert 0-20 mA Ausgangskarte 0-32768 INTEGER bringen.
Genau das hab ich vor.
Mit Codesys hab ich aber leider noch nie zu tun gehabt. Deshalb wird es für mich schwer, den Code in Step7 umzuwandeln.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also am einfachsten wäre dann doch: PAW:= PEW

Oder habe ich irgendwas falsch verstanden???

Sepp7 AWL:
L PEW xxx
T PAW xx

zum kästchen malen bin ich jetzt zu faul. aber move sollte da hefen.
 
Zuletzt bearbeitet:
Ich denke das Problem sind hier die Wago EA-Baugruppen. Keiner weiss was die genau machen, sprich welche Werte die rausgeben. Dann wird's auch mit dem Skalieren nix. Da hilft nur ins Wago-Handbuch schauen...
 
Zurück
Oben