Sonstiges PCS7: Realwerte vergleichen

Zucker

Level-1
Beiträge
4
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute. ich möchte mit dem Baustein CMP_R in CFC 2 Realwerte auf gleichheit prüfen.

nun gibt mir die Funktion am Ausgang EQ kein True zurück, obwohl beide Werte den selben Wert haben. Der eine kommt von einem OpAnl (PCS7 8.2), der andere wird über den bus von einer s7 steuerung eingelesen.

Bei Realwerten kann ja vielleicht ganz hinten bei der x-ten Nachkommastelle eine Abweichung sein durch einen rundungsfehler oder so. wüsste aber nicht woher die kommen soll. die Quelle ist bei beiden ein Int, der und am Baustein in der Online ansicht wird der Wert xx.0 angezeigt.

hier noch ein bild:

cmp_R.png

gibt es eine möglichkeit, den exakten wert in bin anzuzeigen? oder hat jemand sonst einen tipp?
 
Wenn bei beiden Werten die Quelle ein Int ist, dann nimm doch die beiden Quellen udn lege Sie auf einen CMP_I.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke Leguan. auf die Idee bin ich natürlich auch gekommen.

die schnittstelle zwischen den beiden steuerungen wurde aber durch einen db realisiert, in dem nur real angelegt sind für die übertragung der analogen signale da wird also ein int (millisekunden) in real gewandelt und noch mit mul_r skaliert, damit sekunden übertragen werden. verglichen wird mit dem wert aus einem bedienbaustein OpAnl (Sorry, der ist garnicht int sondern gibt auch real).

ich habe jetzt mal herausgefunden, dass auf der quellsteuerung beim übertragenen real-wert das niederwertigste bit gesetzt ist. wenn ich in der variablentabelle diesen wert eintrage sehe ich im format gleitpunkt zum Beispiel 11.0. wenn ich beim steuerwert 11 eingebe, steht da auch 11.0

ändere ich die ansicht nun auf bin habe ich im statusfeld den wert 2#0100_0001_0011_0000_0000_0000_0000_0001, beim steuerwert aber 2#0100_0001_0011_0000_0000_0000_0000_0000. woher kommt diese 1 am ende?
 
Zwei Real-Werte auf Gleichheit zu prüfen wenn mit einem der beiden Werte schon eine Berechnung durchgeführt wurde, ist eine schlechte Idee.

Einfachstes Beispiel:
Eingabewert = 12.22
Ergebnis = Eingabewert / 3.0 * 3.0

Ein einfacher Vergleich auf ==R mit Eingabewert und Ergebnis ist nicht wahr, weil die Bitmuster sich aufgrund der leichten Ungenauigkeit bei Gleitkommazahlen in einem Bit unterscheiden.

Du kannst dir eine eigene Vergleichsfunktion schreiben, die eine maximale Differenz in den niederwertigsten Bits zulässt. Im Fachjargon nennen sich diese ULP = Unit in the last place. Das unterscheidet sich von einem Vergleich mit einer erlaubten absoluten Abweichung dadurch, dass es kein Absolutwertvergleich ist sondern dynamische Ungenauigkeiten an der kleinsten Stelle ausblendet.

Wenn du den Wertebereich vorher kennst, dann kannst du es natürlich auch mit einer max. abs. Abweichung umsetzen. Bei einer Universalfunktion würde ich auf die ULP Vergleichs-Lösung setzen.
 
Danke Thomas

Da hast du sicher recht. aber wenn man zum beispiel den int-wert 10 nach real konvertiert und dann mit 1.0000e-3 multipliziert, dann kann ich mir die ungenauigkeit nicht erklären. aber wer weiss schon, was dieser mul_r genau macht...

zuerst habe ich als lösung den real-wert nach dint konvertiert und dann wieder zurück nach real.
das hat zwar wunderbar funktioniert, ist aber sehr unschön. mit diesem murks konnte und wollte ich so nicht leben. habe dann doch lieber die sps geändert, von der die werte kommen und die ich eigentlich nicht anfassen wollte.

habe einfach, anstatt den realwert den int wert vor der konvertierung durch taustend geteilt.

danke und ein schönes wochenende
 
Zurück
Oben