Reflections Reihenfolge GetFields/GetProperties
-
Ich will Datenstrukturen eines externe Systems (SPS) auf Strukturen in der .NET Domain "mappen". in dem Fall bilde ich die Strukturen(1:1) ab und mappe die bytehaufen.. da muss gewährleistet sein, dass ich die Felder in richtiger Reihfolge (offest) bekomme...
-
Wenn das PODs sind, macht die Marshal Klasse das für dich richtig.
-
Moment mal, wozu genau brauchst du da jetzt Reflection?!
-
Hmm.. es sind POD's => Beckhoff! Beckhofe verwendet 8 Byte Struct Aligment!
Habe auch schon die strukturen nach gebaut und mit Marshal (Sizeof) evaluiert, aber es kommen andere größen raus wie in Beckhof!
Reflections hab ich deshalb gebraucht, weil wohl die Marshalklasse und StructLayout sich nich so verhält wie es Beckhof macht, und ich das Datenmodel analysieren musste!! und entsprechedne Padding bytes (offset) setzen
-
.NET verwendet soweit ich weiss auch per Default 8 Byte Alignment. Kannst du aber alles kontrollieren, da gibt es Attributes dafür.
z.B. StructLayoutAttribute
https://msdn.microsoft.com/en-us/library/system.runtime.interopservices.structlayoutattribute(v=vs.100).aspx?f=255&MSPPError=-2147217396Als Notlösung kannst du sogar auf "manuell" umschalten und jeden Offset selbst eingeben. Irgendwas über Reflection zu machen ist also ziemlich sicher nicht nötig.
-
@hustbear: Ja das mit structLayout etc. hab ich schon probiert und Pack=8 etc. aber leider kommen andere größen raus wie auf Beckhoff... siehe Link!
Aber ich hab jetzt ne andere Möglichkeit gefunden, Die Symbolstruktur der SPS auszulesen, über dies kann ich dann die Daten easy mappen.. glaub ich;)
Danke euch
-
Was für größen haben die Werte denn in der Beckhoff SPS und was für größen in deinem Struct? Im Zweifel ist eventuell nur der falsche Typ im Struct verwendet?
-
NullBockException schrieb:
@hustbear: Ja das mit structLayout etc. hab ich schon probiert und Pack=8 etc. aber leider kommen andere größen raus wie auf Beckhoff... siehe Link!
Glaub ich nicht.
Zeig ein Beispiel.
-
TYPE ST_A1
STRUCT
ui8 : BYTE := 16#FF;(* FF )
ui32 : DWORD := 16#AABBCCDD;( DD CC BB AA )
rsv : BYTE := 16#EE;( EE
END_STRUCT
END_TYPETYPE ST_A2
STRUCT
ui16 : WORD := 16#1234;(* 34 12 )
ui8 : BYTE := 16#55;( 55
END_STRUCT
END_TYPETYPE ST_TEST4
STRUCT
a1 : ST_A1;
a2 : ST_A2;
END_STRUCT
END_TYPE
test4 : ST_TEST4;test4 => 16 Beckhoff
test4=> 14 .NET
-
struct Test11 { public int[, ,] Fields; } [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 8)] [AdsStructure] struct ST_A1 { public byte ui8; public int ui32; public byte res; } [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 8)] [AdsStructure] struct ST_A2 { public short ui16; public int ui8; } [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 8)] [AdsStructure] struct ST_TEST4 { public ST_A1 a1; public ST_A2 a2; }
sorry .NET => 20
-
Vielleicht verwendest du wie ich sagte einfach die falschen .NET Typen. Ein Beispiel:
TYPE ST_A1 STRUCT ui8 : BYTE := 16#FF;(* FF *) ui32 : DWORD := 16#AABBCCDD;(* DD CC BB AA *) rsv : BYTE := 16#EE;(* EE *) END_STRUCT END_TYPE
Hier müssten im Struct die Typen byte und uint verwendet werden.
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 8)] [AdsStructure] struct ST_A1 { public byte ui8; public uint ui32; public byte res; }
EDIT: Weil mir gerade dannach ist für das andere Struct hier auch noch:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 8)] [AdsStructure] struct ST_A2 { public ushort ui16; public byte ui8; }
Nach den Anpassungen bekomme ich mit
ST_TEST4 test = new ST_TEST4(); Marshal.SizeOf(test);
den Wert 16.
Und für weitere Informationen zu den Datentypen: Vergleich Datentypen
-
Naja wenn man nicht auf den 1. Blick sieht dass bei
int ui8
was nicht stimmen kann, dann bekommt man natürlich Blödsinn raus. GIGO halt.
-
Fuck man.. :(( Wieso hab ich das übersehen.. Danke Dir:)