# UDINT in TwinCAT verarbeiten und skalieren



## olitheis (30 November 2010)

Hallo,
ich bekomme von einem Geber ein Signal im Bereich von 0-92160 Einheiten im UDINT Format. Hierbei handelt es sich um einen Absolut-Drehgeber, den ich auf eine Auflösung von 256 Units per Umdr (kleinst mögliche) konfiguriert habe. Insgesamt muss er 350 Umdr. machen, woraus sich die max. 92160 Einheiten ergeben. Über einen Skalierungsbaustein möchte ich nun den Abgleich für den Geber vorgeben. 
______________
Beispiel: 
In(min): 0 mm
In(max): 5000 mm
Out(min): 3420
Out(max): 88590
_______________
Manuell in TwinCAT funktioniert das auch tadellos. Wenn ich aber nun den Abgleich über meine (externe) Visualisierung vornehmen möchte, habe ich das Problem, dass nur Eingaben im Bereich von 0-32768 möglich sind.
Gibt es nun eine Möglichkeit, den UDINT so anzupassen bzw. aufzuteilen? 
Vielen dank


----------



## Verpolt (30 November 2010)

Hallo



> ...dass nur Eingaben im Bereich von 0-32.768 möglich sind.



das wäre ja nur ein SINT

SINT    =  -32767  -           32.768
UINT  =    0          -           65.535	
UDINT=    0          - 4.294.967.295

Im Display müsstest ein UDINT anlegen (oder UINT)


----------



## olitheis (30 November 2010)

> Im Display müsstest ein UDINT anlegen (oder UINT)


Das ist der Haken! Ich habe so einfach nicht die Möglichkeit, die Eingabewerte zu beeinflussen.

Gibt es nicht eine Möglichkeit den UDINT in Low Word/High Word zu splitten oder ähnlich?


----------



## Werner29 (30 November 2010)

Die einfachste Möglichkeit dazu:

pwords: POINTER TO ARRAY[0..1] OF UINT;
dw : UDINT;

pwords := ADR(UDINT);

in pwords^[0] steht dein Highword
in pwords^[1] steht dein Loword


----------



## olitheis (30 November 2010)

Hallo,
könntest Du mir evtl. etwas näher erläutern, wie das zu verstehen ist und wie ich die pwords
verwenden kann?
Vielen Dank


----------



## Werner29 (30 November 2010)

Hi,

du wolltest ein UDINT in Highword und Loword aufteilen.

Deklaration:
pwords: POINTER TO ARRAY[0..1] OF UINT;
dw : UDINT;
ui1, ui2 : UINT;

ST-Code:
// der Pointer zeigt auf das UDINT interpretiert es aber als Array von UINT
// hier muss natürlich dw stehen:
pwords := ADR(dw);
ui1 := pwords^[0];  // ui1 enthält jetzt das Highword
ui2 := pwords^[1];  // ui2 enthält jetzt das Loword

Bernhard


----------



## olitheis (30 November 2010)

> du wolltest ein UDINT in Highword und Loword aufteilen.


ist etwas übertrieben, ich habe davon gehört, aber nie benutzt.

Deshalb wäre ich dir verbunden, wenn Du mir etwas genauer erklären könntest, wie sich der Pointer zusammensetzt, was der ADR befehl macht.
Und wie ich nachher in meinem beispiel das HighWord und LowWord 
verwende.
Danke


----------



## StructuredTrash (30 November 2010)

Warum kannst Du in der Visu denn nur Werte bis 32768 eingeben? 32767 würde ich ja noch verstehen, das wäre die Obergrenze eines vorzeichenbehafteten 16 Bit-Integers.
Wenn Deine Visu keine 32 Bit-Integer kennt, bleibt noch der Umweg über Real-Variablen. Die kannst Du dann im
TwinCat-Projekt umwandeln (Real_to_UDINT).


----------



## olitheis (30 November 2010)

Ja es sind 32767.


> Wenn Deine Visu keine 32 Bit-Integer kennt, bleibt noch der Umweg über Real-Variablen. Die kannst Du dann im
> TwinCat-Projekt umwandeln (Real_to_UDINT).


Wie soll ich das verstehen? Von der Visu bekomme ich ja nur max. 32767 Units.
Den Geber skalieren muss ich aber von 0-92160, ich denke auch, um meine Auflösung zu behalten.

Ich versuche auch noch dahinter zu kommen, wie Werner29 das mit den Low- und HighWords realisieren wollte. Ich habe sein Beispiel mal getestet und das sieht so aus, dass das LowWord Werte von 0-65565 annimmt und das HighWord 0 und 1 ist (kann auch sein, dass es umgekehrt war).

Also 32767 müsste 92160 entsprechen. Ich könnte ja der Einfachheit halber die Eingabe in Real umwandeln und mit 2.8 multiplizieren. Aber es ist ja so, dass der Bediener die Einheiten angezeigt bekommt, je nach Position. Und da stoße ich ja auch auf die 16bit Grenze. Also müssten die 92160 Units (als UDINT vom Geber) in TwinCAT schon auf 32767 "runterreduziert werden". Fragt sich nur, inwiefern dass einen Einfluss auf die Auflösung hat.
Irgendwie habe ich jetzt einen Knoten im Kopf.


----------



## MSB (30 November 2010)

olitheis schrieb:


> Ich versuche auch noch dahinter zu kommen, wie Werner29 das mit den Low- und HighWords realisieren wollte. Ich habe sein Beispiel mal getestet und das sieht so aus, dass das LowWord Werte von 0-65565 annimmt und das HighWord 0 und 1 ist.



Also, jetzt finde halt erst mal raus was du eigentlich willst, dann stellst du hier nochmal eine Frage!

Du Fragtest:


			
				olitheis schrieb:
			
		

> Gibt es nicht eine Möglichkeit den UDINT in Low Word/High Word zu splitten oder ähnlich?


woraufhin dir Werner29 eine Lösung für deine Idee präsentiert hatte.
Und jetzt weißt du plötzlich nicht mehr was du mit deinem Lösungsvorschlag eigentlich wolltest?
92160 = Binär 10110100000000000
Das Rote wäre nun also das Low-Word.
Also pendelt dein High-Word zwischen 0 und 1.

Mfg
Manuel


----------



## StructuredTrash (30 November 2010)

Ich meine, dass Du innerhalb der Visu mit Real-Variablen arbeiten kannst, wenn die Visu Reals unterstützt. Natürlich brauchst Du auf der TwinCat-Seite dann auch Real-Variablen.

```
VAR
   Encoder_Istwert:UDINT;
   Encoder_Sollwert:UDINT;
   Visu_Istwert:Real;
   Visu_Sollwert:Real;
END_VAR
```
und im Programm

```
Visu_Istwert:=UDINT_tO_REAL(Encoder_Istwert);
Encoder_Sollwert:=REAL_TO_UDINT(Visu_Sollwert);
```
Wenn Deine Visu auch keine Reals unterstützt, wird es schwierig. Die Hi/Lo-Word-Splitterei hilft Dir da auch nicht, weil Deine Visu das oberste Bit des Low Bytes als Vorzeichen interpretiert. Wie willst Du ausserdem dem Bediener klarmachen, dass er eine Anzeige wie "1:10000" als "1 x 32768 + 10000" zu interpretieren hat.
Dann lieber eine Anzeige im Format "xxx Umdrehungen + yyy Inkremente". Da würdest Du ja mit 16 Bit-Integerzahlen hinkommen.


----------



## PN/DP (1 Dezember 2010)

olitheis schrieb:


> Wenn ich aber nun den Abgleich über meine (externe) Visualisierung vornehmen möchte, habe ich das Problem, dass nur Eingaben im Bereich von 0-32768 möglich sind.





olitheis schrieb:


> > Im Display müsstest ein UDINT anlegen (oder UINT)
> 
> 
> Das ist der Haken! Ich habe so einfach nicht die Möglichkeit, die Eingabewerte zu beeinflussen.


Nochmal die Frage: Warum kannst Du in der Visu nur Werte bis 32767 eingeben?
Was ist das für eine Visualisierung? Welches Produkt? Kannst Du das Visu-Projekt bearbeiten?
Was heißt das: _"Ich habe so einfach nicht die Möglichkeit, die Eingabewerte zu beeinflussen."_ ?

Du müsstest in der Visu einfach nur den Typ Deiner Variablen auf 32-Bit-Ganzzahl (DINT oder UDINT) ändern. 
In manchen Visu heißt der Datentyp auch LONG oder ULONG.

Harald


----------



## olitheis (5 Dezember 2010)

Wir haben sozusagen nur die Laufzeit der Visualisierung, die .exe. 
Außer den Standardseiten gibt es hier noch/nur die Möglichkeit sogenannte "Benutzerdefinierte Seiten" anzulegen. Hier hat man die Möglichkeit Textfelder, Zeitbalken, Eingabefelder, Schalter usw. anzulegen, die man im TwinCAT PLC verknüpfen kann. Ich glaube, LREAL ist hier das Maximum.


----------



## StructuredTrash (6 Dezember 2010)

Wenn die Visu LREAL kann, dann sollte sie wohl auch 32 Bit-Integer kennen. DWORD, DINT, UDINT, LONG, ULONG oder wie immer die dort heissen mögen. Und wenn es die wirklich nicht gibt, dann nimm eben LREAL.


----------

