封锁C-Struct与双打到C# - 正值错误

时间:2017-06-29 12:53:44

标签: c# struct double marshalling

首先:我很喜欢编程,所以如果这个问题太愚蠢我很抱歉。但我已经搜索了5天的解决方案,现在我迷失了,没有希望:/

我需要通过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-Import:

[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

1 个答案:

答案 0 :(得分:0)

现在一切正常...... Y轴的原点位置在控制单元中没有保存为“0”,就像我想的那样。这是“Y0 = -500”。

所以:

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

对不起该问题。