IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 简单易用的运动控制卡(二):外设读写与ZDevelop诊断 -> 正文阅读

[C++知识库]简单易用的运动控制卡(二):外设读写与ZDevelop诊断

今天,正运动小助手给大家分享一下运动控制卡之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诊断,就分享到这里。

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

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

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-09-30 11:45:05  更:2021-09-30 11:47:17 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/29 4:19:55-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计