Messwert (Word) in Negativzahl umwandeln

tiego

Level-1
Beiträge
51
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Tag,

Ich habe das Problem das Ich von einem Modbus TCP Zähler Messwerte in Positiver und Negativer form erhalten kann.
"Wirkleistung Phase 1 +/- kW/100"
Jeder messwert besteht aus 2 Wörtern.

bislang hatte Ich nur Positive werte, dies habe Ich mit folgenden Kode errechnet:
Code:
Spannung_A := (WORD_TO_REAL(MW1003)/100) + (WORD_TO_REAL(MW1002)*1000);

aber Wie stelle Ich das an wenn Ich negativwerte auswerten muss?

Ich erhalte z.B. momentan MW1004=65535 und MW1004=65328

mein test war folgender aber leider ohne erfolg:
Code:
Spannung_A := (DWORD_TO_REAL((MW1003*1000000)+MW1002))/100

Es gibt sicher eine Simple lösung aber Ich stehe auf der Leitung....
 
Was genau für ein Format liegt dem denn zugrunde?
Wäre auch ganz gut zu wissen, was bei einer positiven Zahl ankommt, damit man mal darüber nachdenken kann.
Ich nehme mal an die beiden Word sind zusammengesetzt eine DINT.

dann ist
65535 = FFFF hex
65328 = FF30 hex

zusammengesetzt FFFF FF30 wäre dann als negative DINT --> -208


Code:
[COLOR=#333333]VAR
    myDInt : DInt;
    ptrWordArray : POINTER TO ARRAY[0..1] OF [/COLOR][COLOR=#417394]Word[/COLOR][COLOR=#333333];[/COLOR]
[COLOR=#333333]END_VAR
[/COLOR]
[COLOR=#333333]//Code:
ptrWordArray := ADR(myDInt);

ptrWordArray^[0] := MW1002;
ptrWordArray^[1] := MW1003;[/COLOR]


Zum Schluß steht in myDint der Wert, das geht sowohl für die positiven, als auch für die negativen Werte, kann also immer so verwendet werden.
Möglicherweise mußt du MW1002 und MW1003 noch vertauschen.

 
Zuletzt bearbeitet:
In myDInt steht ja dann dein "gewandelter" Wert, den kannst du wegspeichern und dann witermachen

Code:
[COLOR=#333333]ptrWordArray^[0] := MW1002;
ptrWordArray^[1] := MW1003;

Wert_001 := myDInt;

[/COLOR]
[COLOR=#333333]ptrWordArray^[0] := MW1004;
ptrWordArray^[1] := MW1005;

Wert_002 := myDInt;

[/COLOR]
[COLOR=#333333]ptrWordArray^[0] := MW1006;
ptrWordArray^[1] := MW1007;

Wert_003 := myDInt;

...

[/COLOR]


Viel schöner wäre allerdings, wenn du die Word in einem Array hättest, dann ginge das perfekt mit einer Schleife zu machen.

Code:
[COLOR=#333333]For I:= 0 To 199 Do

    ptrWordArray^[0] := ModbusArray[(I * 2)];
    ptrWordArray^[1] := [/COLOR][COLOR=#333333]ModbusArray[((I * 2)+1)];[/COLOR][COLOR=#333333]

    WertArray[I] := myDInt;

End_For;[/COLOR]

ModbusArray[0…399] of Word
WertArray[0…199] of Dint
 
Vielen dank,
hatt sich alles erledigt und ich habe mir für so ne einfache sache 2 Tage verbraten.

oft ist Fragen einfach besser...

Vielen danke nochmals
 
Zurück
Oben