Schrittweite bei Analogeingang

Zuviel Werbung?
-> Hier kostenlos registrieren
Normalerweise brauchst du bei Codesys eigentlich nichts drehen, tauschen oder sonstwas.
Du hast aber schon eine 16Bit-Variable (WORD oder INT) auf die Hardwareadresse gemappt?
Entweder in der Hardware-Konfiguration oder in der Variablendefinition?
 
Hi Blockmove,

so siehts grad im Programm:
GwCoIwkDgmhFAPzHcTyg2l9SPqyOsS4KLtoAAEAACQGA9BEBY62GJmoAAEAACQGBDBEBYG4KLqoEAEAACQGA9BEBY62GJmoAAEAACQGBDBEBYG4KLqoEAEAACQGA9BEBY62GJmoAAEAACQGBDBEBYG4KLqoEAEAACQGA9BEBY62GJmoAAEAACQGBDBEBYG4KLqoEAEAACQGA9BEBY62GJmoAAEAACQGBDBEBYG4KLqoEAEAACQGA9BEBY62GJmoAAEAACQGBDBEBYG4KLqoEAEAACQGA9BEBY62GJmoAAEAACQGBDBEBYG4KLqoEAEAACQGA9BEBY62GJmoAAEAACQGBDBP4PymCChyp8nU4AAAAASUVORK5CYII=


Programm_Abstand.JPG

und die Variablen sehen so aus:

wAbstand: WORD;
rAbstand : REAL;

Viele Grüße und danke für die tatkräftige Unterstützung bei meiner Unfähigkeit
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Könnte es sein, daß der Analogeingang auf den "Bytes" 7 und 8 liegt?
Wie ist wAnalogeingang bzw. iAnalogeingang genau deklariert? Wie ist die Hardware-Adresse des Analogeingangs festgelegt?
Welche Analogeingangsbaugruppe verwendest Du? Eventuell auch nützlich: welchen Sensor verwendest Du?

Wenn Du die hier mehrfach angefragten grundlegenden Angaben standhaft "geheim hältst" dann können wir kaum fundiert helfen...

Harald
 
Ja genau also ich habe nicht indirekt adressiert sondern sie im Prozessabbild eingetragen wie in dem Miniscreenshot zu sehen. Könnte das der Fehler sein? Hmm... ich habe indirekt noch nicht probiert
 
Ich glaub das passt so nicht.

Du hast da stehen "input byte 6" und "usint" als Datentyp.

usint ist ist ein Unsigned Short Int mit einem Wertebereich von 0-255.

Ich würd mal behaupten, dass da was mit "input word 6" und "Int" als Datentyp hin muß.
Zumindest würd ich mal in der Richtung schauen :)
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Das ist glaube ich ein Punkt den ich nicht verstehe. Ich muss doch Byte 6 und 7 einlesen weil die doch zusammen meinen Analogeingang "bilden".
Ich müsste dann ja beide Bytes einzeln einlesen und auswerten.

Das habe ich halt über ein WORD gelöst. Wenn ich jetzt eine Variable als USINT einlese lese ich ja nur ein Byte ein. Nimmt man dann ein Array?

Bisher dachte ich halt, wenn man die Werte von zwei Bytes haben möchte bügelt man da ein WORD drüber. Habe ich zu stumpf gedacht? :confused:
 
Ich muss doch Byte 6 und 7 einlesen weil die doch zusammen meinen Analogeingang "bilden".
Du musst 2 Byte zusammen lesen, und zwar die beiden Bytes welche das %IW6 bilden - und das sind die %IB12 und %IB13 !
Dein "USINT AT %IW6" ist ein 8-Bit-Wert (Byte) der auf der selben Adresse liegt wie das IW6 - es ist das IB12.
Diese verwirrende Rechnung mußt Du aber gar nicht beachten wenn Du das IW6 gleich als 16-Bit-Wert deklarierst, also:
Code:
wAbstand AT %IW6 : WORD;
oder
iAbstand AT %IW6 : INT;
oder
iAbstand AT %IW6 : UINT;

Harald
 
Hallo Harald,

mache ich das denn nicht genauso wenn ich das im Prozessabbild direkt adressiere?

Ich habe ja im Prozessabbild meine WORD Variable auf das WORD 6 gelegt...
Bei mir ist es halt %IB1842.

Das ist ja das Register wo der Analogeingang liegt.
Ich habe grade mal was mit dem Array getestet aber im Prinzip ist es ja das gleiche

789.JPG
An der Stelle wo iAbstand[0] liegt, liegt sonst wAbstand (was dann 32xx erzeugt)

Gruß
 
Zuviel Werbung?
-> Hier kostenlos registrieren
???

Warum willst du Byte 6 und Byte 7 getrennt einlesen?
Lese doch einfach Word 6 ein. Das beinhaltet beide Bytes.

Wenn du es wirklich getrennt einlesen willst, dann eben in 2 getrennte Variablen.
Die kannst du hinterher verknüpfen
 
Aber nur das Einlesen von WORD 6 hat ja das bekannte Verhalten verursacht mit einer WORD Variablen, dass ich Sprünge von 256 habe.

Wie müsste ich das denn jetzt über direkte Adressierung richtig machen? Bzw. wie komme ich die richtige Adresse des WORD so dass ich indirekt adressieren kann.

%IW1842 funktioniert nicht. Dann wird kein Wert angezeigt deswegen habe ich bisher direkt im Prozessabbild adressiert weil ich da ja nur zählen brauche bis ich bei dem Modul an diesen beiden Registern anegkommen bin sozusagen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich hab dir doch gerade geschrieben, dass eine Word-Variable auf IB nur ein Byte einliest.
Daher die Sprünge von 256.

Um ein Ende zu finden:
Nimm 2 Variablen USINT.
Variable1 auf Byte6
Variable2 auf Byte7

iAbstand := (Variable1 * 256) + Variable2
 
Kann man in Codesys so deklarieren?
iAbstand AT %IB1842 : UINT;
oder
iAbstand AT IOL_4_4_I_O_Bytes_3 : UINT;
?

Schlimmstenfalls kannst Du die beiden USINT-Bytes auch zusammensetzen, etwa so:
Code:
iAbstand := SHL(LR3000_0.iAbstand[0], 8) OR LR3000_0.iAbstand[1]);
(ich weiß jetzt nicht, ob die Syntax für Codesys korrekt ist)

Harald
 
Ich hab dir doch gerade geschrieben, dass eine Word-Variable auf IB nur ein Byte einliest.
Daher die Sprünge von 256.

Um ein Ende zu finden:
Nimm 2 Variablen USINT.
Variable1 auf Byte6
Variable2 auf Byte7

iAbstand := (Variable1 * 256) + Variable2


Ich glaube, dass war des Rätsels Lösung...

Jetzt muss ich noch ein bisschen an der Normierung pfeilen aber ansonsten scheint es das gewünschte Ergebnis zu liefern...

Das heißt, mein Fehler war, dass ich dachte, dass ein WORD zwei Bytes einliest. Trotzalledem habe ich es jetzt nicht indirekt adressiert aber das lasse ich jetzt sein. Keine Ahnung wie ich das entsprechende Word jetzt rausbekomme... Mein Verständnis war: wVariable ins Byte packen wäre dann sozusagen, dass Word wo die Bytes liegen
 
Das mache ich morgen mal...

eine ganz kurze Frage nur noch:

iAbstand := (Variable1 * 256) + Variable2

Warum * 256?

Das macht ja quasi aus einem 8 Bit ein 16 Bit. Hätte das dann nicht auch mit 128 funktioniert? Mein Wertebereich ist bei 10000 zu Ende.

Viele Grüße und ein dickes Danke nochmal
 
Das niederwertige Byte hat den Wertebereich 0..255 das höherwertige Byte schliesst dann ab 256 daran an - deshalb das mutmasslich höherwertige Byte * 256. Das hat nicht mit deinem End-Wertebereich zu tun. Das der passt dafür sorgst du du deine nachgeschaltete Normierung (vielleicht schon mal von Dreisatz gehört ...)

Gruß
Larry
 
Zurück
Oben