将C-Struct与C#绑定到C# - 正值错误

问题描述:

第一:我对编程很感兴趣,所以如果这个问题太愚蠢,我很抱歉。但我已经搜索了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

现在一切工作正常... Y轴的家庭位置正好isn't在控制单元保存为“0”,就像我想。这是“Y0 = -500”。

所以:

_koords.y = (y-Value) - 500; 

很抱歉的问题。