Lineare Skalierung in Flexible

Earny

Level-1
Beiträge
422
Reaktionspunkte
38
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich will gleichzeitig (zu Kontrollzwecken) den Analogrohwert aus dem PEW754 (0-27648, WORD) und den zugehörigen normierten Wert (0-7500, INT) in je einem EA-Feld darstellen.
Was ist der einfachste Weg?
Ich will nach Möglichkeit nicht schon in der S7-CPU das PEW754 normiert in einen anderen Speicher schreiben, sondern erst in Flexible.
Ich versuche in Flexible den Wert der Prozessvariablen (PEW754) normiert in eine interne Flexible-Variable zu übergeben, finde aber keine Möglichkeit, außer vielleicht mit einem Skript.

Gruß
Earny
 
Hallo Earny,
da sind mir 2 Dinge aufgefallen :
- du willst das PEW in einem EA-Feld darstellen. Möchtest du (wenn es ginge) auch den Wert des PEW über dieses Feld ändern ?
- du lies ein WORD ein und willst als INT darstellen. Das kann bei unterschiedlich Var-Typen zu Problemen führen. Besser hier immer den gleichen Var-Typ verwenden ...

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Larry,
das Schreiben ins PEW... aus Flexible heraus ist nicht erforderlich.
Am Besten wäre es wenn ich das PEW... im WORD-Format einlesen könnte und dann normiert in eine andere interne Flexible-Variable mit Datentyp INT schreiben könnte. Das hätte den Vorteil, dass ein Minus-Wert im PEW... (Werte zwischen 32768 und 65536) dann in Flexible als Integerwert (mit Vorzeichen) dargestellt werden könnte.
Wenn das mit dem Integertyp aber Probleme bereitet, dann kann ich auch beim Datentyp WORD bleiben.
In S7 wäre die Lösung ganz einfach: Ich kopiere den Wert aus dem PEW... in z.B. ein Merkerwort und stelle für dieses Merkerwort in der Symboltabelle den Datentyp INT ein. Aber ich wollte das nach Möglichkeit nicht in der S7-CPU machen, sondern in Flexible.

Gruß
Earny
 
... was spricht denn gegen die Sache mit der Zwischen-Variablen ...?

Die Lineare Skalierung versteckt sich übrigens unter :
Ereignisse-Aktivieren-Berechnung-Lineare Skalierung

Gruß
LL
 
Hallo Larry,
ich habe dank Deiner Hilfe die Stelle gefunden, wo man die Skalierung einstellen kann. Es gibt aber eine Fehlermeldung beim Generieren.

Ich habe folgende Variablen:
F101AnalogE, Flex-Name für PEW754 (Word)
F101AnalogENormiert "interne Flex-Variable" (INT - es gibt kein WORD)

Dann habe ich für die Variable F101AnalogE in Eigenschaften in Ereignisse-Wertänderung eingestellt:
X= F101AnalogE
a=0,271267 (7500/27648)
Y=F101AnalogeENormiert
b=0

Beim Generieren gibt es die Fehlermeldung: "Bei Systemfunktion Lineare Skalierung fehlt ein Paramater oder hat einen unzulässigen Typ (Trigger F101AnalogENormiert)"

Gruß
Earny
 
Zuviel Werbung?
-> Hier kostenlos registrieren
... ich kann das jetzt leider nicht nachstellen ...
Aber für mich hast du da gleich 3 elementare Fehler im System :
- dein Quellwert ist ein WORD
- dein Zielwert soll ein INT sein
- dein Faktor ist vom Typ REAL

Ich wiederhole jetzt noch einmal eine Passage aus dem Beitrag #2 :
du liest ein WORD ein und willst als INT darstellen. Das kann bei unterschiedlich Var-Typen zu Problemen führen. Besser hier immer den gleichen Var-Typ verwenden ...
Vielleicht probierst du das einfach mal : Typ Quell-Var = Typ Ziel-Var = Typ Faktor.
Oder du normierst in der SPS (was mir persönlich noch am Besten gefällt).

Gruß
LL
 
@Larry
*ACK*
Oder zumindest sollte man "F101AnalogeENormiert" mal als Real testen, ob es angenommen wird und wenn ja, ob das Ergebnis plausibel ist.
 
Vielleicht noch einmal ganz grundsätzlich zu dem Thema (auch weil ich mich erinnere, dass wir das so ähnlich schon mal hatten ...) :

Ich versuche Messwerte (und Zahlenwerte ganz generell) innerhalb der SPS immer sinnvoll darzustellen. Einen Analogwert, der sich in seiner Ursprungsform durch das Programm hangelt, wirst du bei mir nicht finden. Hierbei bediene ich mich gerne der gültigen Einheiten (m , Grad Celsius , Grad (Winkel) , N , Nm usw.) oder der zugehörigen Untereinheiten. Das macht das Programm insgesamt auch lesbarer und verständlicher ... und beim darstellen auf der Visu muss man dann auch nicht mehr lange überlegen (oder Skalieren).
Das ist aber vielleicht Ansichtssache ...

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Larry,
hallo Ralle,
meinen eigentlichen Fehler habe ich gefunden:
Wenn man die lineare Skalierung bei Wertänderung benutzt, dann muss man eine X-Variable, eine Y-Variable, die Steigung a und den Ordinatenwert b angeben. Die lineare Skalierung wird für die Variable eingestellt, die den Wert aus dem PEW darstellt. Wenn sich der Wert im PEW ändert, wird die Skalierung ausgelöst (Trigger durch Wertänderung im PEW).
Es kam ja die Fehlermeldung (hatte ich beschrieben), dass sinngemäß etwas an einem Parameter der Skalierung nicht stimmen würde. Ich konnte aber nichts finden.
Mein Problem war, ich habe an der falschen Stelle gesucht.
Der Fehler lag an der Zielvariablen, die den normierten Wert aufnehmen soll. Hier hatte ich dann irgendwann in meiner Verzweiflung auch mal unter linearer Skalierung nachgesehen, und hier war von Flexible alles rot gemarkert!!! Ich musste nur die fälschlicherweise eingetragene Skalierung löschen und die Sache lief ab dann problemlos.

Jetzt zu den Berechnungen mit WORD, INT, REAL usw.:
Ich habe mal ein paar Testnormierungen gemacht:
Ich ließ FAnalogE (PEW...) beim Datentyp WORD.
Der Steigungswert war 0,271267361 (7500/27648).
Der Wert ging in die interne Flexvariable FAnalogENormiert mit INT.

Es gab folgende Ergebnisse:
PEW------Taschenrechner----Flexible (als INT-Zahl im EA-Feld)
5000-----1356,3------------1357
10000----2712,7------------2714
20000----5425,3------------5426
30000----8138,0------------8139

Seltsamerweise ist der Fehler bei 10000 am größten.
Ich habe mal zu Testzwecken den Datentyp der internen Zielvariable FAnalogENormiert auf Float (entspricht vermutlich Real bei S7) gestellt, wie von Ralle vorgeschlagen.
Es ergibt sich beim PEW-Wert 10000 keine Änderung. Wenn man diesen Floatwert auf das EA-Feld gibt, wird wieder 2714 angezeigt. Der Wert 2713 wäre der nächstgelegene Ganzzahlwert.
Es ist mir nicht klar, mit welchem Datentyp Flexible eigentlich rechnet.
Ich vermute, es ist der Datentyp Variant. Zumindest steht in der Hilfe zu VB-Skript, dass Flexible nur einen Datentyp kennt, und das ist der Datentyp Variant, oder habe ich da etwas falsch verstanden?
Bei VB6.0 ist Variant der Datentyp, der alle anderen Datentypen aufnehmen kann.
Ich kann mir aber trotzdem nicht erklären, weshalb sich Flexible bei dieser einfachen Rechnung verrechnet.

Gruß
Earny
 
Hast du mit diesem langen Wert im Taschenrechner gerechnet?

Der Steigungswert war 0,271267361

Könnte durchaus sein, das WinCCFlex nicht so viele Stellen nutzt, also durch das Abschneiden von Stellen deine Egebnisse so abweichen. Das wäre meine erste Vermutung dazu.

PS: Ne, habs mal nachgerechnet, das kann es eigentlich auch nicht sein.
 
Zuletzt bearbeitet:
Hallo,
muss mich leider entschuldigen. Ich habe die Sache, was die Rechengenauigkeit anbelangt, heute nochmal untersucht und dabei einen weiteren saudummen Fehler entdeckt.
Ich würde sagen, vergesst die Sache. Flexible rechnet richtig!!!
Sowohl in Wertänderung - linear skalieren als auch in VB-Skript kommen die richtig gerundeten Ganzahlwerte heraus, wenn man die richtigen Skalierungsformeln eingibt, bzw. programmiert.

Übrigends: Die Sache mit den diversen Datentypen ist unproblematisch: Ich lese WORD ein (PEW...), multipliziere mit der Kommazahl 0,271267361 und gebe das Ergebnis dann als INT-Zahl in ein E-A-Feld. Das bereitet Flexible kein Problem!

Bei meinen Tests bin ich auf ein weiteres "Problem" gestoßen. Da mach ich aber eine neue Anfrage draus.

Gruß
Earny
 
Zurück
Oben