EtherCAT IGH别名(Alias)

EtherCAT 中的 Alias 是一个 16 位的数值,用于在拓扑结构中唯一标识从站(除 Position 外的辅助定位方式)

IGH查看别名

“0:0”, 第一个0是别名(alias),后面是位置(position)

sudo ethercat slave -p 0
0  0:0  PREOP  +  SV660_1Axis_00916

设置别名

sudo ethercat alias -p 0 0x1001
sudo ethercat slave -p 0
0  4097:0  PREOP  +  SV660_1Axis_00916

别名设置成功之后如何以别名去访问EtherCAT从站, 在之前的文章中,都是使用-p命令,而现在可以使用-a来访问。

sudo ethercat cstruct -a 4097
/* Master 0, Slave 0, "InoSV660N"* Vendor ID:       0x00100000* Product code:    0x000c010d* Revision number: 0x00010000*/ec_pdo_entry_info_t slave_0_pdo_entries[] = {{0x6040, 0x00, 16},{0x607a, 0x00, 32},{0x60b8, 0x00, 16},{0x60fe, 0x01, 32},{0x603f, 0x00, 16},{0x6041, 0x00, 16},{0x6064, 0x00, 32},{0x6077, 0x00, 16},{0x60f4, 0x00, 32},{0x60b9, 0x00, 16},{0x60ba, 0x00, 32},{0x60bc, 0x00, 32},{0x60fd, 0x00, 32},
};ec_pdo_info_t slave_0_pdos[] = {{0x1701, 4, slave_0_pdo_entries + 0},{0x1b01, 9, slave_0_pdo_entries + 4},
};ec_sync_info_t slave_0_syncs[] = {{0, EC_DIR_OUTPUT, 0, NULL, EC_WD_DISABLE},{1, EC_DIR_INPUT, 0, NULL, EC_WD_DISABLE},{2, EC_DIR_OUTPUT, 1, slave_0_pdos + 0, EC_WD_ENABLE},{3, EC_DIR_INPUT, 1, slave_0_pdos + 1, EC_WD_DISABLE},{0xff}
};

IGH编程如何设置别名

在IGH源码中找到CommandAlias.cpp

/** Writes the Secondary slave address (alias) to the slave's SII.*/
void CommandAlias::writeSlaveAlias(MasterDevice &m,const ec_ioctl_slave_t &slave,uint16_t alias)
{ec_ioctl_slave_sii_t data;stringstream err;uint8_t crc;if (slave.sii_nwords < 8) {err << "Current SII contents are too small to set an alias "<< "(" << slave.sii_nwords << " words)!";throwCommandException(err);}// read first 8 SII wordsdata.slave_position = slave.position;data.offset = 0;data.nwords = 8;data.words = new uint16_t[data.nwords];try {m.readSii(&data);} catch (MasterDeviceException &e) {delete [] data.words;err << "Failed to read SII: " << e.what();throwCommandException(err);}// write new alias address in word 4data.words[4] = cpu_to_le16(alias);// calculate checksum over words 0 to 6crc = calcSiiCrc((const uint8_t *) data.words, 14);// write new checksum into first byte of word 7*(uint8_t *) (data.words + 7) = crc;// write first 8 words with new alias and checksumtry {m.writeSii(&data);} catch (MasterDeviceException &e) {delete [] data.words;err << "Failed to read SII: " << e.what();throwCommandException(err);}delete [] data.words;
}

首先,函数会检查目标从站的 SII(Slave Information Interface)数据区长度是否足够(至少8个word),如果不足,则抛出异常,防止后续操作越界。

接着,函数准备一个 ec_ioctl_slave_sii_t 结构体,设置要读取的从站位置、偏移量(从0开始)、读取长度(8个word),并为数据分配内存。通过 m.readSii(&data) 读取从站SII的前8个word,如果读取失败,会释放内存并抛出异常。

读取成功后,代码将新的别名地址写入到第4个word(data.words[4]),并使用 cpu_to_le16 保证字节序正确。然后,调用 calcSiiCrc 计算前7个word(共14字节)的校验和(CRC),并将结果写入第7个word的第一个字节,以保证SII数据的完整性。

最后,函数通过 m.writeSii(&data) 将修改后的8个word写回从站SII。如果写入失败,同样会释放内存并抛出异常。无论成功或失败,最后都确保释放分配的内存,防止内存泄漏。

注意点:

  • 该方法对SII数据的操作非常底层,需确保数据结构和协议细节正确无误。
  • 校验和的计算和写入是保证SII数据有效性的关键步骤。
  • 异常处理和内存释放做得较为严谨,避免资源泄漏和未定义行为。

地址空间概要

从站设备的配址由已设置的站地址或站别名地址的节点地址进行,配址方式为自动递增配址。

位置地址/自动递增地址

数据报保持为已配址从站位置地址的负值,各从站地址逐渐递增。
读取到地址“0”的从站将被配址,并接收数据。
位置地址主要用于在启动EtherCAT系统时通过扫描现场总线把握系统的连接状况

节点地址/站地址设置及站别名设置

站地址在启动时由主站进行分配,不能通过EtherCAT从站进行更改。站别名的参数将保存在ESI EEPROM中,可
以通过EtherCAT从站进行变更。设置站别名必须经过主站许可。只有站地址或站别名与节点地址相符时,才会
开始执行相应的命令动作。

在这里插入图片描述

答疑

站别名地址设置是0x0012~0x0013, 为什么data.offset = 0, 这是写到别名的地方吗?

EtherCAT SII(Slave Information Interface)中,站别名地址(Alias Address)确实位于 SII 的物理地址 0x0012~0x0013(以字节为单位),也就是 SII 的第4个word(每个word为2字节,0x0012/2=0x0009,第4个word的偏移是4)。
在代码中:

data.offset = 0;
data.nwords = 8;

这表示一次性读取SII的前8个word(16字节,地址0x0000~0x000F),而不是只读/写别名地址本身。
随后,代码通过:

data.words[4] = cpu_to_le16(alias);

将别名写入第4个word(即SII的0x0008~0x0009字节),这正是SII规范中别名地址的位置。

ESC寄存器配置区

字0-7,由ESC在上电或复位后自动读取后写入相应寄存器,并检查校验和。
在这里插入图片描述

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

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

相关文章

墨者:通过sqlmap解决SQL手工注入漏洞测试(PostgreSQL数据库)

使用Kali Linux中的sqlmap工具进行PostgreSQL手工注入漏洞测试实战 前言 SQL注入是Web安全中最常见的漏洞之一。本文将演示如何使用Kali Linux中的sqlmap工具对PostgreSQL数据库进行手工注入测试&#xff0c;通过实战案例帮助安全研究人员更好地理解漏洞原理和测试方法。 测…

Linux笔记5——常用命令-4

帮助命令man 命令&#xff08;查看命令的帮助&#xff09;注&#xff1a;C7版本中有中文解释例&#xff1a;man lsman -f 命令 #查看命令有哪些级别的帮助&#xff0c;使用前要执行mandb生成man缓存信息&#xff0c;否则命令执行不成功man级别1.查看命令的帮助3.查看函数…

优化Linux高并发:文件描述符与端口范围的协同调优

既然已经通过调整nofile&#xff08;最大文件描述符数量&#xff09;来支持高并发&#xff0c;为什么还需要调整net.ipv4.ip_local_port_range&#xff08;本地端口范围&#xff09;&#xff1f;这两个参数看似都与高并发有关&#xff0c;但它们的作用和影响范围不同。 1. 文件…

.NET-键控服务依赖注入

有时候我们在服务注册的时候会遇到这样一个场景&#xff0c;我们的同一个接口&#xff0c;有着多个实现&#xff0c;且我们还要同时使用这些实现的时候&#xff0c;这个时候该怎么办&#xff1f;我们可以使用键控服务依赖注入 键控服务依赖注入&#xff08;Keyed Dependency In…

VTK交互——ImageClip

概要 这段代码https://examples.vtk.org/site/Cxx/Interaction/ImageClip/实现了一个交互式图像裁剪工具,使用VTK库创建了一个双窗口界面,左侧显示原始图像,右侧显示裁剪后的图像。用户可以通过拖动边框小部件在左侧图像上选择裁剪区域,右侧窗口会实时显示裁剪结果。 代…

【vue vapor jsx 未雨绸缪】

随着vue3.6.0 alpha的发布&#xff0c;vapor mode进入正式版本只是时间上的问题&#xff0c;可以预见的是各个组件库都将积极适配vapor&#xff0c;这篇文章主要侧重vue中使用jsx而非SFC&#xff0c;所以不涉及template相关。目前vue官方也是提供了vue-jsx-vapor这个仓库&#…

go语言数据结构与排序算法

package mainimport "fmt"func main() {Bubble_Sort()Select_Sort()Insert_Sort()Shell_Sort()Heap_Sort()Merge_Sort()Quick_Sort() }一、1、冒泡排序 // 冒泡排序 func Bubble_Sort() {str : []int{9, 1, 5, 8, 3, 7, 4, 6, 2}// 正向冒泡for i : 0; i < len(st…

Petalinux生成文件的关系

1. 生成文件概述BOOT.BIN是引导程序&#xff0c;包括了 u-boot.elf是build u-boot生成的zynq_fsbl.elf&#xff08;引导PS和PL的启动&#xff09;elf文件是和启动引导相关的文件image.ub是镜像文件roofs.cpio.gz用来构建根文件系统

MongoDB的操作

在 Java 中操作 MongoDB 的 增删改查&#xff08;CRUD&#xff09; 主要有两种方式&#xff1a; Spring Data MongoDB&#xff08;推荐&#xff0c;类似 JPA 风格&#xff09;MongoDB Java Driver&#xff08;原生 API&#xff0c;更灵活&#xff09;1. Spring Data MongoDB 方…

getConnectionOwnerUid

在Android系统中&#xff0c;为了进行网络权限控制、流量统计等&#xff0c;需要将网络连接&#xff08;如Socket&#xff09;与发起该连接的应用UID关联起来。这种关联通常在内核中建立&#xff0c;并在用户空间通过一些接口进行查询。 1. 内核中的实现基础 Linux内核中&#…

开源 Arkts 鸿蒙应用 开发(十)通讯--Http数据传输

文章的目的为了记录使用Arkts 进行Harmony app 开发学习的经历。本职为嵌入式软件开发&#xff0c;公司安排开发app&#xff0c;临时学习&#xff0c;完成app的开发。开发流程和要点有些记忆模糊&#xff0c;赶紧记录&#xff0c;防止忘记。 相关链接&#xff1a; 开源 Arkts …

net8.0一键创建支持(RabbitMQ)

Necore项目生成器 - 在线创建Necore模板项目 | 一键下载 RabbitMQController.cs using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using RabbitMQ.Client; using RabbitMQ.Client.Events; using System.Text; using System.Threading.Tasks; using UnT.Tem…

Rust 泛型与特性

Rust 泛型与特性 引言 Rust 语言以其安全性和高效性在编程语言中独树一帜。Rust 的泛型和特性是其核心特性之一,它们使得开发者能够编写更加通用、灵活且安全的代码。本文将深入探讨 Rust 中的泛型和特性,包括其概念、用法以及在实际开发中的应用。 泛型简介 概念 泛型是…

LangChain学习——结构化输出和数据解析

LangChain 本指南全面介绍LangChain中结构化输出生成和数据解析的核心功能&#xff0c;包括Pydantic BaseModel构造、各种输出解析器的使用&#xff0c;以及高级错误处理机制。 详细测试样例和代码可参考如下两个链接&#xff1a; test_output_parserstest_pydantic_base_mo…

基于华为ENSP的BGP的状态机深入浅出

本篇技术博文摘要 &#x1f31f; 本文章主要探讨BGP状态机如何控制BGP连接的建立与维护&#xff0c;以及BGP协议在运行过程中如何交换路由信息并确保网络的稳定性 引言 &#x1f4d8; 在这个快速发展的技术时代&#xff0c;与时俱进是每个IT人的必修课。我是肾透侧视攻城狮&…

Android 15中的16KB大页有何优势?

deepseek回答&#xff1a; Android 15引入的16KB大内存页是系统性能优化的关键变革&#xff0c;其核心优势体现在以下方面&#xff1a; ⚡ 一、性能全面提升 系统整体加速 配置16KB页面的设备整体性能提升5%-10%&#xff0c;通过减少内存管理开销释放更多资源用于应用运行。…

Gis数据的A*算法规划航线

1.1 用到的技术栈geotools JTSJgrapht1.2 实现思路// 定义栅格网格参数private static final double CELL_SIZE_DEGREES 0.005;private static int gridWidth 0;//格子高度 index 1private static int gridHeight 0;//格子宽度// 1. 读取GeoJSON文件File geoJsonFile new …

Spring Boot 默认使用 CGLIB,但CGLIB 无法代理 final 类或 final 方法

那么当这两件事冲突时&#xff0c;Spring Boot 是怎么“解决”的呢&#xff1f;答案是&#xff1a;它不解决&#xff0c;也无法解决。当这种情况发生时&#xff0c;你的应用程序会直接启动失败。这不是 Spring Boot 的疏忽&#xff0c;而是由 CGLIB 的底层原理和 Java 语言的规…

cuda编程笔记(10)--memory access 优化

全局内存访问优化&#xff08;Coalesced Access&#xff09; 什么是 Coalesced Access&#xff1f; 定义&#xff1a;一个 warp&#xff08;32 个线程&#xff09;在同一指令中访问全局内存时&#xff0c;如果这些访问请求可以合并成尽可能少的内存事务&#xff08;通常是 32…

闲庭信步使用图像验证平台加速FPGA的开发:第三十一课——车牌识别的FPGA实现(3)车牌字符分割预处理

&#xff08;本系列只需要modelsim即可完成数字图像的处理&#xff0c;每个工程都搭建了全自动化的仿真环境&#xff0c;只需要双击top_tb.bat文件就可以完成整个的仿真&#xff0c;大大降低了初学者的门槛&#xff01;&#xff01;&#xff01;&#xff01;如需要该系列的工程…