|
今天,正运动小助手给大家分享一下强实时运动控制内核MotionRT750下PC上位机的EtherCAT总线初始化。
PC上位机EtherCAT总线的初始化方式主要分为两种:纯上位机初始化和下载BASIC脚本初始化。上节课程给大家讲解了如何通过纯上位机的方法来实现PC上位机EtherCAT总线初始化【详情点击→PC强实时运动控制(一):C#的EtherCAT总线初始化(上)】。
本文将详细讲解如何通过使用ZMotionTools工具配置得到的ZAR文件来进行EtherCAT总线初始化。
这里所说的EtherCAT总线初始化,是指正运动的控制器作为主站和EtherCAT的驱动器等从站建立正常通讯,并把各个驱动器映射到控制器的对应轴上的过程。(默认第一个驱动器是0轴,第二个驱动器是1轴,以此类推)
1.脉冲步进驱动器
脉冲步进驱动器一般上电即可使能,把控制器对应轴的轴类型设置成1或者7,然后就可以发送运动指令去控制了。
2.脉冲伺服驱动器
脉冲伺服驱动器的使能操作,通常是将控制器的输出口连接至驱动器对应的使能口,再由控制器通过控制对应输出口的开关状态来实现脉冲伺服驱动器的使能;使能后把控制器对应轴的轴类型设置成4,然后就可以发送运动指令去控制了。
3.总线驱动器
总线驱动器相对复杂一点,需先由控制器执行总线初始化程序后控制器和驱动器通讯上,总线驱动器的使能可以通过ZAux_Direct_SetAxisEnable接口去控制,总线驱动器跑位置模式时,轴类型设置成65,就可以发送运动指令去控制了。
一.全国产强实时运动控制内核MotionRT750
MotionRT750是正运动技术首家自主自研的x86架构Windows系统或Linux系统下独占确定CPU的强实时运动控制内核。

该方案采用独占确定CPU内核技术实现超强性能的强实时运动控制。它将核心的运动控制、机器人算法、数控(CNC)及机器视觉等强实时的任务,集中运行在1-2个专用CPU核上。与此同时,其余CPU核则专注于处理Windows/Linux相关的非实时任务。
此外集成MotionRT750 Runtime实时层与操作系统非实时层,并利用高速共享内存进行数据交互,显著提升了运动控制与上层应用间的通信效率及函数执行速度,最终实现更稳定、更高效的智能装备控制,确保了运动控制任务的绝对实时性与系统稳定性,特别适用于半导体、电子装备等高速高精的应用场合。

MotionRT750应用优势:
1.跨平台兼容性:支持Windows/Linux系统,适配不同等级CPU。
2.开发灵活性:提供多语言编程接口,便于二次开发与功能定制。
3.实时性提升:通过CPU内核独占机制与高效LOCAL接口,实现2-3us指令交互周期,较传统PCI/PCIe方案提速近20倍。
4.扩展能力强化:多卡多EtherCAT通道架构支持254轴运动控制及500us EtherCAT周期。
5.系统稳定性:32轴125us EtherCAT冗余架构消除单点故障风险,保障连续生产。
6.安全可靠性:不惧Windows系统崩溃影响,蓝屏时仍可维持急停与安全停机功能有效,确保产线安全运行。
7.功能扩展性:实时内核支持C语言程序开发,方便功能拓展与实时代码提升效率。
MotionRT750视频介绍可点击→正运动强实时运动控制内核MotionRT750。
更多关于MotionRT750的详情介绍与使用点击→强实时运动控制内核MotionRT750(一):驱动安装、内核配置与使用。
二.C#语言进行项目开发
1.在VS2019菜单“文件”→“新建”→“项目”,启动创建项目向导。

2.选择开发语言为“C#”和Windows窗体应用程序,点击下一步。

3.配置好项目名称和位置,以及相应框架,点击创建。

4.找到厂家提供的光盘资料里面的C#函数库,路径如下(64位库为例)。
进入厂商提供的光盘资料,找到zauxdll.dll,zmotion.dll和Zmcaux.cs这三个库文件。库文件路径:【00光盘资料】→【04PC函数】→【01PC函数库V2.1】→【Windows平台】→【C#】→【64位】→【库文件】。

5.将厂商提供的C#的库文件以及相关文件复制到新建的项目中。
(1)将zmcaux.cs文件复制到新建的项目里面中。

(2)将zauxdll.dll和zmotion.dll文件放入bin\debug文件夹中。

(3)将Zmcaux.cs文件添加进项目中。右键项目名称,选择添加,再选择现有项,选择Zmcaux.cs文件。

6.双击Form1.cs里面的Form1,出现代码编辑界面,在文件开头写入using cszmcaux,并声明控制器句柄g_handle。

7.至此,项目新建完成,可进行C#项目开发。
三.PC函数介绍
PC函数手册可在光盘资料获取,具体路径如下:“00光盘资料\03编程手册\03ZMotion PC函数库编程手册”。






四.使用ZMotionTools工具配置并生成ZAR文件
在ZMotionToolsQT文件中找到使用手册,参考《ZMotionTools使用手册.pdf》进行调试工作,当总线初始化正常且无差错,手动调试和回零动作均正常后,便可导出ZAR文件给上位机软件工程师使用。

五.总线初始化的ZAR文件导出步骤
点击【4_配置导入与保存】进入保存界面,再点击【配置更新到控制器】后,先浏览导出文件路径(存储文件路径不要有中文),再点击【导出】,等待提示文件导出成功。

在导出的文件夹内,还存在一个名为【ZmcEcatConfig】的子文件夹,其中的【ZmcEcatConfig.zar】文件即为我们工具导出的配置文件,上位机软件工程师直接拷贝该ZAR文件使用即可。

六.C#项目如何使用配置工具导出ZAR文件进行EtherCAT总线初始化
1.将ZmotionTools工具导出的ZAR文件放置在C#项目的ZAR文件目录下,实际开发项目时可根据需求自定义路径。

2.上位机如何下载ZAR脚本进行总线初始化,并等待总线初始化完成。

打包好的ZAR文件里面中有定义一个全局变量【EcatInitStatus】,这个变量对总线初始化的完成情况有如下如下定义:
? -1 — 未进行
? 0 — 初始化失败
? 1 — 初始化完成,初始化OK
? 2 — 从站个数对不上(配置软件设置【总线节点数】大于0后才生效)
? 3 — 总线轴个数对不上(配置软件设置【总线驱动器轴数】大于0后才生效)

所以上位机可以通过【ZAux_Direct_GetVariableInt】去获取ZAR文件里面定义的全局变量的数值来判断总线初始化是否成功,当然总线初始化是需要时间的。
我们一般把ZAR程序下载后,上位机通过While循环(可以设置一个超时时间比如30秒)在超时时间内每隔50ms就去获取一次变量【EcatInitStatus】的值。
如果返回值不等于-1就说明总线初始化脚本执行结束了,然后根据返回值去判断是否成功。如果返回值等于-1就需要一直获取变量【EcatInitStatus】的值直到超过自己设置的超时时间就报警。
上位机具体代码如下:
//选择RAM模式下载ZAR文件到控制器进行总线初始化
int ret = zmcaux.ZAux_ZarDown(g_handle, filePaths[0], 0);
//如果ZAR文件下载成功
if (0 == ret)
{
//等待2秒后再去获取总线初始化情况
Thread.Sleep(2000);
//设置while循环的超时时间是30s
int Time0ut = 30000;
while (Time0ut > 0)
{
//获取总线初始化状态的标志位
ret = zmcaux.ZAux_Direct_GetVariableInt(g_handle, "EcatInitStatus", ref EcatInitStatus);
if ((ret == 0) && (-1 != EcatInitStatus))
{
if (0 == EcatInitStatus)
{
MessageBox.Show("总线初始化失败");
}
else if (1 == EcatInitStatus)
{
MessageBox.Show("总线初始化成功");
}
else if (2 == EcatInitStatus)
{
MessageBox.Show("总线扫描,发现节点个数和设置的不对应");
}
else if (3 == EcatInitStatus)
{
MessageBox.Show("总线扫描,发现总线轴个数和设置的不对应");
}
break;
}
//超时时间减100ms
Thread.Sleep(100);
Time0ut = Time0ut - 100;
}
}
3.上位机如何实现总线通讯的软复位。

在ZAR脚本中存在一个死循环,当检测到总线初始化的状态标志位不为1时,会重新执行总线初始化程序。因此,若驱动器中途断电导致总线通讯中断,需重新进行总线初始化时,上位机通过【ZAux_Direct_SetUserVar】指令将总线初始化脚本变量【EcatInitStatus】设置为-1即可。
上位机具体代码如下:
//重新进行总线初始化
int Err = zmcaux.ZAux_Direct_SetUserVar(g_handle, "EcatInitStatus", -1);
//如果重新总线初始化的指令下发成功
if (0 == Err)
{
Thread.Sleep(2000);
//等待2秒后再去获取总线初始化情况
int TimeOut = 30000;
//设置while循环的超时时间是30s
int EcatInitStatus = -1;
//总线初始化状态
while (TimeOut > 0)
{
//获取总线初始化状态的标志位
Err = zmcaux.ZAux_Direct_GetVariableInt(g_handle, "EcatInitStatus", ref EcatInitStatus);
if ((Err == 0) && (-1 != EcatInitStatus))
{
if (0 == EcatInitStatus)
{
MessageBox.Show("总线初始化失败");
}
else if (1 == EcatInitStatus)
{
MessageBox.Show("总线初始化成功");
}
else if (2 == EcatInitStatus)
{
MessageBox.Show("总线扫描,发现节点个数和设置的不对应");
}
else if (3 == EcatInitStatus)
{
MessageBox.Show("总线扫描,发现总线轴个数和设置的不对应");
}
break;
}
//超时时间减100ms
Thread.Sleep(100);
TimeOut = TimeOut - 100;
}
}
4.上位机驱动器报警如何清除报警。
如果总线轴的轴状态AxisStatus的bit3为1并且bit2为0的话,就是总线驱动器有报警并且总线通讯是没有断开的,比如AxisStatus是8h这个情况。这个时候我们上位机可以发送驱动器报警清除进行报警清除。
上位机具体代码如下:
//报警的轴号
uint AlmAxisId = 0;
//清除轴AlmAxisId驱动器的当前报警
int Err = zmcaux.ZAux_BusCmd_DriveClear(g_handle, AlmAxisId, 0);
//等待比较清除完成
Thread.Sleep(500);
Err = zmcaux.ZAux_Direct_Single_Datum(g_handle, (int)AlmAxisId, 0);//清除控制器报警
Err = zmcaux.ZAux_Direct_SetAxisEnable(g_handle, (int)AlmAxisId, 1);//对报警的轴重新上使能
5.例程使用。
选择LOCAL连接方式并点击【连接】。待弹出连接成功提示框后,点击【总线扫描】;若初始化成功,相关节点信息将显示在表格中,命令与输出窗口也会同步呈现相应提示。

教学视频请点击→PC强实时运动控制(二):C#的EtherCAT总线初始化(下)
完整代码获取地址
▼

本次,正运动技术PC强实时运动控制(二):C#的EtherCAT总线初始化(下),就分享到这里。
|