The value of Zmotion is to bring customers more success!
硬件介绍
PCIE464运动控制卡是正运动推出的一款EtherCAT总线+脉冲型、PCIE接口式的运动控制卡,可选6-64轴运动控制,支持多路高速数字输入输出,可轻松实现多轴同步控制和高速数据传输。
PCIE464产品介绍视频可点击“【EtherCAT同步周期快至100us】超高实时性PCIe EtherCAT控制卡PCIE464”查看。
接线参考
C#语言进行项目开发
1、在VS2010菜单“文件”→“新建”→“项目”,启动创建项目向导。
6、双击Form1.cs里面的Form1,出现代码编辑界面,在文件开头写入using cszmcaux,using ZmotionCadDll,并声明控制器句柄g_cardhandle和使用CAD中使用到的cad库函数的句柄g_cadhandle。
7、至此,项目新建完成,可进行C#项目开发。
C#语言进行CAD导图
在实际的运用场景中,如果一张图纸靠人为去计算图形运动轨迹的坐标,结果既费时又费力。所以,在此情景下,如果我们让计算机去计算图形的运动轨迹,则会事半功倍,接下来我们介绍如何使用C#进行CAD导图。
1、操作步骤
2、指令介绍
将.dxf文件导入进去后,使用ZMotionCadArray_ImportVectGraph指令将CAD图纸导入,并对小线段进行拆分。
用ZMotionCadArray_GetVectNum获取数据长度,获取到数据长度后,创建一个Struct_ZCad_Array类型的数组。
这时,其CAD图纸的数据就保存在这结构体数组中,获取图形数据用ZMotionCadArray_GetVectArray指令。
创建一个StringBuilder类型的数组,用循环去访问Struct_ZCad_Array类型数组的运动类型,并把其运动坐标尾插到该数组里面。
最后,用文件IO的知识创建一个bas文件,并将StringBuilder类型数组的运动数据尾插到该bas文件中。
获取图纸点位信息的相关代码:
//打开配置文件 if (openFileDialog1.ShowDialog() == DialogResult.OK) { strFilePath = openFileDialog1.FileName; label11.Text = Path.GetFileName(strFilePath); textBox3.Text= textBox3.Text+"\r\n"+"导入文件:"+ Path.GetFileName(strFilePath); //导入CAD图形文件 m_refDistance圆弧转小线段拆分精度 int iret = ZmotionCad.ZMotionCadArray_ImportVectGraph(strFilePath, 1024, 1, m_refDistance); //导入数据, 获取数组长度 iret = ZmotionCad.ZMotionCadArray_GetVectNum(ref ZCad_ArrayLen); //创建一个结构体变量 ZCad_ArrayInfo = new ZmotionCad.Struct_ZCad_Array[ZCad_ArrayLen]; //获取图形数据 将cad文件的数据放在ZCad_ArrayInfo数组里 iret = ZmotionCad.ZMotionCadArray_GetVectArray(ref ZCad_ArrayInfo[0], ZCad_ArrayLen); //是否只处理封闭轨迹 iret = ZmotionCad.ZMotionCadArray_IfCloseVect(false); //合并相连线 iret = ZmotionCad.ZMotionCadArray_MergeSeg(0.5, If_Choose); //为了判断是否只处理封闭轨迹,又重新获取数组的长度和获取图形数据 Get_Array(); //在细分0.05的情况下获取图纸的左、底、长、宽的数值 iret = ZmotionCad.ZMotionCadArray_GetRange(ref Image_Left, ref Image_bottom, ref Image_Width, ref Image_Height, 0.05); if (Image_Width < 0.0001 && Image_Height < 0.0001) { Image_Left = (float)0.0; Image_bottom = (float)0.0; Image_Width = (float)100.0; Image_Height = (float)100.0; } double ObjectPixHeight, ObjectPixWidth; //实际在画板上显示图形的大小 if (Image_Width * PicHeight <= Image_Height * PicWidth) { ObjectPixHeight = PicHeight; ObjectPixWidth = ObjectPixHeight * Image_Width / Image_Height; } else { ObjectPixWidth = PicWidth; ObjectPixHeight = ObjectPixWidth * Image_Height / Image_Width; } //缩放比例 dScale = ObjectPixHeight / Image_Height; m_dUnitsPerMm = dScale * 1; //偏移 m_dTranX = (MyPicture.Width - ObjectPixWidth) / 2 - Image_Left * dScale; m_dTranY = (MyPicture.Height - ObjectPixHeight) / 2 - Image_bottom * dScale; //用画笔将点位信息显示在画板上 Show_Picture();
2、点击运行程序,通过线程生成运动指令下发到控制器,让控制器去跑CAD的点位坐标。
4、运行效果
上位机界面上的运动轨迹与RTSys抓到的运动轨迹作比较,与RTSys示波器上的轨迹基本上相符。
自定义封装指令函数
1、指令说明
2、示例说明
Description: // 自定义封装函数,一次性下发多条运动指令 Input: //handle 控制卡句柄/控制器句柄 //axis_num 总轴数 //axis_list 轴号列表 //axis_distance 运动的点位坐标,以“;”作为结束标记代表一条运动坐标 Return: //错误码 int __stdcall ZMotionCadArray_DelOne(int nDelVect); *************************************************************/ public Int32 UseDefined_Moveabs(IntPtr handle,int axis_num, string axis_list,string axis_distance) { //用于拼接运动命令的字符串 string cmdbuff = ""; string[] dir_move = axis_distance.ToString().Split(new char[] { ';' }); //接收在线命令的信息 StringBuilder psResponse =new StringBuilder(1024); //判断轴的个数是否合理 if (axis_num < 0) { return -1; } //生成命令 cmdbuff= "base(" + axis_list + ")"; for (int i = 0; i < dir_move.Length; i++) { //拼接运动指令 cmdbuff =cmdbuff+ "moveabs("+ dir_move[i]+")"; } //利用在线命令的方式去发送拼接好的运动指令 return zmcaux.ZAux_DirectCommand(handle,cmdbuff,psResponse,1024); }
//获取轴0缓冲区的大小 ret = zmcaux.ZAux_Direct_GetRemain_Buffer(G_CardHandle, 0, ref buf0); err_inform("ZAux_Direct_GetRemain_Buffer0", ret); if (buf0 > 10) { //通过自定义封装的函数去发运动指令,一次发10条 ret = UseDefined_Moveabs(G_CardHandle, 2, axis, direct_str[i]); err_inform("UseDefined_Moveabs", ret); label15.Invoke(new MethodInvoker(() => direct_num(i.ToString())));
3、代码验证
通过以上两个变量中的数据内容查看,验证了上诉的代码思路是符合逻辑的,实现了高效率的一条指令内多条数据加工的传输。
模拟量与速度的实时转换
首先,设置工程下的Basic文件自动运行任务号,可以在RTSys软件上的“控制器状态”中查看控制器最多支持多少个任务,然后在Basic文件上填写自动运行任务号 (不能超过最大支持的任务数),最后下载到控制器上。
1、查看控制器的最大任务数。
2、填写自动运行任务号。
1、Basic相关代码。
GLOBAL s_ratio '速度的比例 WHILE 1 '将速度与模拟量的关系成正比 AOUT(0)=4.095*VP_SPEED(0)*s_ratio WEND end
int ret = zmcaux.ZAux_Direct_SetUserVar(G_CardHandle, "s_ratio", Convert.ToSingle(textBox4.Text)); //设置模拟量与速度的转换比例 err_inform("比例的ZAux_Direct_SetUserVar",ret);
完整代码获取地址
本次,正运动技术PCIe EtherCAT实时运动控制卡的DXF图形的CAD导图与多条运动指令的快速加工 ,就分享到这里。
更多精彩内容请关注“ 正运动小助手 ”公众号,需要相关开发环境与例程代码,请咨询正运动技术销售工程师:400-089-8936。
本文由正运动技术原创,欢迎大家转载,共同学习,一起提高中国智能制造水平。文章版权归正运动技术所有,如有转载请注明文章来源。
正运动技术专注于运动控制技术研究和通用运动控制软硬件产品的研发,是国家级高新技术企业。正运动技术汇集了来自华为、中兴等公司的优秀人才,在坚持自主创新的同时,积极联合各大高校协同运动控制基础技术的研究,是国内工控领域发展最快的企业之一,也是国内少有、完整掌握运动控制核心技术和实时工控软件平台技术的企业。主要业务有:运动控制卡_运动控制器_EtherCAT运动控制卡_EtherCAT控制器_运动控制系统_视觉控制器__运动控制PLC_运动控制_机器人控制器_视觉定位_XPCIe/XPCI系列运动控制卡等等。