加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 06:53:45 所属栏目:百科 来源:网络整理
导读:第一:我很喜欢编程,所以如果这个问题太愚蠢,我很抱歉.但我已经搜索了5天的解决方案,现在我迷失了,没有希望:/ 我需要通过C#程序控制CNC机床. CNC机器的API是用C编写的* .dll,所以我需要编组所有不同的数据类型.几乎一切都运作良好,但有一个奇怪的问题. 只有
第一:我很喜欢编程,所以如果这个问题太愚蠢,我很抱歉.但我已经搜索了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

解决方法

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

所以:

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

对不起,这个问题.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读