硬件介绍PCIE464运动控制卡是正运动推出的一款EtherCAT总线+脉冲型、PCIE接口式的运动控制卡,可选6-64轴运动控制,支持多路高速数字输入输出,可轻松实现多轴同步控制和高速数据传输。PCIE464运动控制卡适合于多轴点位运动、插补运动、轨迹规划、手轮控制、编码器位置检测、IO控制、位置锁存等功能的应用。PCIE464运动控制卡适用于3C电子加工、检测设备、半导体设备、SMT加工、激光加工、光通讯设备、锂电及光伏设备、以及非标自动化设备等高速高精应用场合。PCIE4系列控制卡的应用程序可以使用VC,VB,VS,C++,C#等软件开发,程序运行时需要动态库zmotion.dll,调试时可以将RTSys软件同时连接控制器,从而方便调试、方便观察。接线参考1、IN数字量输入接口数字输入分布在J400(IN0-IN7)和X400(IN8-IN39)信号接口中。2、OUT数字量输出接口数字输出分布在 J400(OUT0-7)和 X400(OUT8-OUT39)信号接口中。3、编码器输入接口J400包含一个差分脉冲输出接口,一个差分编码器反馈,通过转接板接入。其中IN2-7有单端编码器轴的功能,只支持24V编码器输入。C#语言进行项目开发1、在VS2010菜单“文件”→“新建”→“项目”,启动创建项目向导。2、选择开发语言为“Visual C#”和.NET Framework 4以及Windows窗体应用程序。3、找到厂家提供的光盘资料里面的C#函数库,路径如下(32位库为例)。1)进入厂商提供的光盘资料找到“04PC函数”文件夹,并点击进入。2)选择“函数库2.1”文件夹。3)选择“Windows平台”文件夹。4)根据需要选择对应的函数库,这里选择32位库。5)解压C#压缩包,里面有C#对应的函数库。6)函数库具体路径如下。4.将厂商提供的C#的库文件以及相关文件复制到新建的项目中。1)将zmcaux.cs文件复制到新建的项目里面中。2)将zauxdll.dll和zmotion.dll文件放入bin\debug文件夹中。5.双击Form1.cs里面的Form1,出现代码编辑界面,在文件开头写入using cszmcaux,并声明控制器句柄g_handle。6、至此,项目新建完成,可进行C#项目开发。PC函数介绍1.PC函数手册可在光盘资料查看,具体路径如下。2.链接控制卡,获取链接句柄。3.读取单个I/O信号。4.批量读取I/O信号。5.设置单个输出口。6.批量设置输出口。7.读取单轴编码器反馈位置。8.批量读取编码器反馈位置,BASIC字符串为MPOS。9.自定义函数封装指令。单个或批量读取IO和编码器数据1.链接控制器获取句柄,上位机操作通过获取到的句柄来操作控制器。
//连接PCIe控制卡,控制卡卡号缺省从0开始int ret = zmcaux.ZAux_OpenPci(0, out g_handle);if (g_handle != (IntPtr)0){ MessageBox.Show("控制卡链接成功!" , "提示"); timer_GetData.Enabled = true; //开启定时器或在单独线程里实时读取I/O信号}else{ MessageBox.Show("控制卡链接失败,请检测PCI卡号!" , "警告");}
2.开启定时器实时读取I/O信号。
//定时器刷新I/O和轴反馈数据private void timer_GetData_Tick(object sender, EventArgs e){ uint[] instate = new uint[4]; uint[] opstate = new uint[4]; float[] mpos = new float[4]; for (int i = 0; i < 4; i++) { zmcaux.ZAux_Direct_GetIn(g_handle, i, ref instate[i]); //读取单个IN zmcaux.ZAux_Direct_GetOp(g_handle, i, ref opstate[i]); //读取单个OUT zmcaux.ZAux_Direct_GetMpos(g_handle, i, ref mpos[i]); //读取单轴反馈位置MPOS } IN0.Checked = (instate[0] == 1); IN1.Checked = (instate[1] == 1); IN2.Checked = (instate[2] == 1); IN3.Checked = (instate[3] == 1); OP0.Checked = (opstate[0] == 1); OP1.Checked = (opstate[1] == 1); OP2.Checked = (opstate[2] == 1); OP3.Checked = (opstate[3] == 1); MPOS0.Text = mpos[0].ToString(); MPOS1.Text = mpos[1].ToString(); MPOS2.Text = mpos[2].ToString(); MPOS3.Text = mpos[3].ToString(); int[] inputs = new int[4]; uint[] outputs = new uint[4]; float[] allmpos = new float[8]; zmcaux.ZAux_Direct_GetInMulti(g_handle, 16, 31, inputs); //批量读取输入IN16-31 zmcaux.ZAux_Direct_GetOutMulti(g_handle, 16, 31, outputs); //批量读取输出OUT16-31 zmcaux.ZAux_Direct_GetAllAxisPara(g_handle, "MPOS", 8, allmpos);//批量读取轴反馈位置MPOS 0-7 InputGroup1631.Text = inputs[0].ToString("X4"); }
3.单个或批量设置OP输出口。
//单个输出口状态切换函数private void OP0_CheckedChanged(object sender, EventArgs e){ if (g_handle == (IntPtr)0) { MessageBox.Show("未链接到控制卡!", "提示"); return; } if (OP0.Checked) { zmcaux.ZAux_Direct_SetOp(g_handle,0, 1); OP0.Text = "out0 打开"; } else { zmcaux.ZAux_Direct_SetOp(g_handle, 0, 0); OP0.Text = "out0 关闭"; }}//批量切换输出口状态函数private void OutputGroup03_CheckedChanged(object sender, EventArgs e){ if (g_handle == (IntPtr)0) { MessageBox.Show("未链接到控制卡!", "提示"); return; } uint[] iostate = new uint[4]; if (OutputGroup03.Checked) { iostate[0] = 0xF; //以二进制组合OUT,十六进制0xF即OUT0-3全部置1 zmcaux.ZAux_Direct_SetOutMulti(g_handle, 0, 3, iostate); OutputGroup03.Text = "全部置ON"; OP0.Checked = true; OP1.Checked = true; OP2.Checked = true; OP3.Checked = true; } else { iostate[0] = 0x0; zmcaux.ZAux_Direct_SetOutMulti(g_handle, 0, 3, iostate); OutputGroup03.Text = "全部置OFF"; OP0.Checked = false; OP1.Checked = false; OP2.Checked = false; OP3.Checked = false; }}
4.若想验证通过函数获取的IO状态和数据是否准确,可以使用正运动的调试软件RTSys连接到控制卡。通过工具→输入口/输出口观察当前控制卡的实时IO状态,通过轴参数窗口观察各轴的反馈位置MPOS,并与C#获取的数据进行对比。5.自定义函数封装,单条命令批量获取需要的部分I/O和部分轴数据。通过组合不同的Basic命令字符串,中间以英文逗号字符隔开,一次性下发读取所需的数据,如:(1)获取某个输入信号,对应Basic命令字符串为:IN(输入口序号);(2)获取某个输出信号,对应Basic命令字符串为:OP(输入口序号);(3)获取某轴反馈位置,对应Basic命令字符串为:MPOS(轴号);其他参数也可以使用此方式,具体Basic字符串可参考PC手册“轴参数指令表”。举例说明,需要单条命令获取输入0,输入3,输出1,输出4,轴2和轴5的反馈数据,则需要通过ZAux_Execute函数下发字符串:“?IN(0),IN(3),OP(1),OP(4),MPOS(2),MPOS(5)”;其中,英文 “?” 字符和“PRINT”字符为同一含义,表示读取后续参数的值;参数字符不用区分大小写。
private void getData_Click(object sender, EventArgs e){ //通过Execute函数发送Basic字符串组合实现一次性读取多个参数 if (g_handle == (IntPtr)0) { MessageBox.Show("未链接到控制卡!", "提示"); return; } string pszCommand; //发送的Basic命令字符串 StringBuilder psResponse = new StringBuilder(1024); //接收返回的字符串 uint uiResponseLength = 1024; //接收返回的字符长度,不能小于接收的字符串长度 pszCommand = "?IN(4),IN(5),OP(4),OP(5),MPOS(4),MPOS(5)";//读取数据Basic字符串,共6个数据 zmcaux.ZAux_Execute(g_handle, pszCommand, psResponse, uiResponseLength); string psResponseResult = ""; psResponseResult += psResponse; string[] parts = psResponseResult.Split('\t'); //这里以空格对字符串分割 IN4.Checked = Convert.ToInt32(parts[0]) == 1; IN5.Checked = Convert.ToInt32(parts[1]) == 1; OP4.Checked = Convert.ToInt32(parts[2]) == 1; OP5.Checked = Convert.ToInt32(parts[3]) == 1; MPOS4.Text = parts[4]; MPOS5.Text = parts[5];}
调试软件RTSys命令与输出窗口的在线命令,与上述封装函数为相同的功能。本次,正运动技术PCIe EtherCAT实时运动控制卡PCIE464的IO与编码器读写应用,就分享到这里。更多精彩内容请关注“正运动小助手”公众号,需要相关开发环境与例程代码,请咨询正运动技术销售工程师。本文由正运动技术原创,欢迎大家转载,共同学习,一起提高中国智能制造水平。文章版权归正运动技术所有,如有转载请注明文章来源。
0 评论