http://www.gkong.com 2023-12-01 11:33
xpcie1032h功能简介
xpcie1032h是一款基于pci express的ethercat总线运动控制卡,可选6-64轴运动控制,支持多路高速数字输入输出,可轻松实现多轴同步控制和高速数据传输。
xpcie1032h运动控制卡集成了强大的运动控制功能,结合motionrt7运动控制实时软核,解决了高速高精应用中,pc windows开发的非实时痛点,指令交互速度比传统的pci/pcie快10倍。
xpcie1032h运动控制卡支持pwm,pso功能,板载16进16出通用io口,其中输出口全部为高速输出口,可配置为4路pwm输出口或者16路高速pso硬件比较输出口。输入口含有8路高速输入口,可配置为4路高速色标锁存或两路编码器输入。
xpcie1032h运动控制卡搭配motionrt7运动控制实时内核,使用本地local接口连接,通过高速的核内交互 , 可以做到更快速的指令交互,单条指令与多条指令一次性交互时间可以达到3-5us左右。
?xpcie1032h运动控制卡与motionrt7运动控制实时内核的配合具有以下优势:
1.支持多种上位机语言开发,所有系列产品均可调用同一套api函数库;
2.借助核内交互,可以快速调用运动指令,响应时间快至微秒级,比传统pci/pcie快10倍;
3.解决传统pci/pcie运动控制卡在windows环境下控制系统的非实时性问题;
4.支持一维/二维/三维pso(高速硬件位置比较输出),适用于视觉飞拍、精密点胶和激光能量控制等应用;
5.提供高速输入接口,便于实现位置锁存;
6.支持ethercat总线和脉冲输出混合联动、混合插补。
?使用xpcie1032h运动控制卡和motionrt7运动控制实时内核进行项目开发时,通常需要进行以下步骤:
1.安装驱动程序,识别xpcie1032h;
2.打开并执行文件“motionrt710.exe”,配置参数和运行运动控制实时内核;
3.使用zdevelop软件连接到控制器,进行参数监控。连接时请使用pci/local方式,并确保zdevelop软件版本在3.10以上;
4.完成控制程序开发,通过local链接方式连接到运动控制卡,实现实时运动控制。
?与传统pci/pcie卡和plc的测试数据结果对比:
我们可以从测试对比结果看出,xpcie1032h运动控制卡配合实时运动控制内核motionrt7,在local链接(核内交互)的方式下,指令交互的效率是非常稳定,当测试数量从1w增加到10w时,单条指令交互时间与多条指令交互时间波动不大,非常适用于高速高精的应用。
xpcie1032h控制卡安装
关闭计算机电源。
打开计算机机箱,选择一条空闲的xpcie卡槽,用螺丝刀卸下相应的挡板条。
将运动控制卡插入该槽,拧紧挡板条上的固定螺丝。
xpcie1032h驱动安装与建立连接参考往期文章 。
一、c#语言进行运动控制开发
到正运动技术k8体育官网的下载中心选择需要的平台库文件。
下载地址:http://www.zmotion.com.cn/download_list_21.html
解压下载的安装包找到 “ zmcaux.cs ” , “zauxdll.dll ” , “zmotion.dll ” 放入到项目文件中。
1、“zmcaux.cs”放在项目根目录文件中,与bin目录同级。
2、“zauxdll.dll”,“zmotion.dll”放在bin -> debug。
用vs打开新建的项目文件,在右边的k8体育的解决方案资源管理器中点击显示所有,选中项目,右键“添加”->“现有项”,选中zmcaux.cs文件添加进在项目中。
双击form1.cs里面的form1,出现代码编辑界面,在文件开头写入using cszmcaux,并声明控制器句柄g_handle。
二、相关pc函数介绍
相关pc函数介绍详情可参考“zmotion pc函数库编程手册 v2.1.1”。
三、xpcie1032h板载io的编码器与脉冲配置
1、xpcie1032h的io接口规格如下
2、io端子定义如下
端子定义表
注意事项:
⊙只能使用24v编码器,编码器0和编码器1的脉冲输入最高频率为500khz,可以接高速编码器,其它的为普通输入,脉冲最高频率10khz,只能接手轮之类的低速编码器。
⊙脉冲输出和编码器输入后的编号为默认的轴号,通过atype指令切换io口是否为通用io(目标轴的atype=0为通用io,atype=1为脉冲输出,atype=3为编码器输入,atype=4为脉冲输出 编码器输入)。
3、输入口做编码器配置
xpcie1032h板载2路24v的单端编码器输入。( 本例以采用in4-6连接编码器来说明)。
首先按接线图进行接线,接线完成后,因为其中in4为ea1、in5为eb1、in6为ez1,对应的编码器轴号为1。 所以通过上位机把轴1的轴类型设置为3 ( 正交编码器 ) 配置后, in 即可作为编码器输入信号使用。
(1)配置流程图如下。
(2)例程相关代码。
a.通过轴号读取轴类型。
b.通过轴号设置轴类型。
4、输出口做脉冲配置
xpcie032h板载4路单端脉冲输出。( 本例以采用out8和out9连接驱动器来说明)。
首先按接线图进行接线,接线完成后,因为out8为dir3,out9为pul3,对应的脉冲驱动器轴号为3。 所以得通过上位机把轴3的轴类型设置为1(脉冲方向方式的步进或伺服)配置。
注意:驱动器根据规格可接e24v或e5v。
(1)配置流程图如下。
(2)例程相关代码。
a.通过轴号读取轴类型。
b.通过轴号设置轴类型。
四、ethercat扩展的编码器与脉冲配置
1、 eio16084扩展模块
eio16084扩展模块是ethercat总线控制器使用的扩展模块,可扩展数字量io和脉冲轴这两类资源,当控制器本体上资源不够的时候,ethercat总线控制器可连接多个eio扩展模块进行资源扩展,可查看控制器的io最大扩展点数和最大扩展轴数,支持io的远程扩展。
每个eio扩展模块在扩展接线完成后,不需要进行进行二次开发,只需使用指令在ethercat主站控制器配置唯一的io地址和轴地址,配置完成即可访问。
io地址编号通过总线指令node_io来设置,控制器上程序只需通过io编号就可以访问到扩展模块上的资源。轴地址的配置使用“axis_address”指令映射绑定轴号,绑定完成通过base或axis指令指定轴号。
2、eio24088扩展模块
eio24088总线扩展模块是ethercat总线控制器使用的扩展模块,当数字 io、脉冲轴资源不够需要扩展增加的时候,控制器可通过ethercat总线连接多个 ethercat扩展模块进行扩展。控制器可通过映射编号直接访问eio24088的io资源和轴资源。
当控制器的io或轴资源不够的时候,需要增加扩展模块,控制器可以同时连接多个扩展模块,eio系列扩展模块通过ethercat总线连接,每个扩展模块有唯一的地址,从0开始。
eio24088轴扩展时,为总线转脉冲,将脉冲型驱动器接入到eio24088扩展模块上的脉冲轴接口上。
eio24088带两个ethercat总线接口,接线时注意ethercat in连接主控制器或上级模块,ethercat out连接驱动设备或下一级扩展板,in和out口不可混用。
注意: eio系列带轴的扩展模块的使用方法相同,仅是扩展资源数量的区别。下面以eio16084扩展模块为例,来对eio系列扩展模块进行使用说明。
3、ethercat扩展模块接线参考
eio16084数字量扩展模块为单电源供电,主电源就可以给io供电,主电源采用24v直流电源。
eio16084扩展模块在扩展接线完成后,不需要进行进行二次开发,只需手动在 ethercat主站控制器配置唯一的io地址,配置完成即可访问。io地址编号通过总线指令node_io来设置,控制器上程序只需通过io编号就可以访问到扩展模块上的资源。
接线时注意ethercat in连接上一级模块,ethercat out连接下一级模块,in 和out口不可混用。
eio扩展模块接线参考示例(以zmc432举例)。
上图涉及的编号概念如下: 总线相关指令参数会用到如下编号。
(1)槽位号(slot)
槽位号是指控制器上总线接口的编号,ethercat总线槽位号为0。
(2)设备号(node)
设备号是指一个槽位上连接的所有设备的编号,从0开始,按设备在总线上的连接顺序自动编号,可以通过“node_count(slot)”指令查看总线上连接的设备总数。
(3)驱动器编号
控制器会自动识别出槽位上的驱动器,编号从0开始,按驱动器在总线上的连接顺序自动编号。
驱动器编号与设备号不同,只给槽位上的驱动器设备编号,其他设备忽略,映射轴号时将会用到驱动器编号。
4、eio16084接口规格
接口说明如下表:
由上表可知脉冲轴接口可配置为差分脉冲输出和差分编码器输入。
5、脉冲轴接口
eio16084提供4个本地差分脉冲轴接口,每个接口为标准db26母座。
注意: 如果4个本地差分脉冲轴接口还不能满足使用需求,可以把eio16084更换为eio24088。eio24088提供8个本地差分脉冲轴接口,每个接口为标准db26母座。
接口定义如下。
6、轴接口配置为编码器
(1)接线参考
与长春凯尔科技,2500线增量式编码器接线参考示例:
接好线后,还要通过上位机的数据字典写入来配置总线轴的真实轴类型。真实轴类型设置是由数据字典6011h配置。( 参考下表的参数,按轴号依次设置,第一个驱动器设置数据字典6011h 0*800h,第二个驱动器设置6011h 1*800h,以此类推,每个驱动器加800h,其他参数同理)。
上位机的数据字典写入: zaux_buscmd_sdowrite(连接句柄,槽位号,节点编号,对象字典编号,对象字典子编号,数据类型,写入的数据值)。
(2)例程相关代码
通过设备号和槽位号进行sdo写入。
private void c_sdo_write_click(object sender, eventargs e) { if (g_handle == (intptr)0) { messagebox.show("未链接到控制器!", "提示"); return; } int ret = 0; uint m_sdo_node1 = convert.touint32(c_sdonode0.text); uint m_sdo_index1 = convert.touint32(c_sdoreg0.text); uint m_sdo_sub1 = convert.touint32(c_sdoisub0.text); uint m_sdo_type1 = convert.touint32(c_sdotype0.selectedindex.tostring()) 1; int m_sdo_data1 = convert.toint32(c_sdodata0.text); if (bus_type == 0) { ret = zmcaux.zaux_buscmd_sdowrite(g_handle, 0, m_sdo_node1, m_sdo_index1, m_sdo_sub1, m_sdo_type1, m_sdo_data1); if (ret != 0) { messagebox.show("写入失败"); return; } } else { messagebox.show("非ethercat模块"); return; } }
7、轴接口配置为脉冲轴
(1)接线参考
与松下a5/a6伺服驱动器接线参考示例:
接好线后,还要通过pc函数库的数据字典写入接口来配置总线轴的真实轴类型。真实轴类型设置是由数据字典6011h配置。( 参考下表的参数,按轴号依次设置,第一个驱动器设置数据字典6011h 0*800h,第二个驱动器设置6011h 1*800h,以此类推,每个驱动器加800h,其他参数同理)。
pc函数库的数据字典写入接口: zaux_buscmd_sdowrite(连接句柄,槽位号,节点编号,对象字典编号,对象字典子编号,数据类型,写入的数据值)。
(2)例程相关代码
通过设备号和槽位号进行sdo写入。
private void c_sdo_write_click(object sender, eventargs e) { if (g_handle == (intptr)0) { messagebox.show("未链接到控制器!", "提示"); return; } int ret = 0; uint m_sdo_node1 = convert.touint32(c_sdonode0.text); uint m_sdo_index1 = convert.touint32(c_sdoreg0.text); uint m_sdo_sub1 = convert.touint32(c_sdoisub0.text); uint m_sdo_type1 = convert.touint32(c_sdotype0.selectedindex.tostring()) 1; int m_sdo_data1 = convert.toint32(c_sdodata0.text); if (bus_type == 0) { ret = zmcaux.zaux_buscmd_sdowrite(g_handle, 0, m_sdo_node1, m_sdo_index1, m_sdo_sub1, m_sdo_type1, m_sdo_data1); if (ret != 0) { messagebox.show("写入失败"); return; } } else { messagebox.show("非ethercat模块"); return; } }
五、例程说明
1、 c#例程界面如下。
2、例程简易流程图。
3、要想通过上位机操控控制器,就必须先链接控制器。例如通过local链接方式的链接按钮的消息响应函数来链接控制器。
通过local链接方式的链接控制器。
private void button4_click(object sender, eventargs e) { if (g_handle == (intptr)0) { c_close_card_click(sender, e); } zmcaux.zaux_fastopen(5, combobox1.text, 1000, out g_handle); if (g_handle != (intptr)0) { this.text = "已链接"; timer1.enabled = true; } else { messagebox.show("链接失败,请选择正确的local!"); } }
链接成功后,例程左上角会显示已链接。如果链接失败,还弹出“链接失败,请选择正确的local!”的弹窗。
4、ethercat总线初始化。先将ethercat总线初始化程序下载到控制器中,pc再调用下面的总线初始化函数,即可完成总线初始化。
pc函数库中的“单个.bas文件生成zar并且下载到控制器运行”接口:zaux_basdown(连接句柄,bas文件名带路径,下载模式)。
单个.bas文件生成zar并且下载到控制器运行。
private void c_download_click(object sender, eventargs e) { if (g_handle == (intptr)0) { messagebox.show("未链接到控制器!", "提示"); } else { int ret = 0; string strfilepath; openfiledialog openfiledialog1 = new openfiledialog(); openfiledialog1.initialdirectory = "\\"; openfiledialog1.filter = "配置文件(*.bas)|*.bas"; openfiledialog1.restoredirectory = true; openfiledialog1.filterindex = 1; if (openfiledialog1.showdialog() == dialogresult.ok) //打开配置文件 { strfilepath = openfiledialog1.filename; c_basfile.text = strfilepath; ret = zmcaux.zaux_basdown(g_handle, strfilepath, 1); //下载到rom if (ret != 0) { messagebox.show("文件下载失败!", "提示"); } g_initstatus = -1; g_basflag = true; } } }
如果总线初始化还没有成功,例程的初始化状态就会显示未完成,节点数量和轴数量都会显示0。总线初始化成功后,例程的初始化状态就会显示初始化完成。并显示节点数量和轴数量。
注意: 初始化过程中若产生硬限位报警,可在轴参数窗口将硬限位fwd_in和rev_in的映射编号指向-1,表示不映射,需要接入限位开关时再去修改fwd_in和rev_in。
5、设置查看的轴号。就是修改全局变量m_axisnum,并且使用修改后的全局变量m_axisnum去读取轴参数,然后把轴参数显示在例程上。
private void c_move_axis_textchanged(object sender, eventargs e) { if (g_handle == (intptr)0) { return; } int ret = 0; float[] f_axispara = new float[10]; int m_atype = 0; m_axisnum = convert.toint32(c_move_axis.text); ret = zmcaux.zaux_direct_getunits(g_handle, m_axisnum, ref f_axispara[0]); ret = zmcaux.zaux_direct_getspeed(g_handle, m_axisnum, ref f_axispara[1]); ret = zmcaux.zaux_direct_getaccel(g_handle, m_axisnum, ref f_axispara[2]); ret = zmcaux.zaux_direct_getatype(g_handle, m_axisnum, ref m_atype); if (ret == 0) { c_axistype.text = m_atype.tostring(); c_axisunits.text = f_axispara[0].tostring(); c_axisspeed.text = f_axispara[1].tostring(); c_axisacc.text = f_axispara[2].tostring(); } }
6、修改轴类型是使用pc函数库中的设置轴类型接口:zaux_direct_setatype(控制器连接句柄,轴号,轴类型)。
private void button1_click (object sender, eventargs e) { if (g_handle == (intptr)0) { return; } int ret = 0; int m_atype1 = 0; m_atype1 = convert.toint32(c_axistype1.text); m_axisnum = convert.toint32(c_move_axis.text); zmcaux.zaux_direct_setatype(g_handle, m_axisnum, m_atype1); }
7、轴运动和停止。正转和反转是使用了pc函数库中的单轴持续运动接口:zaux_direct_single_vmove(控制器连接句柄,轴号,方向)。停止是使用了pc函数库中的单轴运动停止接口:zaux_direct_single_cancel(控制器连接句柄,轴号,模式)。
a.单轴持续运动。
private void c_button_fwd_click(object sender, eventargs e) { if (g_handle == (intptr)0) { messagebox.show("未链接到控制器!", "提示"); return; } int ret = 0; ret=zmcaux.zaux_direct_setunits(g_handle,m_axisnum,convert.tosingle(c_axisunits.text)); ret=zmcaux.zaux_direct_setspeed(g_handle,m_axisnum,convert.tosingle(c_axisspeed.text)); ret=zmcaux.zaux_direct_setaccel(g_handle,m_axisnum,convert.tosingle(c_axisacc.text)); ret = zmcaux.zaux_direct_single_vmove(g_handle, m_axisnum, 1); }
b.单轴运动停止。
private void c_button_stop_click(object sender, eventargs e) { if (g_handle == (intptr)0) { messagebox.show("未链接到控制器!", "提示"); return; } int ret = 0; ret = zmcaux.zaux_direct_single_cancel(g_handle, m_axisnum, 2); }
8、读取和设置扩展的脉冲轴的真实轴类型。
总线初始化后,拓展的总线轴的轴类型为65(ethercat周期位置模式),但实际由于是脉冲型驱动器,轴类型并不是65,真实轴类型的读取和配置需要使用pc函数库的数据字典读取和写入接口。
扩展的脉冲轴的真实轴类型设置通过数据字典6011h设置,(参考下表的参数,按轴号依次设置,第一个驱动器设置数据字典6011h 0*800h,第二个驱动器设置6011h 1*800h,以此类推,每个驱动器加800h,其他参数同理)。
(1)pc函数库中的数据字典读取的接口:
zaux_buscmd_sdoread(连接句柄,槽位号,节点编号,对象字典编号,对象字典子编号,数据类型,读取的数据值)。
例如: 下图中的6和7轴的轴类型都显示65(ethercat周期位置模式),但是通过使用pc函数库中的数据字典读取的接口来读取6011h和6011h 1*800h,得知6轴和7轴的真实轴类型并不一样。
a.轴6。 注意: 24593是由16进制的6011h转换成10进制得来的。
b.轴7。注意 : 26641是由16进制的6011h 1*800h转换成10进制得来的。
轴6的真实轴类型是7(脉冲方向方式步进或伺服 ez信号输入),轴7的真实轴类型是0(虚拟轴)。
通过设备号和槽位号进行sdo读取。
private void c_sdo_read_click(object sender, eventargs e) { if (g_handle == (intptr)0) { messagebox.show("未链接到控制器!", "提示"); return; } int ret = 0; uint m_sdo_node2 = convert.touint32(c_sdonode1.text); uint m_sdo_index2 = convert.touint32(c_sdoreg1.text); uint m_sdo_sub2 = convert.touint32(c_sdoisub1.text); uint m_sdo_type2 = convert.touint32(c_sdotype1.selectedindex.tostring()) 1; int m_sdo_data2 = 0; if (bus_type == 0) { ret = zmcaux.zaux_buscmd_sdoread(g_handle, 0, m_sdo_node2, m_sdo_index2, m_sdo_sub2, m_sdo_type2, ref m_sdo_data2); if (ret != 0) { messagebox.show("读取失败"); return; } c_sdodata1.text = m_sdo_data2.tostring(); } else { messagebox.show("非ethercat模块"); return; } }
(2)pc函数库中的数据字典写入的接口:
zaux_buscmd_sdowrite(连接句柄,槽位号,节点编号,对象字典编号,对象字典子编号,数据类型,写入的数据值)。
例如: 下图是6轴的轴参数和使用pc函数库中的数据字典读取的接口来读取6011h得知的真实轴类型。
注意: 24593是由16进制的6011h转换成10进制得来的。
从图得知轴6的真实轴类型是7( 脉冲方向方式步进或伺服 ez信号输入 ),所以命令位置和反馈位置是一样的。接下来我们将要使用pc函数库中的数据字典写入的接口把轴6的真实轴类型修改为4(脉冲方向输出 正交编码器输入)。
写入后重新读取真实轴类型。
发现真实轴类型已经修改为4(脉冲方向输出 正交编码器输入)了。再看看轴6的参数,会发现命令位置和反馈位置不一样了,那是因为轴6没接编码器,所以 反馈位置变为了0。
通过设备号和槽位号进行sdo写入。
private void c_sdo_write_click(object sender, eventargs e) { if (g_handle == (intptr)0) { messagebox.show("未链接到控制器!", "提示"); return; } int ret = 0; uint m_sdo_node1 = convert.touint32(c_sdonode0.text); uint m_sdo_index1 = convert.touint32(c_sdoreg0.text); uint m_sdo_sub1 = convert.touint32(c_sdoisub0.text); uint m_sdo_type1 = convert.touint32(c_sdotype0.selectedindex.tostring()) 1; int m_sdo_data1 = convert.toint32(c_sdodata0.text); if (bus_type == 0) { ret = zmcaux.zaux_buscmd_sdowrite(g_handle, 0, m_sdo_node1, m_sdo_index1, m_sdo_sub1, m_sdo_type1, m_sdo_data1); if (ret != 0) { messagebox.show("写入失败"); return; } } else { messagebox.show("非ethercat模块"); return; } }
9、视频讲解。
本次,正运动技术ethercat超高速实时运动控制卡xpcie1032h上位机c#开发(四) :板载io与总线扩展io的编码器与脉冲配置的应用,就 分享到这里。
更多精彩内容请关注“ 正运动小助手 ”公众号,需要相关开发环境与例程代码,请咨询正运动技术销售工程师:400-089-8936。
本文由正运动技术原创,欢迎大家转载,共同学习,一起提高中国智能制造水平。文章k8凯发的版权归正运动技术所有,如有转载请注明文章来源。
正运动技术专注于运动控制技术研究和通用运动控制软硬件产品的研发,是国家级高新技术企业。正运动技术汇集了来自华为、中兴等公司的优秀人才,在坚持自主创新的同时,积极联合各大高校协同运动控制基础技术的研究,是国内工控领域发展最快的企业之一,也是国内少有、完整掌握运动控制核心技术和实时工控软件平台技术的企业。主要业务有:运动控制卡_运动控制器_ethercat运动控制卡_ethercat控制器_运动控制系统_视觉控制器__运动控制plc_运动控制_机器人控制器_视觉定位_xpcie/xpci系列运动控制卡等等。