The value of Zmotion is to bring customers more success!
XPCIE1032H功能简介

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的测试数据结果对比:

关闭计算机电源。
打开计算机机箱,选择一条空闲的XPCIE卡槽,用螺丝刀卸下相应的挡板条。
XPCIE1032H驱动安装与建立连接参考往期文章EtherCAT超高速实时运动控制卡XPCIE1032H上位机C#开发(一):驱动安装与建立连接
。

到正运动技术官网的下载中心选择需要的平台库文件。
下载地址:http://www.zmotion.com.cn/download_list_21.html

解压下载的安装包找到 “ Zmcaux.cs ” , “zauxdll.dll ” , “zmotion.dll ” 放入到项目文件中。
1、“Zmcaux.cs”放在项目根目录文件中,与bin目录同级。











1、XPCIE1032H的IO接口规格如下



⊙只能使用24V编码器,编码器0和编码器1的脉冲输入最高频率为500kHz,可以接高速编码器,其它的为普通输入,脉冲最高频率10kHz,只能接手轮之类的低速编码器。
⊙脉冲输出和编码器输入后的编号为默认的轴号,通过ATYPE指令切换IO口是否为通用IO(目标轴的ATYPE=0为通用IO,ATYPE=1为脉冲输出,ATYPE=3为编码器输入,ATYPE=4为脉冲输出+编码器输入)。


a.通过轴号读取轴类型。
b.通过轴号设置轴类型。
4、输出口做脉冲配置

(1)配置流程图如下。




每个EIO扩展模块在扩展接线完成后,不需要进行进行二次开发,只需使用指令在EtherCAT主站控制器配置唯一的IO地址和轴地址,配置完成即可访问。
IO地址编号通过总线指令NODE_IO来设置,控制器上程序只需通过IO编号就可以访问到扩展模块上的资源。轴地址的配置使用“AXIS_ADDRESS”指令映射绑定轴号,绑定完成通过BASE或AXIS指令指定轴号。

当控制器的IO或轴资源不够的时候,需要增加扩展模块,控制器可以同时连接多个扩展模块,EIO系列扩展模块通过EtherCAT总线连接,每个扩展模块有唯一的地址,从0开始。
注意: EIO系列带轴的扩展模块的使用方法相同,仅是扩展资源数量的区别。下面以EIO16084扩展模块为例,来对EIO系列扩展模块进行使用说明。

上图涉及的编号概念如下: 总线相关指令参数会用到如下编号。
4、EIO16084接口规格


5、脉冲轴接口

6、轴接口配置为编码器
(1)接线参考

接好线后,还要通过上位机的数据字典写入来配置总线轴的真实轴类型。真实轴类型设置是由数据字典6011h配置。( 参考下表的参数,按轴号依次设置,第一个驱动器设置数据字典6011h+0*800h,第二个驱动器设置6011h+1*800h,以此类推,每个驱动器加800h,其他参数同理)。

(2)例程相关代码
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)接线参考


(2)例程相关代码
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链接方式的链接按钮的消息响应函数来链接控制器。
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!");
}
}

单个.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;
}
}
}

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();
}
}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);
}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);
}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);
}


b.轴7。注意 : 26641是由16进制的6011h+1*800h转换成10进制得来的。

轴6的真实轴类型是7(脉冲方向方式步进或伺服+EZ信号输入),轴7的真实轴类型是0(虚拟轴)。
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;
}
}



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。
本文由正运动技术原创,欢迎大家转载,共同学习,一起提高中国智能制造水平。文章版权归正运动技术所有,如有转载请注明文章来源。
正运动技术专注于运动控制技术研究和通用运动控制软硬件产品的研发,是国家级高新技术企业。正运动技术汇集了来自华为、中兴等公司的优秀人才,在坚持自主创新的同时,积极联合各大高校协同运动控制基础技术的研究,是国内工控领域发展最快的企业之一,也是国内少有、完整掌握运动控制核心技术和实时工控软件平台技术的企业。主要业务有:运动控制卡_运动控制器_EtherCAT运动控制卡_EtherCAT控制器_运动控制系统_视觉控制器__运动控制PLC_运动控制_机器人控制器_视觉定位_XPCIe/XPCI系列运动控制卡等等。