将双精度的 C-Struct 编组为 C# - 正值错误
Posted
技术标签:
【中文标题】将双精度的 C-Struct 编组为 C# - 正值错误【英文标题】:Marshaling C-Struct with doubles to C# - positive Values wrong 【发布时间】:2017-12-03 04:32:24 【问题描述】:首先:我对编程很陌生,所以如果这个问题太愚蠢,我很抱歉。但我已经搜索了 5 天的解决方案,现在我迷失了绝望:/
我需要通过 C# 程序控制 CNC 机床。 CNC 机器的 API 是用 C 编写的 *.dll,因此我需要编组所有不同的数据类型。几乎一切正常,但有一个奇怪的问题。 只有负双打效果很好。积极的只是错误的。如果我定义 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#-Script 中创建了一个结构用于编组:
[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 中显示了正确的值,因此问题出在编组过程中。
有人可以帮我解决这个问题吗?
谢谢你, 瑞哥
【问题讨论】:
【参考方案1】:现在一切正常……Y 轴的起始位置并没有像我想的那样在控制单元中保存为“0”。它是“Y0 = -500”。
所以:
_koords.y = (y-Value) - 500;
抱歉这个问题。
【讨论】:
以上是关于将双精度的 C-Struct 编组为 C# - 正值错误的主要内容,如果未能解决你的问题,请参考以下文章