我需要通过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
所以:
_koords.y = (y-Value) - 500;
对不起,这个问题.
总结以上是内存溢出为你收集整理的封锁C-Struct与双打到C# – 正值错误全部内容,希望文章能够帮你解决封锁C-Struct与双打到C# – 正值错误所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)