Modbus Kommunikationsfehler ADS-Fehlercode 6

Zuviel Werbung?
-> Hier kostenlos registrieren
Nun kommen wir der Sache schon näher, aber da steht E-25, es sollten um die 215 Ampere sein.
Die Werte der Bytes von Beitrag #20 passen nicht zusammen... Die lassen sich nicht zu REAL 215.xxx zusammensetzen.

Anhand der per Modbus empfangenen Werte in Deinen Beiträgen #12 und #14 vermute ich, daß Du die BYTE so zum REAL zusammenfügen musst:
Code:
uConvert.arrUDP_Data[3] := arrUDPData1[1];  //mb_Input_Registers[2]
uConvert.arrUDP_Data[2] := arrUDPData1[0];  //mb_Input_Registers[1]
uConvert.arrUDP_Data[1] := arrUDPData1[3];  //mb_Input_Registers[4]
uConvert.arrUDP_Data[0] := arrUDPData1[2];  //mb_Input_Registers[3]
fValue := uConvert.rReal;

mb_Input_Registers ist ein/Dein Array [1..x] OF BYTE

Harald
 
Die Werte der Bytes von Beitrag #20 passen nicht zusammen... Die lassen sich nicht zu REAL 215.xxx zusammensetzen.

Anhand der per Modbus empfangenen Werte in Deinen Beiträgen #12 und #14 vermute ich, daß Du die BYTE so zum REAL zusammenfügen musst:
Code:
uConvert.arrUDP_Data[3] := arrUDPData1[1];  //mb_Input_Registers[2]
uConvert.arrUDP_Data[2] := arrUDPData1[0];  //mb_Input_Registers[1]
uConvert.arrUDP_Data[1] := arrUDPData1[3];  //mb_Input_Registers[4]
uConvert.arrUDP_Data[0] := arrUDPData1[2];  //mb_Input_Registers[3]
fValue := uConvert.rReal;

mb_Input_Registers ist ein/Dein Array [1..x] OF BYTE

Harald
Die Anordnung hat funktioniert!
Jetzt zeigt es die richtigen Werte an.

Könntest du mir kurz erläutern wie du darauf gekommen bist das die Bytes nicht zusammenpassen, sieht man das sofort oder gibts da so einen Trick?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Durch Logik:
Bei Codesys liegen Mehrbyte-Zahlenwerte Little-Endian im Speicher. Modbus transportiert die Werte Big-Endian. Der FB_MBReadRegs tauscht offensichtlich schon die Bytes in den WORD-Registern, kann aber nicht wissen, welche WORD zusammen ein REAL bilden. Deshalb müssen auch noch die WORD getauscht werden: die Bytes (3 und 2) mit (1 und 0).

Kontrolle:
Die Werte der Bytes in hexadezimal wandeln (Windows Taschenrechner) und in der vermuteten Reihenfolge für big-endian in einem IEEE-754 Konverter eingeben bei "Hexadecimal Representation" und schauen, ob sich ein sinnvoller Float-Wert ergibt. ggf. die Bytes in anderer Reihenfolge testen.


Hinweis: Das Janitza UMG96-PA kann die Werte auch little-endian liefern. Aus dem Handbuch der Modbus-Adressenliste:
Die in dieser Adressenliste beschrieben Adressen liefern die Daten im Format „Big-Endian“ zurück.
Wenn Sie Daten im Format „Little-Endian“ benötigen, müssen Sie zur Adresse den Wert 32768 addieren.
Allerdings müsste dann dem FB_MBReadRegs mitgeteilt werden, daß er die Bytes nicht drehen soll. Geht das???

Harald
 
Zuletzt bearbeitet:
Was sagt den das Handbuch was für Datentypen da übertragen werden? Sicher 215A und nicht 251A? Bei letzterem würden die 103 und 98 in ein Integer gepackt nämlich 25191 ergeben was 251,91A entsprechen könnte.
Nachtrag: PN/DP war schneller, seine Idee wäre mein zweiter Vorschlag.
 
Was sagt den das Handbuch was für Datentypen da übertragen werden?
In Beitrag #7 kann man sehen, daß 6 Register ab Adresse 19012 gelesen werden.

Code:
Adressenliste UMG 96-PA
Häufig benötigte Messwerte

Adresse Format RD/WR Variable Einheit Bemerkung
-------------------------------------------------

19012   float  RD    _ILN[0]  A       Current, L1
19014   float  RD    _ILN[1]  A       Current, L2
19016   float  RD    _ILN[2]  A       Current, L3
 
Zurück
Oben