点击上方“正运动小助手”,随时关注新动态!
本文导读
今天,正运动小助手给大家分享一下C#语言如何进行CAD导图、RTBasic程序的多任务开发。在正式学习之前,我们先了解一下正运动技术的运动控制卡PCIE464。
硬件介绍
PCIE464运动控制卡是正运动推出的一款EtherCAT总线+脉冲型、PCIE接口式的运动控制卡,可选6-64轴运动控制,支持多路高速数字输入输出,可轻松实现多轴同步控制和高速数据传输。
接线参考
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、指令介绍
指令1 | Int32 ZMotionCadArray_ImportVectGraph(string lpszFileFullPathname,double duUnit,int Option, double refDistance) | ||||||||
指令说明 | 导入图形文件(支持dxf、plt、ai、dst) | ||||||||
参数说明 |
| ||||||||
返回值 | 成功返回值为0,非0详见错误码说明 |
指令2 | Int32 ZMotionCadArray_GetVectNum(ref int nStructNum) |
指令说明 | 提取当前图形数组的长度 |
参数说明 | nStructNum,数组的数量 |
返回值 | 成功返回值为0,非0详见错误码说明 |
指令3 | Int32 ZMotionCadArray_GetVectArray(ref Struct_ZCad_Array struct_Array, int nStructNum) |
指令说明 | 提取当前图形的数据到数组里面 |
参数说明 | struct_Array 提取的数组 nStructNum 数组的数量 |
返回值 | 成功返回值为0,非0详见错误码说明 |
指令4 | Int32 ZMotionCadArray_MergeSeg(double dSize, bool bChoose) | ||||
指令说明 | 合并相连线,将坐标点连成线 | ||||
参数说明 |
| ||||
返回值 | 成功返回值为0,非0详见错误码说明 |
将.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、指令说明
指令 | Int32 ZAux_DirectCommand(ZMC_HANDLE handle, const char *pszCommand,char *psResponse, uint32 uiResponseLength) |
指令说明 | 发送字符串命令到控制器,直接方式(不进缓冲区,有少数命令,暂时 不支持)。 |
参数说明 | handle 连接句柄。 pszCommand 发送的命令字符串。 uiResponseLength 返回的字符长度。 uiResponseLength 返回的字符串。 |
返回值 | 成功返回值为0,非0详见错误码说明。 |
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、填写自动运行任务号。
basic指令1 | AOUT(channel) = value |
指令说明 | 模拟通道输出。 12位刻度值范围0~4095对应0~10V电压。 16位刻度值范围0~65536对应0~10V电压。 |
参数说明 | channel:模拟输出通道0-63。 Value: 设置模拟量输出的值。 |
PC指令 | int32 __stdcall ZAux_Direct_SetUserVar(ZMC_HANDLE handle,char*varname , float pfValue) |
指令说明 | 设置 Basic 自定义全局变量。 |
参数说明 | Handle 连接句柄 Varname basic中变量名称字符串 pfValue 反馈值 |
返回值 | 成功返回值为0,非0详见错误码说明 |
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。
回顾往期内容
开奖啦!参与《运动控制系统应用与实践》赠书活动的粉丝们看这里
送书福利!全自主IDE的《运动控制系统应用与实践》
EtherCAT运动控制器在UVW对位平台中的应用
EtherCAT运动控制器Delta机械手应用
EtherCAT运动控制器的MATLAB开发
运动控制器/运动控制卡配套ZCAN总线ZIO模块的使用
运动控制卡/运动控制器的ZCAN总线ZMIO310扩展模块使用
EtherCAT运动控制器在ROS上的应用(下)
EtherCAT运动控制器在ROS上的应用(上)
皮带同步跟随:EtherCAT超高速实时运动控制卡XPCIE1032H上位机C#开发(十四)
自定义电子凸轮曲线的运动:EtherCAT超高速实时运动控制卡XPCIE1032H上位机C#开发(十三)
连续轨迹加工和速度前瞻:EtherCAT超高速实时运动控制卡XPCIE1032H上位机C#开发(十二)
PT/PVT运动模式介绍:EtherCAT超高速实时运动控制卡XPCIE1032H上位机C#开发(十一)
项目工程下载与XML配置文件下载:EtherCAT超高速实时运动控制卡XPCIE1032H上位机C#开发(十)
EtherCAT驱动器回零与控制器回零:EtherCAT超高速实时运动控制卡XPCIE1032H上位机C#开发(九)
二维/三维的多轴PSO视觉飞拍与精准输出:EtherCAT超高速实时运动控制卡XPCIE1032H上位机C#开发(八)
单轴PSO视觉飞拍与精准输出:EtherCAT超高速实时运动控制卡XPCIE1032H上位机C#开发(七)
硬件位置比较输出和编码器锁存:EtherCAT超高速实时运动控制卡XPCIE1032H上位机C#开发(六)
EtherCAT超高速实时运动控制卡XPCIE1032H上位机C#开发(五):通过RTSys进行调试与诊断
EtherCAT超高速实时运动控制卡XPCIE1032H上位机C#开发(四):板载IO与总线扩展IO的编码器与脉冲配置的应用
EtherCAT超高速实时运动控制卡XPCIE1032H上位机C#开发(三):EtherCAT总线CSP,CSV,CST模式切换
EtherCAT超高速实时运动控制卡XPCIE1032H上位机C#开发(二):EtherCAT总线初始化
EtherCAT超高速实时运动控制卡XPCIE1032H上位机C#开发(一):驱动安装与建立连接
全国产EtherCAT运动控制边缘控制器(六):RtBasic文件下载与连续轨迹加工的Python+Qt开发
全国产EtherCAT运动控制边缘控制器(五):IO配置与回零运动的Python+Qt开发
全国产EtherCAT运动控制边缘控制器(四):轴参数配置与单轴运动PC上位机C++控制
全国产EtherCAT运动控制边缘控制器(三):外设读写与RTSys开发诊断
全国产EtherCAT运动控制边缘控制器(二):统一的上位机API接口
全国产EtherCAT运动控制边缘控制器(一):ZMC432H硬件接口
高柔SS加减速曲线在锂电池焊接中的应用
EtherCAT和Ethernet的不同点有哪些, 通信周期又是什么意思?
工业以太网时代,该如何选择总线运动控制器?
正运动技术运动控制器如何快速实现单轴/多轴同步跟随功能?
EtherCAT运动控制器在数控加工手轮随动中的应用
EtherCAT运动控制器在数控加工手轮随动中的应用之C++
EtherCAT运动控制器在LabVIEW中的运动控制与实时数据采集
运动控制器PSO视觉飞拍与精准输出的C++开发(三):二维/三维/多轴PSO输出
运动控制器PSO视觉飞拍与精准输出的C++开发(一):单轴PSO
运动控制器八通道PSO的视觉飞拍与精准输出
Windows实时运动控制软核(七):LOCAL高速接口测试之Labview
Windows实时运动控制软核(六):LOCAL高速接口测试之Matlab
Windows实时运动控制软核(五):LOCAL高速接口测试之VC6.0
Windows实时运动控制软核(四):LOCAL高速接口测试之VB.NET
Windows实时运动控制软核(三):LOCAL高速接口测试之C++
Windows实时运动控制软核(二):LOCAL高速接口测试之Qt
Windows实时运动控制软核(一):LOCAL高速接口测试之C#
开放式激光振镜运动控制器:C++ 快速调用图形库应用
开放式激光振镜运动控制器:C++振镜矫正方法与实现
开放式激光振镜运动控制器:C++快速开发
开放式激光振镜运动控制器(五):ZMC408SCAN 光纤激光器的能量控制
开放式激光振镜运动控制器(四):ZMC408SCAN振镜控制光纤激光器加工
开放式激光振镜运动控制器(三):ZMC408SCAN轴控光纤激光器加工
开放式激光振镜运动控制器(二):ZMC408SCAN激光接口与控制
开放式激光振镜运动控制器(一):ZMC408SCAN接口与功能
运动控制器PSO位置同步输出(三):高精度等间距二维三维PSO输出
运动控制器PSO位置同步输出(一):硬件平台与PSO指令简介
经济型EtherCAT运动控制器(四):ModbusRTU或ModbusTcp与触摸屏通讯
经济型EtherCAT运动控制器(三):PLC实现多轴直线插补与电子凸轮
经济型EtherCAT运动控制器(二):ZBasic实现多轴直线插补运动
运动控制+机器视觉Demo软件框架(三):视觉纠偏+连续插补的配方编辑
运动控制+机器视觉Demo软件框架(二):移动标定和形状匹配
开放式激光振镜+运动控制器(五):ZMC408SCAN控制器硬件介绍
开放式激光振镜+运动控制器(四):PSO位置同步输出在激光振镜加工中的应用
快速入门 | 篇十九:正运动技术运动控制器多轴同步与电子凸轮指令简介
快速入门 | 篇十六:正运动控制器EtherCAT总线快速入门
快速入门 | 篇十四:运动控制器基础轴参数与基础运动控制指令
快速入门 | 篇十三:正运动技术运动控制器ZDevelop 编程软件的使用
快速入门 | 篇八:如何进行运动控制器EtherCAT总线的基础使用?
快速入门 | 篇七:如何进行运动控制器ZCAN总线扩展模块的使用?
快速入门 | 篇五:如何进行运动控制器输入/输出IO的应用?
快速入门 | 篇二:如何进行运动控制器ZBasic程序开发?
EtherCAT与RTEX驱动器轴回零的配置与实现
EtherCAT运动控制卡开发教程之Qt(中):小线段连续轨迹加工、暂停与继续
EtherCAT运动控制卡开发教程之Qt(上):开发环境配置与简单运动控制应用
EtherCAT运动控制卡的PWM与模拟量输出和运动速度同步
EtherCAT运动控制卡的硬件接线与C#的硬件外设读写与回零运动
简单易用的运动控制卡(十四):PWM、模拟量输出与运动控制的同步
简单易用的运动控制卡(六):Basic文件下载和连续轨迹加工
EtherCAT运动控制卡和LabVIEW构建智能装备(五)
EtherCAT运动控制卡和LabVIEW构建智能装备(四)
EtherCAT运动控制卡和LabVIEW构建智能装备(三)
EtherCAT运动控制卡和LabVIEW构建智能装备(二)
EtherCAT运动控制卡和LabVIEW构建智能装备(一)
关于正运动技术
深圳市正运动技术有限公司成立于2013年,专注于纯国产运动控制技术研究和通用运动控制软硬件平台和产品的研发,是国家级高新技术和专精特新“小巨人”企业。
正运动技术汇集了来自华为、中兴等公司的优秀人才。力求创新,目前公司拥有专利、著作权等知识产权五十余项。在坚持自主创新的同时,积极联合各大高校和科研院所协同运动控制基础技术的研究,是国内工控领域发展最快的企业之一,也是国内少有、完整掌握运动控制核心技术和实时工控软件平台技术的企业。
正运动技术除本部研发中心外,设有中山、武汉、上海三个研发分部。为更好地服务客户,本部之外设有苏州、东莞两个区域性服务中心,设有佛山、厦门、青岛、西安、武汉、成都、天津、郑州等销售和技术服务机构。
经过众多合作伙伴多年的开发应用,正运动技术的产品广泛地应用于3C电子、半导体、新能源、机器人、包装印刷、纺织服装、激光加工、医疗制药、数控机床、传统加工等领域。