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的测试数据结果对比:
平均值 | C++ LOCAL | C# LOCAL | 传统PCI/PCIe卡接口交互 | PLC网口通讯交互 |
1w次单条读取交互周期 | 4.70us | 5.3us | 64us | 500us-10ms |
10w次单条读取交互周期 | 3.90us | 5.7us | 65us | 500us-10ms |
1w次多条读取交互周期 | 6.20us | 8.85us | 472us | 500us-10ms |
10w次多条读取交互周期 | 5.50us | 8.37us | 471us | 500us-10ms |
我们可以从测试对比结果看出,XPCIE1032H运动控制卡配合实时运动控制内核MotionRT7,在LOCAL链接(核内交互)的方式下,指令交互的效率是非常稳定,当测试数量从1w增加到10w时,单条指令交互时间与多条指令交互时间波动不大,非常适用于高速高精的应用。 XPCIE1032H控制卡安装
关闭计算机电源。
打开计算机机箱,选择一条空闲的XPCIE卡槽,用螺丝刀卸下相应的挡板条。
将运动控制卡插入该槽,拧紧挡板条上的固定螺丝。
XPCIE1032H驱动安装与建立连接参考往期文章EtherCAT超高速实时运动控制卡XPCIE1032H上位机C#开发(一):驱动安装与建立连接。
一、C#语言进行运动控制开发
到正运动威廉希尔官方网站 官网的下载中心选择需要的平台库文件。
解压下载的安装包找到 “Zmcaux.cs” , “zauxdll.dll” , “zmotion.dll” 放入到项目文件中。
1、“Zmcaux.cs”放在项目根目录文件中,与bin目录同级。
2、“zauxdll.dll”,“zmotion.dll”放在bin -> Debug。
用vs打开新建的项目文件,在右边的解决方案资源管理器中点击显示所有,选中项目,右键“添加”->“现有项”,选中zmcaux.cs文件添加进在项目中。
双击Form1.cs里面的Form1,出现代码编辑界面,在文件开头写入using cszmcaux,并声明控制器句柄g_handle。
二、相关PC函数介绍 相关PC函数介绍详情可参考“ZMotion PC函数库编程手册 V2.1.1”。
指令11 | ZAux_FastOpen | ||||||||
指令原型 | int32 __stdcall ZAux_FastOpen(int type, char *pconnectstring, uint32 uims ,ZMC_HANDLE * phandle) | ||||||||
指令说明 | 与控制器建立连接, 可以指定连接的等待时间 | ||||||||
输入参数 |
|
||||||||
输出参数 |
|
||||||||
返回值 | 成功返回值为0,非0详见错误码说明。 | ||||||||
指令示例 |
串口连接: ZMC_HANDLE phandle;//控制器连接句柄 Char comID[32]= "Com0";//串口ID,不能直接写串口号,需要在串口号前加个Com ZAux_FastOpen(1, comID,1000,&phandle); 网口连接例子: ZMC_HANDLE phandle;//控制器连接句柄 Char EthID[32]= "192.168.0.11";//网口ID ZAux_FastOpen(2, EthID,1000,&phandle); MotionRT7连接例子: ZMC_HANDLE phandle;//控制器连接句柄 ZAux_FastOpen(5, "LOCAL1",3000,&g_handle); |
||||||||
详细说明 | type设置为5,zmotion.dll版本要在3.8.8.50以上。 |
指令17 | ZAux_Direct_GetAtype | ||||||||||||||||||||||||||||||||||||||||||||
指令原型 | int32 __stdcall ZAux_Direct_GetAtype(ZMC_HANDLE handle, int iaxis, int *piValue) | ||||||||||||||||||||||||||||||||||||||||||||
指令说明 | 读取指定轴的轴类型。 | ||||||||||||||||||||||||||||||||||||||||||||
输入参数 |
|
||||||||||||||||||||||||||||||||||||||||||||
输出参数 |
|
||||||||||||||||||||||||||||||||||||||||||||
返回值 | 成功返回值为0,非0详见错误码说明。 | ||||||||||||||||||||||||||||||||||||||||||||
指令示例 | 轴基本运动参数设置获取 | ||||||||||||||||||||||||||||||||||||||||||||
详细说明 |
|
指令24 | ZAux_Direct_SetAtype | ||||||||||||||||||||||||||||||||||||||||||||
指令原型 | int32 __stdcall ZAux_Direct_SetAtype(ZMC_HANDLE handle, int iaxis, int iValue) | ||||||||||||||||||||||||||||||||||||||||||||
指令说明 | 设置指定轴的轴类型。 | ||||||||||||||||||||||||||||||||||||||||||||
输入参数 |
|
||||||||||||||||||||||||||||||||||||||||||||
输出参数 | / | ||||||||||||||||||||||||||||||||||||||||||||
返回值 | 详见错误码说明。 | ||||||||||||||||||||||||||||||||||||||||||||
指令示例 | 轴基本运动参数设置获取 | ||||||||||||||||||||||||||||||||||||||||||||
详细说明 1 |
1.最好是在程序初始化的时候就设置好 ATYPE。 2.ZCAN 扩展轴要先设置 AXIS_ADDRESS,并在设置后延迟 2 个任务周 期再调用运动指令,受总线带宽限制,ZCAN 扩展轴不要设置超过 2 个。 3.对部分产品型号带有独立的编码器,可以使用相应虚拟轴来做编码器 轴使用,例如 ZMC206 的电机轴为 0-5 轴,编码器可以通过轴 6-11 来控 制,详细可通过 ZDevelop 软件连接上控制器以后查看控制器状态。 |
||||||||||||||||||||||||||||||||||||||||||||
详细说明2 |
|
指令251 | ZAux_BusCmd_SDOWrite | ||||||||||||||||||||||||||||||
指令原型 | int32 __stdcall ZAux_BusCmd_SDOWrite(ZMC_HANDLE handle, uint32 slot, uint32 node, uint32 index, uint32 subindex, uint32 type, int value); | ||||||||||||||||||||||||||||||
指令说明 | 通过设备号和槽位号进行 SDO 写入 | ||||||||||||||||||||||||||||||
输入参数 |
|
||||||||||||||||||||||||||||||
输出参数 | / | ||||||||||||||||||||||||||||||
返回值 | 成功返回值为0,非0详见错误码说明。 | ||||||||||||||||||||||||||||||
指令示例 | SDO 读写最大扭矩 | ||||||||||||||||||||||||||||||
详细说明 | 需连接好设备,扫描总线后才能执行。 |
指令252 | ZAux_BusCmd_SDORead | ||||||||||||||||||||||||||||
指令原型 | int32 __stdcall ZAux_BusCmd_SDORead(ZMC_HANDLE handle, uint32 slot, uint32 node, uint32 index, uint32 subindex, uint32 type, int *value); | ||||||||||||||||||||||||||||
指令说明 | 通过设备号和槽位号进行 SDO 读取。 | ||||||||||||||||||||||||||||
输入参数 |
|
||||||||||||||||||||||||||||
输出参数 |
|
||||||||||||||||||||||||||||
返回值 | 成功返回值为0,非0详见错误码说明。 | ||||||||||||||||||||||||||||
指令示例 | SDO 读写最大扭矩 | ||||||||||||||||||||||||||||
详细说明 | 需连接好设备,扫描总线后才能执行。 |
指令268 | ZAux_BasDown | ||||||||
指令原型 | int32 __stdcall ZAux_BasDown(ZMC_HANDLE handle,const char *Filename,uint32 run_mode ) | ||||||||
指令说明 | 单个.bas文件生成ZAR并且下载到控制器运行 | ||||||||
输入参数 |
|
||||||||
输出参数 | / | ||||||||
返回值 | 成功返回值为0,非0详见错误码说明。 | ||||||||
指令示例 | 控制程序的下载及编写 | ||||||||
详细说明 | .bas文件,可在正运动控制卡直接运行的Basic语法文件 |
三、XPCIE1032H板载IO的编码器与脉冲配置
1、XPCIE1032H的IO接口规格如下
项目 | 规格 | 详情 |
内部IO数 | 16+16 | 16路输入、16路输出(带过流保护) |
最多扩展IO数 | 512进512出 | 搭配扩展模块扩展IO |
高速输入 | 8路 | IN0-7,共8路为高速输入 |
高速输出 | 16路 | OUT0-15,共16路输出全为高速输出 |
锁存输入 | 4路 | 4路输入可以配置为锁存输入,编号IN0-3 |
单端编码器输入 | 2路 | 输入复用,编号IN0-2,IN4-6 |
PWM输出 | 4路 | 4路输出可以配置为PWM,编号OUT0-3 |
硬件比较输出 | 16路 | 16路输出可以配置为硬件比较输出(PSO功能),兼容精准输出,编号OUT0-15 |
单端脉冲输出 | 4路 | 输出复用,编号OUT8-15 |
IO电源输入 | DC24V | 24V直流输入,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.通过轴号读取轴类型。
private void C_Move_Axis_TextChanged(object sender, EventArgs e) { if (g_handle == (IntPtr)0) { return; } int ret = 0; int m_atype = 0; m_axisnum = Convert.ToInt32(C_Move_Axis.Text); ret += zmcaux.ZAux_Direct_GetAtype(g_handle, m_axisnum, ref m_atype); if (ret == 0) { C_AxisType.Text = m_atype.ToString(); } }
b.通过轴号设置轴类型。
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); }4、输出口做脉冲配置
XPCIE032H板载4路单端脉冲输出。(本例以采用OUT8和OUT9连接驱动器来说明)。 首先按接线图进行接线,接线完成后,因为OUT8为DIR3,OUT9为PUL3,对应的脉冲驱动器轴号为3。所以得通过上位机把轴3的轴类型设置为1(脉冲方向方式的步进或伺服)配置。 注意:驱动器根据规格可接E24V或E5V。
(1)配置流程图如下。
(2)例程相关代码。 a.通过轴号读取轴类型。
private void C_Move_Axis_TextChanged(object sender, EventArgs e) { if (g_handle == (IntPtr)0) { return; } int ret = 0; int m_atype = 0; m_axisnum = Convert.ToInt32(C_Move_Axis.Text); ret += zmcaux.ZAux_Direct_GetAtype(g_handle, m_axisnum, ref m_atype); if (ret == 0) { C_AxisType.Text = m_atype.ToString(); } }b.通过轴号设置轴类型。
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); }
四、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接口规格
接口说明如下表:
接口 | 个数 | 说明 | |
状态指示灯 | POW | 1个 | 主电源指示灯:主电源接通时亮灯 |
RUN | 1个 | 运行指示灯:正常运行时亮灯 | |
ALM | 1个 | 错误指示灯:运行错误时亮灯 | |
EtherCAT接口 | EtherCAT IN | 1个 | 连接主控制器或上一级扩展模块 |
EtherCAT OUT | 1个 | 连接驱动设备或下一级扩展模块 | |
数字输入端口 | 16个 | NPN型,主电源24V供电 | |
数字输出端口 | 8个 | NPN型,主电源24V供电 | |
主电源 | 1个 | 24V直流电源给扩展模块主控区域供电 | |
脉冲轴接口 | 4个 | 每个接口可配置为差分脉冲输出和差分编码器输入 |
由上表可知脉冲轴接口可配置为差分脉冲输出和差分编码器输入。
5、脉冲轴接口
EIO16084提供4个本地差分脉冲轴接口,每个接口为标准DB26母座。
注意:如果4个本地差分脉冲轴接口还不能满足使用需求,可以把EIO16084更换为EIO24088。EIO24088提供8个本地差分脉冲轴接口,每个接口为标准DB26母座。
接口定义如下。
6、轴接口配置为编码器
(1)接线参考
与长春凯尔科技,2500线增量式编码器接线参考示例:
DB26 | 长春凯尔科技 | |
引脚号 | 功能 | 引脚 |
7 | 5V | VCC红色 |
10 | GND | 0V黑 |
19 | Z+ | Z+黄 |
6 | Z- | Z-橙 |
17 | A+ | A+绿 |
4 | A- | A-棕 |
18 | B+ | B+白 |
5 | B- | B-灰 |
接好线后,还要通过上位机的数据字典写入来配置总线轴的真实轴类型。真实轴类型设置是由数据字典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; } }审核编辑:黄飞
评论
查看更多