正运动技术
正运动技术
精准24码全年无错版
EN
精准24码全年无错版
精准24码全年无错版

协助伙伴成功,是我们的价值所在

The value of Zmotion is to bring customers more success!

首页 / 支持与服务 / 技术分享

Technical support

技术分享

PCIe EtherCAT实时运动控制卡PCIE464的IO与编码器读写应用

硬件介绍

PCIE464运动控制卡是正运动推出的一款EtherCAT总线+脉冲型、PCIE接口式的运动控制卡,可选6-64轴运动控制,支持多路高速数字输入输出,可轻松实现多轴同步控制和高速数据传输。

PCIE464控制卡.png

PCIE464运动控制卡适合于多轴点位运动、插补运动、轨迹规划、手轮控制、编码器位置检测、IO控制、位置锁存等功能的应用。
PCIE464运动控制卡适用于3C电子加工、检测设备、半导体设备、SMT加工、激光加工、光通讯设备、锂电及光伏设备、以及非标自动化设备等高速高精应用场合。

PCIE464架构图.png

PCIE4系列控制卡的应用程序可以使用VC,VB,VS,C++,C#等软件开发,程序运行时需要动态库zmotion.dll,调试时可以将RTSys软件同时连接控制器,从而方便调试、方便观察。

28.png






接线参考

1、IN数字量输入接口
数字输入分布在J400(IN0-IN7)和X400(IN8-IN39)信号接口中。

IN数字量输入接口1.png

IN数字量输入接口2.png
2、OUT数字量输出接口
数字输出分布在J400(OUT0-7)和X400(OUT8-OUT39)信号接口中。

OUT数字量输出接口1.png

OUT数字量输出接口2.png

3、编码器输入接口

J400包含一个差分脉冲输出接口,一个差分编码器反馈,通过转接板接入。其中IN2-7有单端编码器轴的功能,只支持24V编码器输入。

编码器输入接口.png

编码器输入接口1.png

编码器输入接口2.png

编码器输入接口3.png




C#语言进行项目开发



1、 在VS2010菜单“文件”→“新建”→“项目”,启动创建项目向导。

1.png
2、 选择开发语言为“Visual C#”和.NET Framework 4以及Windows窗体应用程序。

2.png

3、 找到厂家提供的光盘资料里面的C#函数库,路径如下(32位库为例)。
1)进入厂商提供的光盘资料找到“04PC函数”文件夹,并点击进入。

3.png

2)选择“函数库2.1”文件夹。

4.png

3)选择“Windows平台”文件夹。

5.png

4)根据需要选择对应的函数库,这里选择32位库。

6.png

5)解压C#压缩包,里面有C#对应的函数库。

7.png

6)函数库具体路径如下。

8.png

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

9.png

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

10.png

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

11.png

6、至此,项目新建完成,可进行C#项目开发。




PC函数介绍



1.PC函数手册可在光盘资料查看,具体路径如下。

12.png

2.链接控制卡,获取链接句柄。
13.png
3.读取单个I/O信号。
14.png
15.png
4.批量读取I/O信号。
16.png
17.png
5.设置单个输出口。
18.png
6.批量设置输出口。
19.png
7.读取单轴编码器反馈位置。
20.png
8.批量读取编码器反馈位置,BASIC字符串为MPOS。
21.png
9.自定义函数封装指令。
22.png




单个或批量读取IO和编码器数据


1.链接控制器获取句柄,上位机操作通过获取到的句柄来操作控制器

//连接PCIe控制卡,控制卡卡号缺省从0开始
int ret = zmcaux.ZAux_OpenPci(0, out g_handle);
if (g_handle != (IntPtr)0)
{
    MessageBox.Show("控制卡链接成功!" , "提示");
    timer_GetData.Enabled = true;  //开启定时器或在单独线程里实时读取I/O信号
}
else
{
    MessageBox.Show("控制卡链接失败,请检测PCI卡号!" , "警告");
}
2.开启定时器实时读取I/O信号。
//定时器刷新I/O和轴反馈数据
private void timer_GetData_Tick(object sender, EventArgs e)
{
    uint[] instate = new uint[4];
    uint[] opstate = new uint[4];
    float[] mpos = new float[4];
    for (int i = 0; i < 4; i++)
    {
        zmcaux.ZAux_Direct_GetIn(g_handle, i, ref instate[i]); //读取单个IN
        zmcaux.ZAux_Direct_GetOp(g_handle, i, ref opstate[i]); //读取单个OUT
        zmcaux.ZAux_Direct_GetMpos(g_handle, i, ref mpos[i]); //读取单轴反馈位置MPOS
    }
    IN0.Checked = (instate[0] == 1);
    IN1.Checked = (instate[1] == 1);
    IN2.Checked = (instate[2] == 1);
    IN3.Checked = (instate[3] == 1);
    OP0.Checked = (opstate[0] == 1);
    OP1.Checked = (opstate[1] == 1);
    OP2.Checked = (opstate[2] == 1);
    OP3.Checked = (opstate[3] == 1);
    MPOS0.Text = mpos[0].ToString();
    MPOS1.Text = mpos[1].ToString();
    MPOS2.Text = mpos[2].ToString();
    MPOS3.Text = mpos[3].ToString();
    int[] inputs = new int[4];
    uint[] outputs = new uint[4];
    float[] allmpos = new float[8];
    zmcaux.ZAux_Direct_GetInMulti(g_handle, 16, 31, inputs); //批量读取输入IN16-31
    zmcaux.ZAux_Direct_GetOutMulti(g_handle, 16, 31, outputs); //批量读取输出OUT16-31
    zmcaux.ZAux_Direct_GetAllAxisPara(g_handle, "MPOS", 8, allmpos);//批量读取轴反馈位置MPOS 0-7
    InputGroup1631.Text = inputs[0].ToString("X4"); 
}
3.单个或批量设置OP输出口。
//单个输出口状态切换函数
private void OP0_CheckedChanged(object sender, EventArgs e)
{
     if (g_handle == (IntPtr)0)
     {
         MessageBox.Show("未链接到控制卡!", "提示");
         return;
     }
     if (OP0.Checked)
     {
         zmcaux.ZAux_Direct_SetOp(g_handle,0, 1);
         OP0.Text = "out0 打开";
     }
     else
     {
         zmcaux.ZAux_Direct_SetOp(g_handle, 0, 0);
         OP0.Text = "out0 关闭";
     }
}
//批量切换输出口状态函数
private void OutputGroup03_CheckedChanged(object sender, EventArgs e)
{
    if (g_handle == (IntPtr)0)
    {
        MessageBox.Show("未链接到控制卡!", "提示");
        return;
    }  
    uint[] iostate = new uint[4];
    if (OutputGroup03.Checked)
    {
        iostate[0] = 0xF;    //以二进制组合OUT,十六进制0xF即OUT0-3全部置1
        zmcaux.ZAux_Direct_SetOutMulti(g_handle, 0, 3, iostate);
        OutputGroup03.Text = "全部置ON";
        OP0.Checked = true;
        OP1.Checked = true;
        OP2.Checked = true;
        OP3.Checked = true;
    }
    else
    {
        iostate[0] = 0x0;
        zmcaux.ZAux_Direct_SetOutMulti(g_handle, 0, 3, iostate);
        OutputGroup03.Text = "全部置OFF";
        OP0.Checked = false;
        OP1.Checked = false;
        OP2.Checked = false;
        OP3.Checked = false;
    }
}

4.若想验证通过函数获取的IO状态和数据是否准确,可以使用正运动的调试软件RTSys连接到控制卡。

通过工具→输入口/输出口观察当前控制卡的实时IO状态,通过轴参数窗口观察各轴的反馈位置MPOS,并与C#获取的数据进行对比。

23.png

24.png
5.自定义函数封装,单条命令批量获取需要的部分I/O和部分轴数据。
通过组合不同的Basic命令字符串,中间以英文逗号字符隔开,一次性下发读取所需的数据,如:
(1)获取某个输入信号,对应Basic命令字符串为:IN(输入口序号);
(2)获取某个输出信号,对应Basic命令字符串为:OP(输入口序号);
(3)获取某轴反馈位置,对应Basic命令字符串为:MPOS(轴号);
其他参数也可以使用此方式,具体Basic字符串可参考PC手册“轴参数指令表”。
举例说明,需要单条命令获取输入0,输入3,输出1,输出4,轴2和轴5的反馈数据,则需要通过ZAux_Execute函数下发字符串:

“?IN(0),IN(3),OP(1),OP(4),MPOS(2),MPOS(5)”;

其中,英文  “?”   字符和“PRINT”字符为同一含义,表示读取后续参数的值;参数字符不用区分大小写。

private void getData_Click(object sender, EventArgs e)
{
    //通过Execute函数发送Basic字符串组合实现一次性读取多个参数
    if (g_handle == (IntPtr)0)
    {
        MessageBox.Show("未链接到控制卡!", "提示");
        return;
    }
    string pszCommand;                                      //发送的Basic命令字符串
    StringBuilder psResponse = new StringBuilder(1024);     //接收返回的字符串
    uint uiResponseLength = 1024;                           //接收返回的字符长度,不能小于接收的字符串长度
    pszCommand = "?IN(4),IN(5),OP(4),OP(5),MPOS(4),MPOS(5)";//读取数据Basic字符串,共6个数据
    zmcaux.ZAux_Execute(g_handle, pszCommand, psResponse, uiResponseLength);    
    string psResponseResult = "";
    psResponseResult += psResponse;
    string[] parts = psResponseResult.Split('\t');          //这里以空格对字符串分割
    IN4.Checked = Convert.ToInt32(parts[0]) == 1;
    IN5.Checked = Convert.ToInt32(parts[1]) == 1;
    OP4.Checked = Convert.ToInt32(parts[2]) == 1;
    OP5.Checked = Convert.ToInt32(parts[3]) == 1;
    MPOS4.Text = parts[4];
    MPOS5.Text = parts[5];
}

25.png

调试软件RTSys命令与输出窗口的在线命令,与上述封装函数为相同的功能。

6.演示视频

演示视频可点击“PCIe EtherCAT实时运动控制卡PCIE464的IO与编码器读写应用”查看。


27.png

本次,正运动技术PCIe EtherCAT实时运动控制卡PCIE464的IO与编码器读写应用,就分享到这里。

更多精彩内容请关注“ 正运动小助手 ”公众号,需要相关开发环境与例程代码,请咨询正运动技术销售工程师:400-089-8936。

本文由正运动技术原创,欢迎大家转载,共同学习,一起提高中国智能制造水平。文章版权归正运动技术所有,如有转载请注明文章来源。
企业微信截图_20240321153031.png

正运动技术专注于运动控制技术研究和通用运动控制软硬件产品的研发,是国家级高新技术企业。正运动技术汇集了来自华为、中兴等公司的优秀人才,在坚持自主创新的同时,积极联合各大高校协同运动控制基础技术的研究,是国内工控领域发展最快的企业之一,也是国内少有、完整掌握运动控制核心技术和实时工控软件平台技术的企业。主要业务有:运动控制卡_运动控制器_EtherCAT运动控制卡_EtherCAT控制器_运动控制系统_视觉控制器__运动控制PLC_运动控制_机器人控制器_视觉定位_XPCIe/XPCI系列运动控制卡等等

邮箱留言

Copyright © 2013 精准24码全年无错版 Design by Zmotion 版权所有   粤ICP备13037187号    Powered by 运动控制器-运动控制卡

在线咨询