Quantcast
Channel: SPS-Forum - Automatisierung und Elektrotechnik
Viewing all articles
Browse latest Browse all 49827

senden von klassen an die sps mit c#

$
0
0
Hallo,
ich muss mit c# komplexe strukturen an die sps senden.
solange das einfache datentypen sind funktioniert das auch alles über WriteAny().
dafür von der beckhoffseite:

Wenn Arrays, Strings oder boolsche Werte in einer Struktur/Klasse definiert sind, muss man festlegen, wie diese gemarshallt werden. Dies geschieht mit Hilfe des MarshalAs Attributs. Da Arrays und Strings unter .Net normalerweise keine feste Länge haben, muss mit dem Property SizeConst die Grösse des Arrays bzw. des Strings festgelegt werden. Das Marshallen von Mehrdimensionale Arrays oder Arrays von Strukturen ist mit dem Marhaler des .NET Frameworks 1.1 nicht möglich. Mehrdimensionale Arrays müssten auf eindimensionale Arrays abgebildet werden. Arrays von Strukturen müssten in der .NET Struktur aufgelöst werden.
In dem Beispiel wird das MarshalAsAttribute in der Klasse ComplexStruct verwendet:
[StructLayout(LayoutKind.Sequential, Pack=1)] // TwinCAT2->Pack=1 TwinCAT3->Pack=0
public class ComplexStruct
{
public short intVal;
//specifies how .NET should marshal the array
//SizeConst specifies the number of elements the array has.
[MarshalAs(UnmanagedType.ByValArray, SizeConst=4)]
public int[] dintArr = new int[4];
[MarshalAs(UnmanagedType.I1)]
public bool boolVal;
public byte byteVal;
//specifies how .NET should marshal the string
//SizeConst specifies the number of characters the string has.
//'(inclusive the terminating null ).
[MarshalAs(UnmanagedType.ByValTStr, SizeConst=6)]
public string stringVal = "";
public SimpleStruct simpleStruct1 =new SimpleStruct();
}
bei mir konkret:

[StructLayout(LayoutKind.Sequential, Pack = 0)]


public class C1
{
private bool _exist;
private short _numb;



private Pos _pos;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst =5)]
private string _liquid;


private float _volume;
private Pos _pos2;
}

[StructLayout(LayoutKind.Sequential, Pack = 0)]//this is necessary in order to use a handler for a struct
public class Pos
{


private short _id;//
[MarshalAs(UnmanagedType.I1)]
private bool _o;
private short _a;
private float _x; //
private float _y; //
private float _z; //
}


in der SPS:

TYPE ST_Class1 :
STRUCT
bExist : BOOL;
nNumb : INT;
sPos : ST_Position;
sLiquid : STRING; // Kind of Liquid
fVolume : REAL; // Ammount of liquid in Well
sPos2 : ST_Position; // coordinates [mm] of the Well XY-center at the top


END_STRUCT
END_TYPE



Das funktioniert leider nicht ein class1-objekt zu senden. Also an die sps nur ein Pos senden geht und auch ein Array von Pos.
Der Anfang stimmt überein, aber hinter dem String also die Werte des floats volume und des 2. pos werden nicht mit übertragen.
Wenn ich den String liquid aber rausnehme, dann klappt das.
liegt das an dem string? wie kann ich strings darin mitversenden, damit es funktioniert? welche größe (Marshall As) muss ich dem string geben?

Viewing all articles
Browse latest Browse all 49827


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>