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

news2024/9/20 0:50:18

硬件介绍

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文件放入bin\debug文件夹中。

在这里插入图片描述

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与编码器读写应用,就分享到这里。

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Qt 多语言

记录Qt多语言的实现过程 目录 1.项目配置文件.pro配置 2.程序中的字符串用tr()封装 3.生成翻译文件 4.使用Qt语言家修改翻译文件 4.1使用Qt语言家打开 4.2 .更改文件配置 5. 生成qm文件 6.代码执行切换语言 6.1入口处 6.2 事件执行 0.效果 1.项目配置文件.pro配置 T…

观测云对接 Fluentd 采集业务日志最佳实践

概述 Fluentd 是一个开源数据收集器&#xff0c;专为简化日志管理和使日志数据更加易于访问、使用而设计。作为一个高度可扩展的工具&#xff0c;它能够统一数据收集和消费过程&#xff0c;使得构建实时分析的日志系统变得更加高效。 观测云目前已集成 Fluentd &#xff0c;可…

十、Java集合 ★ ✔(模块18-20)【泛型、通配符、List、Set、TreeSet、自然排序和比较器排序、Collections、可变参数、Map】

day05 泛型,数据结构,List,Set 今日目标 泛型使用 数据结构 List Set 1 泛型 1.1 泛型的介绍 ★ 泛型是一种类型参数&#xff0c;专门用来保存类型用的 最早接触泛型是在ArrayList&#xff0c;这个E就是所谓的泛型了。使用ArrayList时&#xff0c;只要给E指定某一个类型…

mybatisPlus和mybatis的版本冲突问题、若依换成MP、解决git无法推送、使用若依框架的swagger、以后再遇到团队项目应该怎么做。

20240716 一. mybatisPlus和mybatis的版本冲突问题1. 使用前的准备2. 我遇到了一个很严重的问题。3. 解决问题&#xff0c;好吧也没解决&#xff0c;发现问题&#xff01;&#xff01; 二、该死的git&#xff01;&#xff01;&#xff01;&#xff01;1. 解决无法在idea中使用g…

2024年公路水运工程施工企业安全生产管理人员证模拟考试题库及公路水运工程施工企业安全生产管理人员理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年公路水运工程施工企业安全生产管理人员证模拟考试题库及公路水运工程施工企业安全生产管理人员理论考试试题是由安全生产模拟考试一点通提供&#xff0c;公路水运工程施工企业安全生产管理人员证模拟考试题库是…

大数据平台之YARN

Hadoop YARN&#xff08;Yet Another Resource Negotiator&#xff09;是Hadoop 2.x引入的一个通用资源管理和作业调度框架&#xff0c;它将资源管理和作业调度/监控分离开来&#xff0c;从而提升了集群的资源利用率和可扩展性。YARN是Hadoop生态系统的核心组件之一&#xff0c…

Go 1.19.4 函数-Day 08

1. 函数概念和调用原理 1.1 基本介绍 函数是基本的代码块&#xff0c;用于执行一个任务。 Go 语言最少有个 main() 函数。 你可以通过函数来划分不同功能&#xff0c;逻辑上每个函数执行的是指定的任务。 函数声明告诉了编译器函数的名称&#xff0c;返回类型&#xff0c;和参…

持续集成06--Jenkins构建触发器

前言 在持续集成&#xff08;CI&#xff09;的实践中&#xff0c;构建触发器是自动化流程中不可或缺的一环。它决定了何时启动构建过程&#xff0c;从而确保代码变更能够及时地得到验证和反馈。Jenkins&#xff0c;作为业界领先的CI/CD工具&#xff0c;提供了多种构建触发器选项…

【C++编程】双端数组 deque 容器基本操作

&#x1f525; 特点&#xff1a;deque 头插、头删速度比 vector 快 deque 是一个双向队列&#xff08;double-ended queue&#xff09;&#xff0c;可以在队列的两端进行元素的插入和删除操作。 deque 涵盖了 queue&#xff08;队列&#xff09;、stack&#xff08;堆栈&#x…

一五六、Node+Vue 使用七牛上传图片,并配置个人域名

1. 七牛云ak/sk获取 点击注册&#x1f517;开通七牛开发者帐号如果已有账号&#xff0c;直接登录七牛开发者后台&#xff0c;点击这里&#x1f517;查看 Access Key 和 Secret Key 2. Node.js获取七牛token 安装qiniu npm install qiniu创建空间 Node获取token const qi…

在SpringCloud中如何轻松实现微服务间的通信

在Spring Cloud中&#xff0c;实现微服务间的通信非常简单。Spring Cloud提供了多种方式来进行微服务之间的通信&#xff0c;包括使用RestTemplate、Feign、Ribbon、Eureka等组件。下面我将详细介绍这些方式的使用方法。 使用RestTemplate进行通信&#xff1a; RestTemplate是S…

ECCV2024|GLAD:利用全局和局部自适应扩散模型实现更好的无监督异常检测重建

GLAD&#xff1a;利用全局和局部自适应扩散模型实现更好的无监督异常检测重建 论文标题&#xff1a;GLAD: Towards Better Reconstruction with Global and Local Adaptive Diffusion Models for Unsupervised Anomaly Detection 论文地址&#xff1a;https://arxiv.org/abs/2…

字符串类中的常用方法

1 string对象的创建 静态创建 String s1  "abc";  String s2  "abc";  动态创建 String s3  new String("abc"); String s4  new String("abc"); 2string对象的不可变性 任何一个String对象在创建之后都不能对它的…

blender中设置物体的中心到某个顶点

方式一&#xff1a; 1&#xff0c;首先选中物体&#xff0c; 2&#xff0c;选中编辑模式&#xff0c; 3&#xff0c;选中点模式&#xff0c;并选择物体的一个顶点 4&#xff0c;鼠标点击右键---- 吸附至像素点--游标->选中项&#xff0c;这样&#xff0c;游标移动到了选中…

PulsarClient源码解析

一、Pulsar客户端简析 pulsar服务是经典的C/S架构&#xff0c;由客户端和服务端构成。服务端提供处理读写请求服务&#xff0c;客户端负责发起读写请求。pulsar将客户端按照读写分成了生产者和消费者&#xff0c;但是无论怎么分&#xff0c;它们本质上都是Pulsar客户端并有很多…

QT--控件篇四

一、对话框 在软件开发中&#xff0c;对话框&#xff08;Dialog&#xff09;是一种常见的用户界面元素&#xff0c;用于与用户进行交互和获取信息。它通常以模态或非模态的形式出现&#xff0c;模态对话框会阻止用户与应用程序的其他部分交互&#xff0c;直到对话框关闭为止&a…

快速排序(quick sort)

欢迎来到一夜看尽长安花 博客&#xff0c;您的点赞和收藏是我持续发文的动力 对于文章中出现的任何错误请大家批评指出&#xff0c;一定及时修改。有任何想要讨论的问题可联系我&#xff1a;3329759426qq.com 。发布文章的风格因专栏而异&#xff0c;均自成体系&#xff0c;不足…

nftables(9)NAT、FLOWTABLES

NAT NAT简介 我们在iptables、firewalld中都介绍过有关NAT的相关部分。那么在nftables中&#xff0c;我们继续介绍nftables中NAT的功能实现方式&#xff0c;配置方法和与前两者的区别。 我们先简单回顾一下NAT的类型和其功能&#xff1a; 这些是不同的网络地址转换&#xf…

在 Windows 上开发.NET MAUI 应用_1.安装开发环境

开发跨平台的本机 .NET Multi-platform App UI (.NET MAUI) 应用需要 Visual Studio 2022 17.8 或更高版本&#xff0c;或者具有 .NET MAUI 扩展的最新 Visual Studio Code。要开始在 Windows 上开发本机跨平台 .NET MAUI 应用&#xff0c;请按照安装步骤安装 Visual Studio 20…

leetcode94. 二叉树的中序遍历,递归法+迭代法。附带前序遍历方法

leetcode94. 二叉树的中序遍历 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3,2] 示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[] 示例 3&#xff1a; …