c# - 将带有 double 的 C 结构编码到 C# - 正值错误

标签 c# struct double marshalling

首先:我刚接触编程,如果这个问题太愚蠢,我很抱歉。但是我已经搜索了 5 天的解决方案,现在我迷失了方向:/

我需要通过 C# 程序控制 CNC 机器。 CNC 机器的 API 是一个用 C 语言编写的 *.dll,所以我需要整理所有不同的数据类型。几乎一切正常,但有一个奇怪的问题。 只有负 double 才能很好地工作。积极的只是错误的。如果我定义 y=1,则 X 轴移动到它的边界并发生碰撞。边界在 y>500

不同轴的坐标在dll中被定义为一个struct。

标题:

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# 脚本中创建了一个用于编码的结构:

[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);
    }

我试图将 double 定义为 64 位 float (通过 MarshalAs...R8 之类的东西),但结果是一样的。不同的 CallingConventions 也没有改变。 调试在 c#-struct 中显示了正确的值,因此问题出在编码过程中的某个地方。

有人可以帮我解决这个问题吗?

谢谢, 里戈

最佳答案

现在一切正常...就像我想的那样,Y 轴的起始位置在控制单元中并未保存为“0”。它是“Y0 = -500”。

所以:

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

抱歉这个问题。

关于c# - 将带有 double 的 C 结构编码到 C# - 正值错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44825713/

相关文章:

swift - 让或结构与枚举

c# - 在 C# 中将指向结构的指针作为函数参数传递

c - Linux C 编程

java - Arraylist - 字符串/ double

c# - WPF:DataGrid 在值更改时排序

c# - 如何在 WebAPI 中将 null 值传递给可空类型

iphone - iPhone 如何将 double 类型转换为 string 类型?

java - 在Java中如何缩短长十进制数?

c# - 在 if 语句中声明 var C#

c# - 画一个长方形