Ethercat系列(2)PDO动态映射设置过程

news2024/9/23 7:26:39
  1. 过程数据对象PDO

PDO一般用于实时数据更新;其分为接收PDO(RxPDO)和发送PDO(TxPDO),前者的数据流方向是主站到从站,TxPDO是从站到主站。

PDO功能支持同步周期的刷新方式,也支持非周期性的更新方式。当主站选择为分布式时钟同步模式时,PDO将同步周期更新;如果选择自由运行模式,那么PDO数据的更新是非周期性的。

过程数据可以包含多个PDO映射数据对象,COE协议使用数据对象0x1C10-0x1C2F定义相应的SM通道的PDO映射对象列表,以TxPDO为例,输出通道使用SM2通道,由对象数据0x1C12定义PDO分配,如下图所示,

  1. PDO映射

通过PDO映射,可实现映射对象的实时传输。PDO映射内容的格式如下表,

表1 PDO映射内容的格式

31~16

15~8

7~0

内容

映射内容的索引

映射内容的子索引

位长(16进制)

例子

6040h

00h

10h

一款Ethercat驱动器的默认PDO映射(与XML文件一致),如下表所示,

PDO映射对象索引

PDO映射对象子索引

映射内容

映射内容名称

RXPDO1

1600h

01h

60400010

控制字

02h

607a0020

目标位置

03h

60b80020

探针功能

RXPDO2

1601h

01h

60400010

控制字

02h

60ff0020

目标速度

03h

60b20010

转矩前馈

RXPDO3

1602h

01h

60400010

控制字

02h

60710010

目标转矩

03h

60870020

转矩变量率

RXPDO4

1603h

01h

60400010

控制字

02h

60980008

原点方法

03h

60990120

原点速度(快)

04h

60990220

原点速度(慢)

05h

609a0020

原点加减速

06h

607c0020

原点偏移

07h

60600008

操作模式

TXPDO1

1A00h

01h

603f0000

错误码

02h

60410000

状态字

03h

60610000

显示操作模式

04h

60640000

实际位置

05h

60b90020

探针状态

06h

60ba0020

探针1上升沿位置

07h

60fd0020

数字输入

TXPDO2

1A01h

暂无默认映射

  1. PDO动态映射设置过程

  • 将Ethercat状态机切换到PreOP状态,此状态可以用SDO来配置PDO映射;

  • 清除PDO指定对象的PDO映射对象,即设置0x1C12-00,与0x1C13-00为0;

  • PDO映射对象无效,即对0x1600-0x1603/0x1A00-0x1A01的子索引设置为0;

  • 重新配置PDO映射内容;0x1600-01开始的是RxPDO内容,0x1A00-01开始的是TxPDO;

  • 设置PDO映射对象总数;

  • 写有效的PDO映射对象索引到PDO指定对象

  • 设置PDO指定对象的总个数,即将映射对象个数写入到1C12-00h和1C13-00h

  • 转换Ethercat状态机到安全操作以上,配置的PDO映射将有效。

下面的配置PDO映射例子代码,第一步与最后一步没有。

  1. 设置PDO映射表示例代码

static int drive_write8(uint16 slave, uint16 index, uint8 subindex, uint8 value)
{
   int wkc;
   wkc = ec_SDOwrite(slave, index, subindex, FALSE, sizeof(value), &value, EC_TIMEOUTRXM);

   return wkc;
}

static int drive_write16(uint16 slave, uint16 index, uint8 subindex, uint16 value)
{
   int wkc;

   wkc = ec_SDOwrite(slave, index, subindex, FALSE, sizeof(value), &value, EC_TIMEOUTRXM);

   return wkc;
}

static int drive_write32(uint16 slave, uint16 index, uint8 subindex, int32 value)
{
   int wkc;

   wkc = ec_SDOwrite(slave, index, subindex, FALSE, sizeof(value), &value, EC_TIMEOUTRXM);

   return wkc;
}

// 该函数用于设置PDO映射表
int drive_setup(uint16 slave)
{
   int wkc = 0;

   printf("Drive setup\n");

   wkc += drive_write16(slave, 0x1C12, 0, 0);
   wkc += drive_write16(slave, 0x1C13, 0, 0);

   wkc += drive_write16(slave, 0x1A00, 0, 0);
   wkc += drive_write32(slave, 0x1A00, 1, 0x60410010); // Statusword
   wkc += drive_write32(slave, 0x1A00, 2, 0x60640020); // Position actual value
   wkc += drive_write32(slave, 0x1A00, 3, 0x606C0020); // Velocity actual value
   wkc += drive_write32(slave, 0x1A00, 4, 0x60770010); // Torque actual value
   wkc += drive_write32(slave, 0x1A00, 5, 0x60610008); // Modes of operation display
   wkc += drive_write32(slave, 0x1A00, 6, 0x230A0020); // 2nd Pos
   wkc += drive_write8(slave, 0x1A00, 0, 6);

   wkc += drive_write8(slave, 0x1600, 0, 0);
   wkc += drive_write32(slave, 0x1600, 1, 0x60400010); // Controlword
   wkc += drive_write32(slave, 0x1600, 2, 0x60710010); // Target torque
   wkc += drive_write32(slave, 0x1600, 3, 0x607A0020); // Target position
   wkc += drive_write32(slave, 0x1600, 4, 0x60FF0020); // Target velocity
   wkc += drive_write32(slave, 0x1600, 5, 0x60600008); // Modes of operation display
   wkc += drive_write32(slave, 0x1600, 6, 0x60B20010); // Torque offset
   wkc += drive_write8(slave, 0x1600, 0, 6);

   wkc += drive_write16(slave, 0x1C12, 1, 0x1600);
   wkc += drive_write8(slave, 0x1C12, 0, 1);

   wkc += drive_write16(slave, 0x1C13, 1, 0x1A00);
   wkc += drive_write8(slave, 0x1C13, 0, 1);

   strncpy(ec_slave[slave].name, "Drive", EC_MAXNAME);

   if (wkc != 22)
   {
      printf("Drive %d setup failed\nwkc: %d\n", slave, wkc);
      return -1;
   }
   else
      printf("Drive %d setup succeed.\n", slave);

   return 0;
}

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

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

相关文章

解决nacos2.1版本连接mysql8.x版本异常的问题

在测试环境部署nacos集群的时候使用的是mysql5.7版本,部署没有什么异常。但是在生产环境中我们使用的是mysql8.x版本,在启动nacos的时候各种报错。在网上看了很多解决办法花了挺长时间去排错也没有处理好问题网上最常见的两种方式修改pom文件&#xff1a…

代码随想录算法训练营第五十一天|309.最佳买卖股票时机含冷冻期 714.买卖股票的最佳时机含手续费

动态规划 一、309.最佳买卖股票时机含冷冻期 题目: 给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 。 设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票&#x…

前端经典面试500题【上】

一阶段面试题集锦 1、 rem em vw vw 百分比区别 相同点: rem,em,vw,vh,vw属于前端开发除了px单位之外的另外几种单位取值;但是具体含义存在区别 不同点: px:是像素单位&#xff0c…

Databend 开源周报 第 78 期

Databend 是一款强大的云数仓。专为弹性和高效设计。自由且开源。 即刻体验云服务:https://app.databend.com 。 What’s New 探索 Databend 本周新进展,遇到更贴近你心意的 Databend 。 Features & Improvements SQL 消除多余的 group by 标量 …

Docker查看正在运行的容器目录

起因 为了方便操作服务器,大部分都是使用宝塔面板操作的,在宝塔中我发现面板中用来管理Docker的工具使用起来非常方便,如下图: 可以看到宝塔的面板可以直接查看和从操作容器、Compose 、Compose 模板、镜像、网络、存储卷、仓库等…

2022年度总结:拒绝无效努力,实现破圈成长。

在从毕业一直到现在,我都会写一篇关于自己的从技术、商业、人情世故以及未来展望的博文,以至于归纳每个时期的自己, 走在互联网开发的边缘,不得不抽出时间鞭策自己学习新知识,未知的知识是 充满好奇的, 就好…

Centos 7 内核升级

参考 https://www.cnblogs.com/zengkefu/p/5667145.html 一、ELRepo 关于内核种类: kernel-ml 中的ml是英文【 mainline stable 】的缩写,elrepo-kernel中罗列出来的是最新的稳定主线版本。 kernel-lt 中的lt是英文【 long term support 】的缩写,elre…

分布式理论之体系结构

写在前面 分布式的体系结构目前有两种,第一种是集中式架构,也就是我们最常见到的master-slave架构,第二种是非集中式架构,也就是我们经常听到的去中心化架构,本文我们就一起来看下吧! 1:集中式…

Android开发技术——车机技术之WMS学习

/ 窗口管理 / 窗口管理核心类介绍 窗口管理使用到的 DisplayContent,WindowToken 和 WindowState。 DisplayContent 用来管理一个逻辑屏上的所有窗口,有几个屏幕就会有几个 DisplayContent。使用 displayId 来区分。 处于不同 DisplayContent 的两个…

免费好用的IPv6之远程管理路由器-OpenWrt上uhttpd的TLS(HTTPS)部署流程介绍

在免费好用的IPv6之远程管理路由器-OpenWrt上uhttpd的使用介绍_123-wqy的博客-CSDN博客_openwrt uhttpd这篇文章的最后,我们已经可以使用80、443端口从路由器内外网的IPv6地址对路由器的WEB界面进行访问。但是,考虑外网访问场景下的安全性问题&#xff0…

初级软件测试面试会问什么 这些问题你都知道吗?

在现如今这竞争十分激烈的软件测试职场中,求职者们想获得一份让自己满意且高薪的工作是十分不易的,因此,只有事先做好充分准备才能让自己通关筹码加倍。在这里,我给各位即将踏入面试征程的初级软件测试小伙伴们准备了一些关于初级…

车载网络测试 - BootLoader刷写 - 总纲

随着车载以太网技术的快速发展,智能汽车也已经走进了千家万户,OTA无线解决方案也逐渐走进了大众的视野;实际上在车载以太网未出现之前,我们车上大多数使用的升级一般都是adb、U盘等不太方便的刷写方式,并且在车上是一种…

字节青训营——架构初探学习笔记

1. 规则引擎 规则引擎是一种嵌入在应用服务中的组件,可以将灵活多变的业务决策从服务代码中分离出来。通过使用预定义的语义模块来编写业务逻辑规则。在执行时接受数据输入、解释业务规则,并做出决策。规则引擎能大大提高系统的灵活性和扩展性。 在字节…

小波神经网络的时间序列预测模型

一、小波变换 波变换主要通过伸缩和平移实现多尺度细化,突出所要处理的问题细节,有效提取局部信息。 将傅里叶变换中无限长的三角函数基换成了有限长的会衰减的小波基。 小波变换不仅可以知道信号的频率成分,还能知道各频率成分出现的时刻…

Win10蓝屏问题:SYSTEM_THREAD_EXCEPTION_NOT_HANDLED

最近一段时间,我一直出现蓝屏的情况, 以为是CPU散热不行导致的重启, 因为比较频繁所以在此记录解决这个问题, 还是一贯的风格:图文并茂。终止代码:SYSTEM_THREAD_EXCEPTION_NOT_HANDLED失败的操作&#xff…

关于灰度发布基本问题的解答及轻量化落地方案

由于工作需要,近期又恶补了一下“灰度发布”的相关知识,也和身边小伙伴探讨了轻量化实现灰度发布的落地方案。借此机会,正好将相关内容跟大家整理分享一下。 什么是灰度? 要想了解这个问题就要先明白什么是灰度。灰度从字面意思…

BGP综合实验(华为)

题目: 思路: 把路由划分在AS1,AS2,AS3之中,并使各网段之间的网络互通。明确交接端的路由的路由宣告在哪个区域,例如R1宣告在1.1.1.0 24 网段中(易于识别的网段)R1对应1.1.1.0网段。其他的路由器以此推类。利…

gma 地理空间绘图:(1)绘制简单的世界地图-1.地图绘制与细节调整

了解 gma gma 是什么? gma 是一个基于 Python 的地理、气象数据快速处理和数据分析函数包(Geographic and Meteorological Analysis,gma)。gma 网站:地理与气象分析库。 gma 的主要功能有哪些? 气候气象&a…

基于大数据的公共建筑能耗监测系统的应用探究

摘要:为了解决当前公共建筑能耗居高不下的突出问题,借助当前信息化技术手段,围绕公共建筑能耗监测系统中的大数据应用,从监测系统的总设计框架入手,分别就物联网中数据采集器设计方式、数据传输技术、数据库部署方式分…

【浪漫情人节】送你Python表白神器,祝天下有情人终成眷属

哈哈哈再过十几天就到了一年一度的情人节啦!如此浪漫的日子,小王决定用Python写一个简单的表白神器送给大家,祝天下有情人终成眷属! 目录 前言 一、Turtle小海龟 1. 基本函数 2. 漂浮爱心 二、Tkinter界面设计 1. 基本…