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
英文地址,請注明出處:http://en.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;如需要該系列的工程…