Zmotion快速入门之EtherCAT通信
本案例采用Zmotion运动控制卡与伺服驱动器进行EtherCAT通信,从而实现对伺服电机的相关控制。
硬件连接
因为采用总线的原因,所以基本上不用接线,硬件原理图如下所示:
将PC通过Ethernet连接至运动控制卡,然后运动控制卡的EtherCAT接至伺服驱动器,伺服驱动器与伺服电机之间通过配套电缆进行连接。
快速上手
第一次使用时,最好的方式就是看编程手册,并结合官方提供的案例来学习使用。
Zmotion厂家提供的配套资料,我会传到公众号里,需要的小伙伴,可以后台回复 Zmotion 获取
在保证硬件没有问题的前提下(这里主要是指伺服驱动器,至少能够手动转起来),打开 ZMC光盘资料\8.PC编程相关\函数库2.1\windows平台\64位库\C#\例程\例程8-总线控制运动 中的源程序,运行起来如下所示:
这里有两个地方要注意,不然是运行不起来的。
案例中提供的ECAT初始化.bas文件,最大轴数是32,需要根据实际情况修改,否则会报错,我这里改成16。
如果伺服没有接限位开关,轴状态应该是30H,表示正负限位报警,需要将正负限位禁用掉,具体操作是通过ZDevelop将FWD_IN和REV_IN设置为-1,当然后续可以通过代码实现。
这两点注意,伺服电机就应该可以动起来了。
软件开发
后续的软件开发主要就是封装应用,Zmotion的使用会涉及到两个dll库(zauxdll.dll和zmotion.dll)和一个Zmcaux.cs类文件,提前将这两个dll库复制到根目录下,然后手动将Zmcaux.cs类添加到你的项目中。
创建一个新的Zmotion.cs类,对Zmcaux.cs中的一些方法进行二次封装,便于后续项目的应用。
二次封装的方式每个人都会根据自己的编码习惯,进行不同程度的封装,下面我仅列举部分我的封装方法,仅供参考:
建立连接:EtherCAT连接之前需要执行一个bas文件,根据案例中的代码封装如下:
/// <summary> /// 初始化卡 /// </summary> /// <param name="ipAddress">IP地址</param> /// <param name="file">BAS文件</param> /// <param name="tempstatus">总线初始化完成状态</param> /// <param name="m_BusNodeNum">节点数</param> /// <returns>操作结果</returns> public OperationResult InitCard(string ipAddress, string file, ref float tempstatus, ref int m_BusNodeNum) { int error = 0; error = zmcaux.ZAux_OpenEth(ipAddress, out zhandle); if (error == 0) { error = zmcaux.ZAux_BasDown(zhandle, file, 1); if (error == 0) { //执行初始化 StringBuilder buffer = new StringBuilder(10240); //任务1重新运行BAS中的初始化函数 error = zmcaux.ZAux_Execute(zhandle, "RUNTASK 1,Ecat_Init", buffer, 0); if (error != 0) { return new OperationResult() { IsSuccess = true, ErrorMsg = "初始化失败" }; } IEC_Timer_TON ton = new IEC_Timer_TON(5000); ton.Input = true; while (true) { int ret = 0; float Bus_type = 0.0f; float m_BusAxisNum = 0.0f; //读取BAS文件中的变量判断总线类型 ret += zmcaux.ZAux_Direct_GetUserVar(zhandle, "BUS_TYPE", ref Bus_type); // 读取BAS文件中的变量判断总线初始化完成状态 ret += zmcaux.ZAux_Direct_GetUserVar(zhandle, "Bus_InitStatus", ref tempstatus); ret += zmcaux.ZAux_BusCmd_GetNodeNum(zhandle, 0, ref m_BusNodeNum); ret += zmcaux.ZAux_Direct_GetUserVar(zhandle, "Bus_TotalAxisnum", ref m_BusAxisNum); bool completed = ret == 0; completed &= tempstatus == 1; completed &= m_BusNodeNum > 0; bool output = ton.Output; if (completed) { break; } else if (!output) { continue; } else { if (tempstatus == -1) { return new OperationResult() { IsSuccess = false, ErrorMsg = "正在初始化" }; } else { return new OperationResult() { IsSuccess = false, ErrorMsg = "初始化失败" }; } } } initedOK = true; return OperationResult.CreateSuccessResult(); } return new OperationResult() { IsSuccess = true, ErrorMsg = "文件下载失败" }; } return new OperationResult() { IsSuccess = true, ErrorMsg = "以太网连接失败" }; }
点位运动:点位运动主要就是根据轴号、速度、加速度、脉冲当量进行正转或反转,代码如下:
public OperationResult Move(int axisNo, float scale, float vel, float acc, bool dir) { int error = 0; error += zmcaux.ZAux_Direct_SetUnits(zhandle, axisNo, scale); error += zmcaux.ZAux_Direct_SetSpeed(zhandle, axisNo, vel); error += zmcaux.ZAux_Direct_SetAccel(zhandle, axisNo, acc); error += zmcaux.ZAux_Direct_Single_Vmove(zhandle, axisNo, dir ? 1 : -1);
if (error > 0) { return OperationResult.CreateFailResult(); } else { return OperationResult.CreateSuccessResult(); } }
停止运动:停止运动比较简单,调用ZAux_Direct_Single_Cancel指令即可。
public OperationResult Stop(int axisNo) { int error = 0; error = zmcaux.ZAux_Direct_Single_Cancel(zhandle, axisNo, 2);
if (error > 0) { return OperationResult.CreateFailResult(); } else { return OperationResult.CreateSuccessResult(); } }
开发界面
这里做了一个简单的控制界面,实现了基本的板卡连接、点动、连续运动、伺服使能等基本控制功能。