Twincat 2 ModbusTCP

Donaldo

Level-1
Beiträge
4
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich habe ein Problem mit dem Modbus TCP Adapter:
Ich möchte über ModbusTCP Temperaturwerte und Energiewerte eines Energieventils von IMITA auswerten, leider gelingt es nicht...
Vielleicht könnt ihr mir helfen?
Die RegisterAdresse die ich auslesen möchte ist zb.: 322-323 ...das sollte ein Float Wert sein. (supply Temp)
Laut TA_Smat Protocol steht auch noch was von : Endianness (float): Big-endian;
soweit bin ich schon gekommen:

VAR
Value : ARRAY [1..2] OF WORD;
Test_Temperatur_1 : FB_MBReadRegs;
END_VAR

Test_Temperatur_1(
sIPAddr:='192.168.21.121' ,
nTCPPort:=502 ,
nUnitID:= 16#FF,
nQuantity:= 2,
nMBAddr:=322 ,
cbLength:=SIZEOF(Value) ,
pDestAddr:=ADR(Value),
bExecute:=ton_read.Q ,
tTimeout:=t#5s ,
bBusy=> ,
bError=> ,
nErrId=> ,
cbRead=> );

das funktioniert soweit... ich bekomme hier bei Value 2 Werte angezeigt: Value[1]: 17025, Value[2]: zwischen 5000+60000 ?
auch bei andern Registern (Rücklauftemperatur) das gleich.
Leider komme ich so nicht auf meine "REAL" Temperatur Werte.

Hoffe Ihr könnt mir weiterhelfen, bin da noch neu auf dem Gebiet.
SG DANI
 
Du musst deine 2 WORDS zu einem DWORD zusammenfassen. Bei Big Endian ist Value1 der höherwertige Teil und Value 2 der niederwertige.

Code:
dw : DWORD;

dw := Value[1];
dw := SHL(dw,16);   <---- nach links shiften um 16 Bit
dw := dw + Value[2];

Jetzt hast du ein 4 Byte DWORD das aus (Value[1] Value[2]) besteht.

Das muss dann noch in ein Real umgewandelt werden. Das geht mit einem Pointer.

Code:
pReal : POINTER TO REAL;
rTemperatur : REAL;

pReal := ADR(dw);   <---- Pointer zeigt auf die Adresse von dw
rTemperatur := pReal^; <---- dereferenzieren des Pointer (Wert der Adresse holen)

Wenn ich hier keinen Bock geschossen habe, sollte dir rTemperatur jetzt den Messwert korrekt ausgeben.
 
Zurück
Oben