# Analogwert skalieren!



## bastler (6 Oktober 2008)

Hallo
Ich habe ein Problem mit der Skalierung eines Analogwertes. Habe schon im Forum gesucht, aber nichts richtiges gefunden, was mein Problem beheben kann.
Folgendes will ich machen:
Ein Ultraschallsensor soll den Füllstand eines Tank's überwachen und liefert mir 4-20mA. Dieser Analogwert wird über dezentrale Peripherie eingelesen und per Profibus als Word in einen DB an die CPU geschickt. Wenn ich den DB beobachte sehe ich, das bei 4mA ein Wert von 6500 angezeigt wird und bei 20mA ein Wert von 32767. 4mA bedeuten einen vollen Tank und soll 5000L entsprechen. 20mA bedeuten, der Tank ist leer, also 0L. Wie kann ich das skalieren? Im FC105 hab ich das schonmal versucht:

 CALL  FC 105
       IN     :=DB2.DBW0                //Eingangswort
       HI_LIM :=0.000000e+000           //Skalierungsobergrenze
       LO_LIM :=5.000000e+003           //Skalierungsuntergrenze
       BIPOLAR:=M100.0                  //unipolar
       RET_VAL:=DB2.DBW20               //Fehlerinformation
       OUT    :=DB2.DBD16               //Skalierter Messwert in REAL

Im DB2.DBD16 bekomme ich bei 4mA einen Wert von ca. 3807.000 und bereits bei 16,8mA bekomme ich einen Wert von 0 angezeigt.
Was läuft denn da falsch?

MfG
bastler


----------



## vierlagig (6 Oktober 2008)

in der hardware konfiguration den eingang als 4..20mA, statt auf 0..20mA einstellen und schon sollte es funktionieren


----------



## PhilippL (6 Oktober 2008)

vierlagig schrieb:


> in der hardware konfiguration den eingang als 4..20mA, statt auf 0..20mA einstellen und schon sollte es funktionieren


 
Hi,

@4L sagmal denkst du schon digital? Ich hab ein wenig gebraucht um sein Problem zu erkennen... aber bei dir scheint das eine etwas kürzere "Zykluszeit" zu sein 

Gruß

Philipp


----------



## bastler (6 Oktober 2008)

In der Hardwarekonfig kann ich nichts ändern, es ist dezentrale Peripherie von Wago(750-465).
Diese Module haben keinen 4-20mA Eingang, sondern 0-20mA, hab ich aber auch erst gerade eben gesehen. Kann man da trotzdem die Skalierung  irgendwie hinbekommen?

MfG
bastler


----------



## OHGN (6 Oktober 2008)

bastler schrieb:


> .....
> Wenn ich den DB beobachte sehe ich, das bei 4mA ein Wert von 6500 angezeigt wird und bei 20mA ein Wert von 32767.
> ...........


Wenn das so ist, kannst Du die FC105 für Deinen Anwendungsfall eh' vergessen und musst Dir selbst was basteln....
.


----------



## vierlagig (6 Oktober 2008)

bastler schrieb:


> In der Hardwarekonfig kann ich nichts ändern, es ist dezentrale Peripherie von Wago(750-465).
> Diese Module haben keinen 4-20mA Eingang, sondern 0-20mA, hab ich aber auch erst gerade eben gesehen. Kann man da trotzdem die Skalierung  irgendwie hinbekommen?
> 
> MfG
> bastler



ja, du kannst das signal anpassen und zwar mit

y = 1,25 * x - 5

wobei x deinem 4..20mA Signal, y dann dem angepassten 0..20mA-Signal entspricht

andersrum gehts mit y = 0,8 *x + 4


----------



## bastler (6 Oktober 2008)

Das hab ich mir schon gedacht, allerdings hab ich keinen Plan wie die Formel zur richtigen Berechnung aussehen muß.
(Bezogen auf die Antwort von OHGN)
MfG
bastler


----------



## Ralle (6 Oktober 2008)

Geh mal auf den FC105 und dann F1, da steht die Formel drin, die kannst du auch nutzen,mußt nur deine Werte entsprechend einsetzen.


----------



## Larry Laffer (6 Oktober 2008)

... oder andere Variante :
Zieh die 3087 erst von deinem PEW ab ...
	
	



```
L PEW xyz
L 3087
-I
T DB2.DBW 0
```
 
Gruß
LL


----------



## vierlagig (6 Oktober 2008)

Larry Laffer schrieb:


> ... oder andere Variante :
> Zieh die 3087 erst von deinem PEW ab ...



an sich ein guter gedanke, aber das max stimmt nicht ganz, also er geht eher in den überlauf ...


----------



## Larry Laffer (6 Oktober 2008)

... der Einwand war berechtigt - allerdings geht das Ding dann nicht in den Überlauf. Es werden ja nur noch 16 mA ausgewertet, die Skalierung ist aber auf 20mA ausgelegt. Das heißt, der Endwert müßte 20/16 des ursprünglichen Endwertes sein - also 6250.
Ich würde mir da allerdings auch eher eine eigene Skalierung bauen ...

Gruß
LL


----------



## bastler (6 Oktober 2008)

Hab mir die Formel vom FC105 angesehen, wenn ich da meine Werte eintrage, kommt aber nur Müll raus. Oder die zweite Möglichkeit, ich hab das Rechnen verlernt.

MfG
bastler


----------



## JoopB (6 Oktober 2008)

Sie kunnen das auch direct programmieren ohne FC105


```
In S7 code
l 32767  // Max ana wert = 0 liter
l DB2.DBW2    //AI
-I
ITD            
DTR
L  5000.0 // totaal tank inhalt
*R
L 26276.0       //= 32767 - 6500
/R
T DB2.DBW16 // inhoud tank in REAl
```


----------



## vierlagig (6 Oktober 2008)

bastler schrieb:


> Hab mir die Formel vom FC105 angesehen, wenn ich da meine Werte eintrage, kommt aber nur Müll raus. Oder die zweite Möglichkeit, ich hab das Rechnen verlernt.
> 
> MfG
> bastler



der faktor k ist anders als bei den siemens baugruppen


----------



## OHGN (6 Oktober 2008)

Für Deine Gegebenheiten sollte das hier so funktionieren:

```
L     DB2.DBW    0              //Rohwert
      L     6500                      //Nullpunkt anpassen
      -I    
      L     26267                     //den verbliebenen Maxwert subtrahieren (entspr.0L)
      -I    
      NEGI                            //negieren um eine positive Zahl zu erhalten 
      ITD   
      DTR                             // in eine Real wandeln
      L     1.903529e-001             //Faktor: (ergibt sich aus 5000 / 26267)
      *R    
      T     DB2.DBD   16              //Ergebnis
```
.


----------



## Grubba (6 Oktober 2008)

Habe Dir mal einen allgemein gültigen FC reingestellt, mit dem Du beliebige lineare Funktionen skalieren kannst. Ist nichts anderes als Y= mx+b.

Alle Eingänge sind vom Typ Real, Du müsstest bei Verwendung des FCs Deine Prozesswerte in Real wandeln.

Mit:
4 mA -> 5000 L (6500)
20 mA -> 0 L    (32767) 

würde der Aufruf so aussehen:

Prozesswort : Dein Wert von der Wago-Klemme
Real_1        : 5000.0 
Prozess_1   : 6500.0
Real_2       : 0.0
Prozess_2  : 32767.0
Value        : Dein Ergebnis-Füllstandswert als Real

Der FC:



```
[SIZE=2]// alle Parameter vom Typ Real
// In-Parameter 
- Prozesswort -> Wert vom Geber
- Real_1        -> Realwert bei Meßpunkt 1 
- Real_2        -> Realwert bei Meßpunkt 2
- Prozess_1   -> Prozesswert bei Meßpunkt 1
- Prozess_2   -> Prozesswert bei Meßpunkt 2
// temp_parameter
- m
- b
- dy
- dx
// out - Parameter 
- Value
 
 
L #Prozess_2
L #Prozess_1
-R 
T #dx
L #Real_2
L #Real_1
-R 
T #dy
 
L #dy
L #dx
/R 
T #m
 
L #m
L #Prozess_1
*R 
L -1.000000e+000
*R 
L #Real_1
+R 
T #b
 
L #m
L #Prozesswort
*R 
L #b
+R 
T #Value
[/SIZE]
```


----------



## Znarf (6 Oktober 2008)

Hallo
Dein Ultraschallgeber gibt dir ein Signal, das die Entfernung zu deiner Mediumoberflache angibt. Deshalb denke ich, dass du deine Skalierung mit 0 Liter und 5000 Liter noch mal überdenken solltest.

Gruß

Andreas


----------



## bastler (7 Oktober 2008)

Jetzt läuft es,



> Hab mir die Formel vom FC105 angesehen, wenn ich da meine Werte eintrage, kommt aber nur Müll raus. *Oder die zweite Möglichkeit, ich hab das Rechnen verlernt*.



 es war natürlich mein Fehler, ich mich einfach nur verrechnet.

Znarf, was meinst du genau damit, Behälterfüllstände werden doch meist mit Ultraschallsensoren abgefragt, zumindest kenn ich das so.

MfG
bastler


----------



## vierlagig (7 Oktober 2008)

ich glaub znarf möchte dich darauf hinweisen, dass die auflösung des 4..20mA-signals nicht optimal ist um auf 0-5000 skaliert zu werden, geeigneter wäre eine skalierung auf 0..100% ... zumindest würde ich das so machen


----------



## bastler (7 Oktober 2008)

Um praktisch eine bessere Auflösung hinzubekommen, oder!


----------



## Znarf (7 Oktober 2008)

Hallo
Die Ultraschallgeber die wir einsetzen Messen den Abstand vom Ultraschallgeber zur Mediumoberfläche. Also eindimensional. Das Volumen ist aber dreidimensional und somit Abhängig von deinen Tankmaßen.
D.h. die Grundfläche mal Füllhöhe ergibt dein Volumen. Deshalb sollte man auf die Füllhöhe dimensionieren und nicht auf das Volumen.
Es sei den dein Tank hat eine Grundfläche von 100mmx100mm

Gruß

Andreas


----------



## vierlagig (7 Oktober 2008)

schöner grund, aber ich geh mal davon aus dass sich bastlers tank linear verhält


----------



## bastler (7 Oktober 2008)

Also die Sensoren die wir einsetzen sind kalibrierbar.
Der Tank hat z.B. eine Höhe von 3m. Bei 2,50m ist das max. Volumen erreicht. 
Also kalibrier ich den Sensor so, dass er bei 0,5m von Oberkante 4mA bringt und bei 3m bringt er 20mA.
Da ist es doch eigentlich egal, ob ich das Volumen in Prozent oder Litern errechnen lasse.

MfG
bastler


----------



## OHGN (7 Oktober 2008)

bastler schrieb:


> Also die Sensoren die wir einsetzen sind kalibrierbar.
> Der Tank hat z.B. eine Höhe von 3m. Bei 2,50m ist das max. Volumen erreicht.
> Also kalibrier ich den Sensor so, dass er bei 0,5m 20mA bringt und bei 3m bringt er 4mA.


Aber trotz allem setzt das doch einen "rechteckigen" Tank vorraus oder?
.


----------



## Znarf (7 Oktober 2008)

Dein FC105 wandelt ja eigentlich über den A/D-Wandler deine physikalische Größe 500mm bis 3000mm in den Zahlenbereich 500 bis 3000. Aber eben nicht in 0 bis 5000 (Liter), so wie du es zu Beitragsbeginn skaliert hast. Das meine ich.

Gruß

Andreas


----------



## Znarf (7 Oktober 2008)

Mann muß diese Füllhöhe noch mit der Grundfläche multiplizieren und hat dann das Volumen. Ob rechteckig oder nicht ist egal.

Gruß

Andreas


----------



## bastler (7 Oktober 2008)

Meiner Meinung nach spielt das keine Rolle.
Bezogen auf 





> Aber trotz allem setzt das doch einen "rechteckigen" Tank vorraus oder?


----------



## Larry Laffer (7 Oktober 2008)

Znarf schrieb:


> Mann muß diese Füllhöhe noch mit der Grundfläche multiplizieren und hat dann das Volumen. Ob rechteckig oder nicht ist egal.


 
*OHGN* meinte hier auch nicht rechteckig sondern zylindrisch - die Form der Grundfläche ist hier nebensächlich. Viele Tanks laufen aber unten konisch zu - das heißt, die ersten 50 cm Füllhöhe entsprechen z.B. 200 L und jede weiteren entsprechen z.B. 600 L ...
Das sollte vielleicht beachtet werden ...

Gruß
LL


----------



## Znarf (7 Oktober 2008)

@Larry
Du meinst einen Klöpperboden, oder?

http://www.juenger.com/lieferprogramm/kloepperboeden/index.html

Gruß

Andreas


----------



## OHGN (7 Oktober 2008)

Znarf schrieb:


> Mann muß diese Füllhöhe noch mit der Grundfläche multiplizieren und hat dann das Volumen. Ob rechteckig oder nicht ist egal.
> 
> Gruß
> 
> Andreas


 Wenn sich der Tank linear verhält, und das hat sehr wohl mit seiner Form etwas zu tun, braucht man das Volumen nicht zu berechnen, ich brauche nur die Größen "Voll" und "Leer", alles andere errechnet sich auf Grund der Linearität von selbst.
.


----------



## Znarf (7 Oktober 2008)

Ich denke, wenn ich 0 Liter  bis 5000 Liter anzeigen möchte, und nur die Füllhöhe messe, benötige ich die Grundfläche ( + Klöpperboden) ebenfalls.
Will ich nur Schaltpunkte auswerten benötige ich sie nicht. Aber auch hier würde ich nicht auf 0 bis 5000 skalieren, sondern auf 500 bis 3000mm wie bastler es ja in seinem vorletzten Beitrag schon macht.

Gruß

Andreas


----------



## Znarf (7 Oktober 2008)

Aber nach nochmaligem Nachdenken gebe ich OHGN recht.

Gruß

Andreas


----------



## Nospsguru (7 Oktober 2008)

Vieleicht hilft dieser baustein ?
damit verbiege ich manchmal werte .
der baustein macht eigendlich das:
Berechnung einer linearen Funtion y=f(x), die durch die Eingangswerte
x1, x2, y1, y2 definiert ist

MfG

Nospsguru


----------



## Nospsguru (7 Oktober 2008)

so ich hab da mal ne komplette Lösung.
nicht sehr elegant aber Funktioniert.

MfG
Nospsguru


----------

