简单易用的运动控制卡(二):外设读写与ZDevelop诊断

50 篇文章 11 订阅
1 篇文章 0 订阅

今天,正运动小助手给大家分享一下运动控制卡之ECI3808的硬件外设读写并配合ZDevelop诊断。

一、 ECI3808硬件介绍

1.功能介绍

ECI3808系列控制卡支持最多达 12 轴直线插补、任意圆弧插补、空间圆弧、螺旋插补、电子凸轮、电子齿轮、同步跟随、虚拟轴、机械手指令等;采用优化的网络通讯协议可以实现实时的运动控制。

ECI3808系列运动控制卡支持以太网,RS232 通讯接口和电脑相连,接收电脑的指令运行,可以通过CAN总线去连接各个扩展模块,从而扩展输入输出点数或运动轴。

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

1.png

2.硬件接口

2.png

3.png

3.控制器基本信息

4.png

二、 C++进行运动控制开发

1.新建MFC项目并添加函数库

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

5.png

(2)选择开发语言为“Visual C++”和程序类型“MFC应用程序”。

6.png

(3)点击下一步即可。

7.png

(4)选择类型为“基于对话框”,下一步或者完成。

8.png

(5)找到厂家提供的光盘资料,路径如下(64位库为例)。

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

9.png

B.选择“函数库2.1”文件夹。

10.png

C.选择“Windows平台”文件夹。

11.png

D.根据需要选择对应的函数库这里选择64位库。

12.png

E.解压C++的压缩包,里面有C++对应的函数库。

13.png

F.函数库具体路径如下。

14.png

(6)将厂商提供的C++的库文件和相关头文件复制到新建的项目里面。

15.png

(7)在项目中添加静态库和相关头文件。

A.先右击项目文件,接着依次选择:“添加”→“现有项”。

16.png

B.在弹出的窗口中依次添加静态库和相关头文件。

(8)声明用到的头文件和定义控制器连接句柄。

17.png

至此项目新建完成,可进行MFC项目开发。

2.查看PC函数手册,熟悉相关函数接口。

(1)PC函数手册也在光盘资料里面,具体路径如下:“光盘资料\8.PC函数\函数库2.1\ZMotion函数库编程手册 V2.1.pdf”

18.png

(2)链接控制器,获取链接句柄。

19.png

(3)外设读写接口。

20.png

3.MFC开发控制器硬件外设读写例程。

(1)例程界面如下。

21.png

(2)链接按钮的事件处理函数中调用链接控制器的接口函数ZAux_OpenEth(),与控制器进行链接,链接成功后启动定时器1监控控制器状态。

        //网口链接控制器

        void CSingle_move_Dlg::OnOpen()

        {

             char   buffer[256]; 

             int32 iresult;

             //如果已经链接,则先断开链接

             if(NULL != g_handle)

             {

                ZAux_Close(g_handle);

                g_handle = NULL;

             }

              //从IP下拉框中选择获取IP地址

              GetDlgItemText(IDC_IPLIST,buffer,255);

              buffer[255] = '\0';

              //开始链接控制器

              iresult = ZAux_OpenEth(buffer, &g_handle);

              if(ERR_SUCCESS != iresult)

              {

                 g_handle = NULL;

                 MessageBox(_T("链接失败"));

                 SetWindowText("未链接");

                 return;

              }

              //链接成功开启定时器1

              SetWindowText("已链接");

              SetTimer( 1, 100, NULL );  

        }      

(3)通过定时器监控控制器状态。

        void CSingle_move_Dlg::OnTimer(UINT_PTR nIDEvent) 

        {

            // TODO: 在此添加消息处理程序代码和/或调用默认值

            if(NULL == g_handle)

            {

                MessageBox(_T("链接断开"));

                return ;

            }

            //定时器1

            if(1 == nIDEvent)

            {

               CString string;

               float AinValue = 0;

               //获取当前轴位置

               ZAux_Direct_GetAD(g_handle,0, &AinValue);          

               string.Format("AIN0:%.2f mv", AinValue / 4096 * 10000);

               GetDlgItem( IDC_AIN0 )->SetWindowText( string );

               ZAux_Direct_GetAD( g_handle,1,&AinValue);          //获取当前轴速度

               string.Format("AIN1:%.2f mv", AinValue / 4096 * 10000);

               GetDlgItem(IDC_AIN1)->SetWindowText( string );  

               float AoutValue = 0;

               ZAux_Direct_GetDA(g_handle, 0, &AoutValue);         //获取当前轴位置

               string.Format("AOUT0:%.2f mv", AoutValue / 4096 * 10000);

               GetDlgItem(IDC_GETAOUT0)->SetWindowText(string);

               ZAux_Direct_GetDA(g_handle, 1, &AoutValue);          //获取当前轴速度

               string.Format("AOUT1:%.2f mv", AoutValue / 4096 * 10000);

               GetDlgItem(IDC_GETAOUT1)->SetWindowText(string);  

               int nLine = 0; 

               ZAux_Direct_GetRemain_LineBuffer(g_handle,0, &nLine);           //判断当前轴状态

               string.Format("轴0剩余缓冲区:%d", nLine);

               GetDlgItem(IDC_REMAINBUFFER)->SetWindowText(string); 

               int canstatus = 0;

               canstatus = CanioStatus();

               if(canstatus == 0)

               {

                  string.Format("can扩展板状态: 断开");

                  GetDlgItem(IDC_CANIO)->SetWindowText(string);

               }

               else

               {

                  string.Format("can扩展板状态: 正常");

                  GetDlgItem(IDC_CANIO)->SetWindowText(string);

               }

            }

            if(2 == nIDEvent)

            {

               //IO状态获取

               DealInValue();

            }

            CDialog::OnTimer(nIDEvent);

        }

(4)通过参数设置按钮的事件处理函数去设置模拟量、pwm占空比等外设参数。

        void CSingle_move_Dlg::OnBnClickedParaset()

        {

            // TODO: 在此添加控件通知处理程序代码

            CString str = "";

            float DaValue = 0;

            //获取编辑框中DA0的值设置到控制器

            GetDlgItem(IDC_AOUT0)->GetWindowText(str);

            DaValue = atof(str);

            ZAux_Direct_SetDA(g_handle, 0, DaValue / 10 * 4096);

          

            //获取编辑框中DA0的值设置到控制器

            GetDlgItem(IDC_AOUT1)->GetWindowText(str);

            DaValue = atof(str);

            ZAux_Direct_SetDA(g_handle, 1, DaValue/ 10 * 4096);

          

            float PwmDuty0, PwmDuty1, PwmFreq0, PwmFreq1;

            //获取编辑框中PWM0占空比的值设置到控制器

            GetDlgItem(IDC_PWMDUTY0)->GetWindowText(str);

            PwmDuty0 = atof(str);

            ZAux_Direct_SetPwmDuty(g_handle,0,PwmDuty0/100);

          

            //获取编辑框中PWM1占空比的值设置到控制器

            GetDlgItem(IDC_PWMDUTY1)->GetWindowText(str);

            PwmDuty1 = atof(str);

            ZAux_Direct_SetPwmDuty(g_handle, 1, PwmDuty1/100);

          

            //获取编辑框中PWM1频率的值设置到控制器

            GetDlgItem(IDC_PWMFREQ0)->GetWindowText(str);

            PwmFreq0 = atof(str);

            ZAux_Direct_SetPwmFreq(g_handle, 0, PwmFreq0);

          

            //获取编辑框中PWM1频率的值设置到控制器

            GetDlgItem(IDC_PWMFREQ1)->GetWindowText(str);

            PwmFreq1 = atof(str);

            ZAux_Direct_SetPwmFreq(g_handle, 1, PwmFreq1);

        }

(5)通过断开按钮的事件处理函数来断开与控制卡的连接。

        void CSingle_move_Dlg::OnClose()  //断开链接

        {

            // TODO: Add your control notification handler code here

            if(NULL != g_handle)

            {

               KillTimer(1);              //关定时器

               KillTimer(2);

               ZAux_Close(g_handle);

               g_handle = NULL;

               SetWindowText("未链接");

            }

        }

三、 调试与监控

编译运行例程,同时通过ZDevelop软件连接控制器对控制器状态进行监控。

22.png

23.png

简单易用的运动控制卡(二):外设读写与ZDevelop诊断

本次,正运动技术简单易用的运动控制卡(二):外设读写与ZDevelop诊断,就分享到这里。

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

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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

正运动技术

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值