项目工程下载与XML配置文件下载:EtherCAT超高速实时运动控制卡XPCIE1032H上位机C#开发(十)

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链接方式连接到运动控制卡,实现实时运动控制。

在这里插入图片描述

一、C#语言进行运动控制项目开发

在这里插入图片描述

二、PC函数介绍

相关PC函数介绍详情可参考“ZMotion PC函数库编程手册 V2.1.1”。

在这里插入图片描述
在这里插入图片描述

三、XML文件生成ZML文件添加步骤

大家都知道,正运动总线控制器事先就把一些总线从站的XML文件添加到控制器的固件里面了,所以配合市面上大部分的EtherCAT从站,客户只需要下载总线初始化脚本就可以和对应从站通讯,具体可以参考往期推文EtherCAT超高速实时运动控制卡XPCIE1032H上位机C#开发(二):EtherCAT总线初始化。

针对市面上刚出的总线从站,我们没有及时把XML文件添加到控制器固件里面或总线扫描的时候遇见不支持的从站,这个时候需要我们自己添加XML文件。

在这里插入图片描述

正运动控制器添加XML文件的步骤如下:

(1)通过XMLParsingTools工具软件将XML转换成ZML文件;

(2)把生成的ZML文件添加到Zpj项目里面,连同总线初始化脚本的Bas文件一起下载到控制器里面即可。

1、通过XMLParsingTools工具将XML文件转换成ZML文件。

(1)点击左上角文件夹打开XML文件,选择对应的从站型号和从站类型(这里以友商的一拖四总线驱动器为例)。

在这里插入图片描述

(2)点击左上角文件夹位置导出ZML文件即可。

在这里插入图片描述

2、RTSys软件同时下载ZML文件与总线初始化的Bas文件(下载ZPJ项目)。

(1)把刚刚生成的ZML文件拷贝到总线初始化的ZPJ项目文件夹下,通过RTSys软件打开【EtherCAT参数.zpj】这个项目文件。

在这里插入图片描述

(2)右键文件视图区域,点击【增加到项目】将刚刚生成的ZML文件添加到项目里面。

在这里插入图片描述

(3)点击连接按钮,通过Local接口链接上控制器。

在这里插入图片描述

(4)点击【下载到ROM】,将整个项目下载到控制器里面掉电保存即可。

在这里插入图片描述

3.将例程下载到ZML文件与总线初始化的Bas文件。

连接控制器,新建ZPJ项目文件,将总线初始化的Bas文件和刚刚生成的zml文件复制到新建项目的目录下并一一添加进来,最后下载到控制器的ROM里面即可掉电保存。

在这里插入图片描述

三、应用例程及实现效果

1、点击连接按钮链接到MotionRT7运动控制软核。

//连接控制器
private void Btn_cn_Click(object sender, EventArgs e)
{
    int ret;
    //链接控制器
    ret= zmcaux.ZAux_FastOpen(5,textBox1.Text,1000,out g_handle);
    if (g_handle != (IntPtr)0)
    {
        MessageBox.Show("RT7链接成功!", "提示");
        timer1.Enabled = true;
    }
    else
    {
        MessageBox.Show("RT7链接失败"+"错误代码"+ ret);
    }
}

2、新建Zpj项目文件。

//新建zpj文件
private void NewZpjFile_Click(object sender, EventArgs e)    
{
    try
    {
        //创建保存文件对话框  
        SaveFileDialog saveFile = new SaveFileDialog();  
        saveFile.Filter = "ZMC Project Files(*.zpj)|*.zpj";
        //是否覆盖当前文件
        saveFile.OverwritePrompt = true;  
        //如果设为true就会使用系统默认目录
        saveFile.RestoreDirectory = true;  //还原目录
        //如果保存对话框操作成功
        if (saveFile.ShowDialog() == DialogResult.OK)
        {
            FileStream fs1 =new FileStream(saveFile.FileName, FileMode.Create, FileAccess.ReadWrite);  
            fs1.Close();
            //ZPJ文件名
            m_ZpjFileName = saveFile.FileName;
            //ZPJ文件路径
            m_ZpjFilePath = System.IO.Path.GetDirectoryName(m_ZpjFileName); 
            System.IO.File.Create(m_ZpjFileName).Close();
            Thread.Sleep(100);
            if (!System.IO.File.Exists(m_ZpjFileName))
            {
                MessageBox.Show("文件不存在");
            }
            //初始化ZPJ文件信息
            Czpj();
        }                       
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}
//初始化ZPJ文件信息_通过Ini文件记录
 public void Czpj()
{
    string LpAppname, Lpkeynum, Lpdata;
    LpAppname = "Controller";
    Lpkeynum = "TypeName ";
    //写控制器信息,初始化ZPJ文件信息          
    Thread.Sleep(200);
    var MyIni = new IniFile(@m_ZpjFileName);
    MyIni.Write(Lpkeynum, "", LpAppname);
    MyIni.Write("IfUpload", "0", LpAppname);
    MyIni.Write("UserVersion", "1.0", LpAppname);
    Lpdata = num.ToString(); //
    MyIni.Write("Files",Lpdata, LpAppname);
    MyIni.Write("Breaks", "0", LpAppname);
    MyIni.Write("Watches", "0", LpAppname);
    MyIni.Write("PicPack", "0", LpAppname);
    MyIni.Write("BREAKMODE", "1", LpAppname);
    m_ZpjOPenFlag = true;
}

3、添加Bas文件到Zpj项目里面。

//添加bas文件
private void AddBas_Click(object sender, EventArgs e)
{
    if (!m_ZpjOPenFlag) 
    {
        MessageBox.Show("先新建/打开ZPJ项目!");
        return;
    }
    //创建打开文件对话框
    OpenFileDialog ofd2 = new OpenFileDialog();
    ofd2.Filter = "ZMC Basic Files (*.bas)|*.bas";
    ofd2.RestoreDirectory = true;
    //如果文件选择成功
    if (ofd2.ShowDialog() == DialogResult.OK)
    {
        string fullname = ofd2.FileName;
        m_ZpjFilePath = System.IO.Path.GetDirectoryName(fullname); //路径
        m_SubFileName = System.IO.Path.GetFileName(fullname);  //名称
        m_ZpjFile_Info[num].pFileName = m_SubFileName;
        m_ZpjFile_Info[num].nAutoTask = -1;
        m_ZpjFile_Info[num].nFileType= 1;    //bas的文件类型是1
        num++;
         //通过Ini文件来记录Zpj项目文件信息 
        SaveZpj();
        //在控件上显示出来项目文件信息
        ShowFileList();
    }
}
//保存ZPJ文件
public void SaveZpj()
{
    //打开ZPJ的ini文件
    string IniFileName = m_ZpjFilePath + "\\" + m_ZpjFileName;
    var MyIni = new IniFile(IniFileName);
    string LpAppname, Lpkeynum, Lpdata;
    LpAppname = "Controller";
    Lpkeynum = "TypeName ";
    String iFileName = "";
    MyIni.Write("Files", num.ToString(), LpAppname);
    //写FileList信息
    LpAppname = "FileList";
    //遍历ZPJ里面的文件情况
    int i=0;
    for (i = 0; i < num; i++)
    {
        if (m_ZpjFile_Info[i].pFileName == "")
        {
            Lpdata = "空文件!" + m_ZpjFile_Info[i].nAutoTask.ToString();
        }
        //子文件名带路径
        iFileName = m_ZpjFilePath + "\\" + m_ZpjFile_Info[i].pFileName;
        if (!System.IO.File.Exists(iFileName))
        {
            Lpdata = "文件不存在!" + m_ZpjFile_Info[i].pFileName;
            MessageBox.Show(Lpdata);
        }
        //更新子文件ID
        Lpkeynum = "File" + (i + 1);
        Lpdata = m_ZpjFile_Info[i].pFileName;
        MyIni.Write(Lpkeynum, Lpdata, LpAppname);
        //更新子文件类型
        Lpkeynum = "FileType" + (i + 1);
        Lpdata = m_ZpjFile_Info[i].nFileType.ToString();
        MyIni.Write(Lpkeynum, Lpdata, LpAppname);
        //更新子文件自动运行号
        Lpkeynum = "AutoRun" + (i + 1);
        Lpdata = m_ZpjFile_Info[i].nAutoTask.ToString();
        MyIni.Write(Lpkeynum, Lpdata, LpAppname);            
    }
    //删除多余的键
    Lpkeynum = "File" + (num+1);
    MyIni.DeleteKey(Lpkeynum, LpAppname);
    Lpkeynum = "FileType" + (num + 1);
    MyIni.DeleteKey(Lpkeynum, LpAppname);
    Lpkeynum = "AutoRun" + (num + 1);
    MyIni.DeleteKey(Lpkeynum, LpAppname);
    //写OpenList信息
    LpAppname = "OpenList";  
    m_ZpjOPenFlag = true;
}

4、添加Zml文件到Zpj项目里面。

//添加zml文件
private void AddZml_Click(object sender, EventArgs e)
{
    if (!m_ZpjOPenFlag)
    {
        MessageBox.Show("先新建/打开ZPJ项目!");
        return;
    }
    OpenFileDialog ofd2 = new OpenFileDialog();
    ofd2.Filter = "ZMC ZML Files (*.zml)|*.zml";
    ofd2.RestoreDirectory = true;
    if (ofd2.ShowDialog() == DialogResult.OK)
    {
        string fullname = ofd2.FileName;
        m_ZpjFilePath = System.IO.Path.GetDirectoryName(fullname); //路径
        m_SubFileName = System.IO.Path.GetFileName(fullname);  //名称
        m_ZpjFile_Info[num].pFileName = m_SubFileName;
        m_ZpjFile_Info[num].nAutoTask = -1;
        m_ZpjFile_Info[num].nFileType = 19;//ZML文件的文件类型是19
        num++;
        //通过Ini文件来记录Zpj项目文件信息 
        SaveZpj();
        //在控件上显示出来项目文件信息
        ShowFileList();
    }
}

5、将ZPJ文件下载到控制器的ROM里面进行掉电保存。

//下载到rom
private void button9_Click(object sender, EventArgs e)
{
    if (!m_ZpjOPenFlag)
    {
        MessageBox.Show("先新建/打开ZPJ项目!");
        return;
    }
    if (g_handle != (IntPtr)0)
    {
        ShowFileListSave();
        SaveZpj();
        String ZpjFileName = m_ZpjFilePath + "\\" + m_ZpjFileName;
        String m_ZarFileName = m_ZpjFilePath + "\\" + "ZmcZpj.Zar";
        //将ZPJ项目下载到控制器的ROM里面
        zmcaux.ZAux_ZpjDown(g_handle, ZpjFileName, m_ZarFileName, null, 0, 1);
    }
    else
    {
        MessageBox.Show("控制器未连接");
    }
}

6、通过RTSys软件监控Zpj文件下载后的执行情况。

在这里插入图片描述

XML转换工具使用教学:

项目工程下载与XML配置文件下载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/343453.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Mysql学习笔记系列(一)

本次mysql系列不会讲解具体的查询语句&#xff0c;而是放在mysql的一些性能优化和一些特性上&#xff0c;是学习笔记&#xff0c;供大家参考补充。 慢查询 MySQL的慢查询&#xff0c;全名是慢查询日志&#xff0c;是MySQL提供的一种日志记录&#xff0c;用来记录在MySQL中响应…

Java下载FTP服务器上的资源,附带FTP工具类

通过xftp可以看到目标服务器上面的资源如下&#xff1a; 第一步&#xff1a;导入ftp依赖&#xff1a; <dependency><groupId>commons-net</groupId><artifactId>commons-net</artifactId><version>3.7</version> <!-- 使用最新…

Portainer Docker容器可视化管理平台实践

Portainer Docker容器可视化管理平台实践 引安装登录Remote ENV 实践 引 平常用docker命令操作比较多&#xff0c;找了一款docker可视化工具&#xff0c;方便快速预览和批量操作&#xff0c;不想一行一行敲的时候&#xff0c;可以偷偷懒。Portainer试用了一下&#xff0c;安装…

Hbas简介:数据模型和概念、物理视图

文章目录 说明零 BigTable一 Hbase简介二 HBase 访问接口简介三 行式&列式存储四 HBase 数据模型4.1 HBase 列族数据模型4.2 数据模型的相关概念4.3 数据坐标 五 概念&物理视图 说明 本文参考自林子雨老师的大数据技术原理与应用(第三版)教材内容&#xff0c;仅供学习…

特斯联携手华为发布联合解决方案,助力京津冀千行百业智能升级

近日&#xff0c;特斯联受邀出席了由廊坊市人民政府主办&#xff0c;廊坊经济技术开发区管委会联合华为技术有限公司协办的河北人工智能计算中心上线仪式暨新一代信息技术高端论坛&#xff0c;在论坛上&#xff0c;华为携手特斯联等伙伴共同发布了河北人工智能计算中心联合解决…

Git--基本操作介绍(2)

Git 常用的是以下 6 个命令&#xff1a;git clone、git push、git add 、git commit、git checkout、git pull. 说明&#xff1a; workspace&#xff1a;工作区staging area&#xff1a;暂存区/缓存区local repository&#xff1a;版本库或本地仓库remote repository&#xf…

VS2019查看文件编码格式

文件->高级保存选项 在这里可以看见现在的编码格式也可以修改编码格式 如果没有高级保存选项的话可以参考这篇博客进行设置

人大金仓数据库授权文件过期解决

一台用于测试的人大金仓数据库访问失败。 登录后发现服务停了。 使用命令行启动&#xff0c;提示服务过期。 查网上资料&#xff0c;说替换原有文件可以解决。 于是去官网下载一个新的&#xff0c;替换掉原来的授权文件。 再次启动数据库&#xff0c;还是提示授权文件过期。…

leetcode:最接近的三数之和---(双指针,排序,数组)

题目&#xff1a; 给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数&#xff0c;使它们的和与 target 最接近。 返回这三个数的和。 假定每组输入只存在恰好一个解。 示例&#xff1a; 示例 1&#xff1a; 输入&#xff1a;nums [-1…

第一堂复试

1.数据结构的基本概念 数据元素 相当于一个类 数据对象是数据元素的集合 数据项&#xff1a;具体的属性 2.数据结构三要素 1.一般线性表相当于数组&#xff0c;2.栈先进后出&#xff0c;3.队列先进先出 非线性结构一般是一对多 线性结构一般是一对一 3.数据的存储结构 4.算…

通过curl访问k8s集群获取证书或token的方式

K8S安全控制框架主要由下面3个阶段进行控制&#xff0c;每一个阶段都支持插件方式&#xff0c;通过API Server配置来启用插件。 1. Authentication&#xff08;认证&#xff09; 2. Authorization&#xff08;授权&#xff09; 3. Admission Control&#xff08;准入控制&#…

解决router重复push报错

vue-router重复push报错解决 一、报错情况二、解决1、重写push方法2、代码解释&#xff08;来自讯飞星火AI&#xff09; 一、报错情况 情况复现&#xff1a;使用router跳转时&#xff0c;router会有一个历史记录栈&#xff0c;当新的push元素和上一次最后push的元素一致&#…

对于超低延迟SSD,IO调度器已经过时了吗?-part2

为了进行这项研究&#xff0c;他们设计了一套严谨的实验方法论&#xff0c;包括在配备了高速Intel Optane P4801X Series NVMe SSD的服务器上执行一系列微观和宏观基准测试&#xff0c;同时监测系统能耗情况。这些测试涵盖了多种工作负载场景&#xff0c;从单一进程提交大量请求…

php基础学习之数据类型

php数据类型的基本概念 数据类型&#xff1a;data type&#xff0c;在PHP中指的是数据本身的类型&#xff0c;而不是变量的类型。 PHP 是一种弱类型语言&#xff0c;变量本身没有数据类型。 把变量类比成一个杯子&#xff08;容器&#xff09;&#xff0c;杯子可以装雪碧、可…

E - Souvenir(图论典型例题)

思路&#xff1a;对于有很多询问的题&#xff0c;一般都是先初始化。我们求出每个点到其他点的最短路径以及相同路径下最大的价值和即可。 代码&#xff1a; #include <bits/stdc.h> #define pb push_back #define a first #define b second using namespace std; type…

C++面试:跳表

目录 跳表介绍 跳表的特点&#xff1a; 跳表的应用场景&#xff1a; C 代码示例&#xff1a; 跳表的特性 跳表示例 总结 跳表&#xff08;Skip List&#xff09;是一种支持快速搜索、插入和删除的数据结构&#xff0c;具有相对简单的实现和较高的查询性能。下面是跳表…

排序(插入排序)

现在&#xff0c;我们学习了之前数据结构的部分内容&#xff0c;即将进入一个重要的领域&#xff1a;排序&#xff0c;这是一个看起来简单&#xff0c;但是想要理清其中逻辑并不简单的内容&#xff0c;让我们一起加油把&#xff01; 排序的概念及其运用 排序的概念 排序&…

激光雷达行业梳理1-概述、市场、技术路线

激光雷达作为现代精确测距和感知技术的关键组成部分&#xff0c;在近几年里取得了令人瞩目的发展。作为自动驾驶感知层面的重要一环&#xff0c;相较摄像头、毫米波雷达等其他传感器具有“ 精准、快速、高效作业”的巨大优势&#xff0c;已成为自动驾驶的主传感器之一&#xff…

CVHub|AI标注神器 X-AnyLabeling-v2.3.0 发布!支持YOLOv8旋转目标检测、EdgeSAM、RTMO等热门模型!

本文来源公众号“CVHub”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;AI标注神器 X-AnyLabeling-v2.3.0 发布&#xff01;支持YOLOv8旋转目标检测、EdgeSAM、RTMO等热门模型&#xff01; 今天主要为大家详细介绍 X-AnyLabeling …

NQA测试机制—UDP Jitter测试

概念 UDP Jitter是以UDP报文为承载&#xff0c;通过记录在报文中的时间戳信息来统计时延、抖动、丢包的一种测试方法。Jitter&#xff08;抖动时间&#xff09;是指相邻两个报文的接收时间间隔减去这两个报文的发送时间间隔。 UDP Jitter测试的过程如下&#xff1a; 1. 源端&a…