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

电子说

1.3w人已加入

描述

硬件介绍

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

运动控制卡

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

运动控制卡

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

运动控制卡

接线参考

1、IN数字量输入接口

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

运动控制卡运动控制卡

2、OUT数字量输出接口

数字输出分布在 J400(OUT0-7)和 X400(OUT8-OUT39)信号接口中。

运动控制卡运动控制卡

3、编码器输入接口

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

运动控制卡运动控制卡运动控制卡运动控制卡

C#语言进行项目开发

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

运动控制卡

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

运动控制卡

3、找到厂家提供的光盘资料里面的C#函数库,路径如下(32位库为例)。

1)进入厂商提供的光盘资料找到“04PC函数”文件夹,并点击进入。

运动控制卡

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

运动控制卡

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

运动控制卡

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

运动控制卡

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

运动控制卡

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

运动控制卡

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

1)将zmcaux.cs文件复制到新建的项目里面中。

运动控制卡

2)将zauxdll.dll和zmotion.dll文件放入bindebug文件夹中。

运动控制卡

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

运动控制卡

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

PC函数介绍

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

运动控制卡

2.链接控制卡,获取链接句柄。

运动控制卡

3.读取单个I/O信号。

运动控制卡运动控制卡

4.批量读取I/O信号。

运动控制卡运动控制卡

5.设置单个输出口。

运动控制卡

6.批量设置输出口。

运动控制卡

7.读取单轴编码器反馈位置。

运动控制卡

8.批量读取编码器反馈位置,BASIC字符串为MPOS。

运动控制卡

9.自定义函数封装指令。

运动控制卡

单个或批量读取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#获取的数据进行对比。

运动控制卡运动控制卡

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];
}
运动控制卡

 

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

运动控制卡

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

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

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

审核编辑 黄宇

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分