Schrittweite bei Analogeingang

easy-rider

Level-2
Beiträge
18
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich glaube, ich habe einen Denkfehler und wollte mal fragen ob ich damit richtig liege.

Ich habe einen Analogeingang mit der 15 Bit hat aber einen Wertebereich von 0-10000. Die restlichen Bit werden abgeschnitten. Bei einem 0-10 V Signal braucht man so den Wert nicht mehr skalieren.
Wenn ich jetzt einen Abstand messe in einem Bereich von 0-30 cm dann erhalte ich folgende Formel: 30/10000 * Messwert. Den Messwerte lese ich als Word ein.

Der Messwert selbst hat bei mir im Programm immer eine konstante Schrittweite von 256. Das heißt also, wenn ich z.B. 15 cm Messe, dann habe ich bis zur nächsten Wertänderung im Programm immer ein paar mm, (ungefähr 8 mm) in plus und minus Richtung die sich der Abstand ändert aber CODESYS es sozusagen durch die 256 Schritte nicht mitbekommt.

Mache ich etwas falsch? Ich habe nur das Word auf die beiden Bytes gelegt, in denen der AI liegt und dann wie oben in der Formel verwendet. Habe ich nicht strenggenommen dadurch nur eine Auflösung von ungefähr 8 Bit weil ich nur den Wertebereich von 0-10000 habe?

Viele Grüße,
easy-rider
 
Zuviel Werbung?
-> Hier kostenlos registrieren
dann erhalte ich folgende Formel: 30/10000 * Messwert. Den Messwerte lese ich als Word ein.
Verwendest Du bei Deiner Berechnung Ganzzahl-Division? Vielleicht kommt daher eine scheinbare Schrittweite von 256? Wandle den Analogwert in REAL und rechne mit REAL - das wird genauer.

Ich habe einen Analogeingang mit der 15 Bit hat aber einen Wertebereich von 0-10000. Die restlichen Bit werden abgeschnitten.
Für 0..10'000 braucht man nur 14 Bit. Wieso gibt der Analogeingang ein so "verschlechtertes" Ergebnis, wenn er mit 15 Bit misst? Nachtrag: oder wandelt er -10.000 ... +10.000 ?

Harald
 
Zuletzt bearbeitet:
Guten Morgen,

also ich das lese das richtige Byte bzw. Word ein. Über den gesamten Messbereich habe ich dann auch einen Wert von 0-10000, nur halt in recht groben Schritten.

Ich wandle das WORD in REAL vorher und teile 30.0 durch 10000.0
Das macht aber keinen Unterschied.
rconv := word_to_real (wAnalogeingang)
rAbstand := (30.0/10000.0) * rconv

So in etwa sieht’s aus.

Die 256 sind auch nicht scheinbar sondern es ist genau immer diese Schrittweite um die es springt.
Ne leider sind das tatsächlich 0-10000. Negativ geht nicht.

Könnte man auch zwei Bytes einlesen und die dann addieren? Wie würde ich das machen?

Vielen Dank schon mal für die Hilfe
 
Um was für einen Sensor handelt es sich?
Bei IO-Link habe ich schon "komische" Belegungen in den Prozessdaten gehabt.
Da musste der Wert erst maskiert und geschoben werden.

Gruß
Blockmove
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das ist ein „ganz normaler“ 0-10 V Ausgang. Der Sensor kann zwar auch IO-Link aber es wird hier der Analogausgang genutzt. Das IO-Link Signal wird parallel gemessen wobei dabei auch eine Schrittweite von 256 auftritt was ich aber auf die 12 Bit Prozessdaten schiebe
 
Da musste der Wert erst maskiert und geschoben werden.
Die Schrittweite von 256 spricht dafür, dass an irgendeiner Stelle um genau ein ganzes Byte "geschoben" wird.
Inkrementiert man das höherwertige Byte um 1, so ist das identisch mit einer Erhöhung des ganzen Wortes um 256.
Bleibt zu klären, wohin das ursprüngliche, höherwertige Byte verschwindet und wo das neue, niederwertige Byte "hergezaubert" wird.
Oder, warum das niederwertige Byte "platt gemacht" wird.
 
Das ist ein „ganz normaler“ 0-10 V Ausgang. Der Sensor kann zwar auch IO-Link aber es wird hier der Analogausgang genutzt. Das IO-Link Signal wird parallel gemessen wobei dabei auch eine Schrittweite von 256 auftritt was ich aber auf die 12 Bit Prozessdaten schiebe

Die Erklärung 12Bit Prozessdaten und Sprünge mit 256 passt nicht.
256 sind 8 Bit.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Blöd gefragt: hat das was mit meiner Programmierung zu tun? Habe ich einen Fehler gemacht bzw. kann ich das irgendwie lösen?

@Blockmove: ist aber so wenn ich ganz ordinär die 16 Bit einlese und dann durch 16 teile damit ich 12 Bit = 4096 habe um im Register nicht schieben zu müssen
 
Zuletzt bearbeitet:
@Blockmove: ist aber so wenn ich ganz ordinär die 16 Bit einlese und dann durch 16 teile damit ich 12 Bit = 4096 habe um im Register nicht schieben zu müssen
Schieben nach rechts mit Vorzeichen um n BitPositionen ist doch identisch mit Dividieren durch 2[SUP]n[/SUP].

Was tut sich eigentlich im niederwertigen Byte? Ist sein Inhalt konstant? Immer 0?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@Blockmove: ist aber so wenn ich ganz ordinär die 16 Bit einlese und dann durch 16 teile damit ich 12 Bit = 4096 habe um im Register nicht schieben zu müssen

Nö, ist nicht so. Wenn ich eine Integer durch 16 teile, dann fallen die rechten 4 Bit weg.
Ein Sprung von 256 sind aber 8 Bit.
Stell mal deinen Code und die verwendeten Komponenten ein.
Ist wahrscheinlich sinnvoller.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,
also wir müssen unterscheiden:
Es gibt einmal einen IO-Link Wert, der aber eine untergeordnete Rolle spielt wo die Schrittweite ebenfalls 256 beträgt und es gibt den Analogwert des Sensors den ich eigentlich einlesen möchte. Warum ist erstmal egal.
@Blockmove: Was richtig ist und was nicht sei mal dahin gestellt, trotzdem beträgt die Änderung wenn ich den Wert über IO-Link einlese in Codesys 256. Das ich damit natürlich nicht glücklich bin ist wohl klar. Trotzalledem macht CODESYS es so, warum auch immer.

Im endeffekt, steht der Code oben.

rconv := word_to_real (wAnalogeingang)
rAbstand := (30.0/10000.0) * rconv

bzw.

iconv := int_to_real (iAnalogeingang)
rAbstand := (30.0/10000.0) * iconv

iAnalogeingang hat exakt 3328 und der nächste Wert, den iAnalogeingang hat ist dann 3584.

Ich habe es umwandeln in INT und UINT aber die Schrittänderung beträgt leider immer noch 256 und der Wert wird demnach auch nicht genauer.

Wie würde man den richtig den Wert shiften? Also bspw. um ein Bit?

Danke schon mal für die bisherige Hilfe :-)
 
Jetzt wissen immer noch nicht welchen Sensor an welcher Analoginput-Karte
Ja, leider. Aber meine Frage nach dem Inhalt des niederwertigen Bytes betrachte ich jetzt mal als beantwortet. In den beiden Beispielen 3328 und 3584 (0D00h und 0E00h) ist es immer sauber auf Null.
Nicht beantwortet bleibt, warum erscheint hier nicht das niederwertige Byte, das wir an der Schnittstelle erwarten würden?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn ich jetzt einfach mal 16 Bool Variablen erstelle und diese einfach in die beiden Bytes (input byte 6 und 7) packe dann sehe ich, dass der Wert bei 10 cm Abstand in Byte 6 konstant ist und in Byte 7 sich relativ schnell ändert. Irgendwie kommt mir das so vor, als seien das sozusagen die "Nachkommastellen". Von der Geschwindigkeit der Änderung würde das ja zu einem immer leicht wankenden Analogausgang eines Sensors in der dritten Nachkommastelle passen.
 
Wenn ich jetzt einfach mal 16 Bool Variablen erstelle und diese einfach in die beiden Bytes (input byte 6 und 7) packe dann sehe ich, dass der Wert bei 10 cm Abstand in Byte 6 konstant ist und in Byte 7 sich relativ schnell ändert.
Ich glaube, Du hast jetzt das niederwertige Byte (input byte 7) gefunden. Aber warum erscheint es nicht dort, wo Du damit weiter rechnest?
 
hmm... wie kann man es denn tauschen bzw. woran kann es liegen? ich habe ja iAnalogeingang bisher auf Byte 6 gelegt?
Müsste ich auf Byte 7 legen und dann irgendwie die Reihenfolge ändern?


 
Zurück
Oben