4
第一:我對編程很感興趣,所以如果這個問題太愚蠢,我很抱歉。但我已經搜索了5天的解決方案,現在我失去了和絕望:/將C-Struct與C#綁定到C# - 正值錯誤
我需要通過C#程序控制CNC機器。 CNC機器的API是用C編寫的* .dll,所以我需要編組所有不同的數據類型。幾乎一切正常,但有一個奇怪的問題。 只有負面的雙打工作得很好。積極的人是錯的。如果我定義y = 1,則X軸移動到它的邊界併發生碰撞。邊界位於y> 500
不同軸的座標被定義爲dll中的結構。
頭:
typedef struct _CNC_CART_DOUBLE
{
double x,y,z,a,b,c;
} CNC_CART_DOUBLE;
C函數:
/*
* Name : CncMoveTo
* In : pos[i] position to move to for axis i,
* move[i], if 1 axis i will move, if false no move.
*
* Out : -
* Return : See CNC_RC values
* Descr : Move joints/motors to given position
*/
CNC_RC EXP2DF __stdcall CncMoveTo(CNC_CART_DOUBLE pos, CNC_CART_BOOL, double velocityFactor);
所以我創建了一個結構在我的C#-Script爲marschaling:
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct CNC_CART_DOUBLE
{
public double x;
public double y;
public double z;
public double a;
public double b;
public double c;
}
的dll導入:
[DllImport("cncapi.dll", CallingConvention = CallingConvention.StdCall)])
public static extern void CncMoveTo(CNC_Vars.CNC_CART_DOUBLE pos, CNC_Vars.CNC_CART_BOOL achse, double velocityFactor);
和測試:
private void btn_MoveTo100_Click(object sender, RoutedEventArgs e)
{
CNC_Vars.CNC_CART_BOOL _achsenAn = new CNC_Vars.CNC_CART_BOOL();
_achsenAn.x = 1;
_achsenAn.y = 1;
_achsenAn.z = 1;
_achsenAn.a = 0;
_achsenAn.b = 0;
_achsenAn.c = 0;
CNC_Vars.CNC_CART_DOUBLE _koords = new CNC_Vars.CNC_CART_DOUBLE(); // Koordinatenachsen beachten--> X=negativ, Y=Positiv, Z=Negativ
_koords.x = -100.0;
_koords.y = 1.0;
_koords.z = -100.0;
_koords.a = 0;
_koords.b = 0;
_koords.c = 0;
double velocityfactor = 0.5;
CNC_Methods.CncMoveTo(_koords, _achsenAn, velocityfactor);
}
從來就試圖定義雙打爲64位浮動數(通過的MarshalAs ...一些R8),但結果是一樣的。不同的CallingConventions也沒有改變。 調試在c#-struct中顯示正確的值,所以問題在編組過程中的某處。
有人可以幫助我嗎?
謝謝 Riggo