首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将带有doubles的C结构编组为C# -正值错误

将带有doubles的C结构编组为C# -正值错误
EN

Stack Overflow用户
提问于 2017-06-29 20:53:44
回答 1查看 171关注 0票数 4

首先:我是编程新手,所以如果这个问题太愚蠢了,我很抱歉。但我已经寻找了5天的解决方案,现在我迷失了方向,无望了:/

我需要通过C#程序来控制一台数控机床。数控机床的API是一个用C编写的*.dll,所以我需要编组所有不同的数据类型。几乎所有的东西都工作得很好,但是有一个奇怪的问题。只有负的双倍才行得通。积极的观点是错误的。如果我定义了y=1,X轴就会移动到它的边界并发生碰撞。边界在y>500

不同轴的坐标在dll中定义为结构。

标题:

代码语言:javascript
复制
typedef struct _CNC_CART_DOUBLE
{
    double x,y,z,a,b,c;
} CNC_CART_DOUBLE;

C-函数:

代码语言:javascript
复制
/*
* 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#脚本中创建了一个用于marschaling的结构:

代码语言:javascript
复制
[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-导入:

代码语言:javascript
复制
[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);

测试:

代码语言:javascript
复制
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...something R8),但结果是相同的。不同的CallingConventions也没有任何改变。调试在c#-struct中显示了正确的值,因此问题出在封送处理过程中的某个地方。

有人能帮我一下吗?

谢谢你,里戈

EN

回答 1

Stack Overflow用户

发布于 2017-07-03 16:53:51

一切都很好-Y轴的原点位置并没有像我想的那样在控制单元中保存为"0“now...the。它是"Y0 = -500“。

所以:

代码语言:javascript
复制
_koords.y = (y-Value) - 500; 

很抱歉问你这个问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44825713

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档