EtherCAT主站IGH-- 4 -- IGH之datagram_pair.h/c文件解析

EtherCAT主站IGH-- 4 -- IGH之datagram_pair.h/c文件解析

  • 0 預覽
  • 一 該文件功能
    • `datagram_pair.c` 文件功能函數預覽
  • 二 函數功能介紹
    • `datagram_pair.c` 中主要函數的作用
        • 1. `ec_datagram_pair_init`
        • 2. `ec_datagram_pair_clear`
        • 3. `ec_datagram_pair_process`
  • 三 h文件翻譯
  • 四 c文件翻譯
  • 該文檔修改記錄:
  • 總結

0 預覽

一 該文件功能

該文件定義了 EtherCAT 數據報對的方法。EtherCAT 是一種實時以太網通信標準,廣泛用于工業自動化控制系統。數據報對用于在 EtherCAT 主站和從站之間傳輸數據的成對數據報。文件中包含的數據報對方法涵蓋了初始化、清理和處理接收到的數據等操作。

datagram_pair.c 文件功能函數預覽

函數功能和用途使用場景
ec_datagram_pair_init初始化 EtherCAT 數據報對。在創建新的數據報對時調用。
ec_datagram_pair_clear清理 EtherCAT 數據報對。在數據報對不再使用時調用以釋放資源。
ec_datagram_pair_process處理接收到的數據,計算工作計數總和。在需要處理接收到的數據并計算工作計數時調用。

二 函數功能介紹

datagram_pair.c 中主要函數的作用

1. ec_datagram_pair_init
int ec_datagram_pair_init(ec_datagram_pair_t *pair, /**< Datagram pair. */ec_domain_t *domain, /**< Parent domain. */uint32_t logical_offset, /**< Logical offset. */uint8_t *data, /**< Data pointer. */size_t data_size, /**< Data size. */const unsigned int used[] /**< input/output use count. */)
{ec_device_index_t dev_idx;int ret;INIT_LIST_HEAD(&pair->list);pair->domain = domain;for (dev_idx = EC_DEVICE_MAIN;dev_idx < ec_master_num_devices(domain->master); dev_idx++) {ec_datagram_init(&pair->datagrams[dev_idx]);snprintf(pair->datagrams[dev_idx].name,EC_DATAGRAM_NAME_SIZE, "domain%u-%u-%s", domain->index,logical_offset, ec_device_names[dev_idx != 0]);pair->datagrams[dev_idx].device_index = dev_idx;}pair->expected_working_counter = 0U;for (dev_idx = EC_DEVICE_BACKUP;dev_idx < ec_master_num_devices(domain->master); dev_idx++) {/* backup datagrams have their own memory */ret = ec_datagram_prealloc(&pair->datagrams[dev_idx], data_size);if (ret) {goto out_datagrams;}}#if EC_MAX_NUM_DEVICES > 1if (!(pair->send_buffer = kmalloc(data_size, GFP_KERNEL))) {EC_MASTER_ERR(domain->master,"Failed to allocate domain send buffer!\n");ret = -ENOMEM;goto out_datagrams;}
#endif/* The ec_datagram_lxx() calls below can not fail, because either the* datagram has external memory or it is preallocated. */if (used[EC_DIR_OUTPUT] && used[EC_DIR_INPUT]) { // inputs and outputsec_datagram_lrw_ext(&pair->datagrams[EC_DEVICE_MAIN],logical_offset, data_size, data);for (dev_idx = EC_DEVICE_BACKUP;dev_idx < ec_master_num_devices(domain->master); dev_idx++) {ec_datagram_lrw(&pair->datagrams[dev_idx],logical_offset, data_size);}// If LRW is used, output FMMUs increment the working counter by 2,// while input FMMUs increment it by 1.pair->expected_working_counter =used[EC_DIR_OUTPUT] * 2 + used[EC_DIR_INPUT];} else if (used[EC_DIR_OUTPUT]) { // outputs onlyec_datagram_lwr_ext(&pair->datagrams[EC_DEVICE_MAIN],logical_offset, data_size, data);for (dev_idx = EC_DEVICE_BACKUP;dev_idx < ec_master_num_devices(domain->master); dev_idx++) {ec_datagram_lwr(&pair->datagrams[dev_idx],logical_offset, data_size);}pair->expected_working_counter = used[EC_DIR_OUTPUT];} else { // inputs only (or nothing)ec_datagram_lrd_ext(&pair->datagrams[EC_DEVICE_MAIN],logical_offset, data_size, data);for (dev_idx = EC_DEVICE_BACKUP;dev_idx < ec_master_num_devices(domain->master); dev_idx++) {ec_datagram_lrd(&pair->datagrams[dev_idx], logical_offset,data_size);}pair->expected_working_counter = used[EC_DIR_INPUT];}for (dev_idx = EC_DEVICE_MAIN;dev_idx < ec_master_num_devices(domain->master); dev_idx++) {ec_datagram_zero(&pair->datagrams[dev_idx]);}return 0;out_datagrams:for (dev_idx = EC_DEVICE_MAIN;dev_idx < ec_master_num_devices(domain->master); dev_idx++) {ec_datagram_clear(&pair->datagrams[dev_idx]);}return ret;
}
  • 功能和用途:初始化 EtherCAT 數據報對。
  • 使用場景:在創建新的數據報對時調用。
2. ec_datagram_pair_clear
void ec_datagram_pair_clear(ec_datagram_pair_t *pair /**< Datagram pair. */)
{unsigned int dev_idx;for (dev_idx = EC_DEVICE_MAIN;dev_idx < ec_master_num_devices(pair->domain->master);dev_idx++) {ec_datagram_clear(&pair->datagrams[dev_idx]);}#if EC_MAX_NUM_DEVICES > 1if (pair->send_buffer) {kfree(pair->send_buffer);}
#endif
}
  • 功能和用途:清理 EtherCAT 數據報對。
  • 使用場景:在數據報對不再使用時調用以釋放資源。
3. ec_datagram_pair_process
uint16_t ec_datagram_pair_process(ec_datagram_pair_t *pair, /**< Datagram pair. */uint16_t wc_sum[] /**< Working counter sums. */)
{unsigned int dev_idx;uint16_t pair_wc = 0;for (dev_idx = 0; dev_idx < ec_master_num_devices(pair->domain->master);dev_idx++) {ec_datagram_t *datagram = &pair->datagrams[dev_idx];#ifdef EC_RT_SYSLOGec_datagram_output_stats(datagram);
#endifif (datagram->state == EC_DATAGRAM_RECEIVED) {pair_wc += datagram->working_counter;wc_sum[dev_idx] += datagram->working_counter;}}return pair_wc;
}
  • 功能和用途:處理接收到的數據,計算工作計數總和。
  • 使用場景:在需要處理接收到的數據并計算工作計數時調用。

三 h文件翻譯

/******************************************************************************\**  $Id$**  版權所有 (C) 2006-2012 Florian Pose, Ingenieurgemeinschaft IgH**  本文件是 IgH EtherCAT 主站的一部分。**  IgH EtherCAT 主站是免費軟件;您可以根據自由軟件基金會發布的 GNU 通用公共許可證第2版的條款重新分發和/或修改它。**  IgH EtherCAT 主站的分發目的是希望它有用,但沒有任何保證;甚至沒有適銷性或特定用途適用性的隱含保證。詳情請參閱 GNU 通用公共許可證。**  您應該已經收到了與 IgH EtherCAT 主站一起提供的 GNU 通用公共許可證的副本;如果沒有,請寫信給自由軟件基金會,地址是:51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA。**  ---**  上述許可證僅適用于源代碼。使用 EtherCAT 技術和品牌僅允許在遵守 Beckhoff Automation GmbH 的工業產權和類似權利的情況下使用。*****************************************************************************//**\fileEtherCAT 數據報對結構。
*//*****************************************************************************/#ifndef __EC_DATAGRAM_PAIR_H__
#define __EC_DATAGRAM_PAIR_H__#include <linux/list.h>#include "globals.h"
#include "datagram.h"/*****************************************************************************//** 域數據報對。*/
typedef struct {struct list_head list; /**< 鏈表頭。 */ec_domain_t *domain; /**< 父域。 */ec_datagram_t datagrams[EC_MAX_NUM_DEVICES]; /**< 數據報。 */
#if EC_MAX_NUM_DEVICES > 1uint8_t *send_buffer;
#endifunsigned int expected_working_counter; /**< 期望的工作計數器。 */
} ec_datagram_pair_t;/*****************************************************************************/int ec_datagram_pair_init(ec_datagram_pair_t *pair, ec_domain_t *domain,uint32_t logical_offset, uint8_t *data, size_t data_size,const unsigned int used[]);
void ec_datagram_pair_clear(ec_datagram_pair_t *pair);
uint16_t ec_datagram_pair_process(ec_datagram_pair_t *pair,uint16_t wc_sum[]);/*****************************************************************************/#endif

四 c文件翻譯

/******************************************************************************\**  $Id$**  版權所有 (C) 2006-2012 Florian Pose, Ingenieurgemeinschaft IgH**  本文件是 IgH EtherCAT 主站的一部分。**  IgH EtherCAT 主站是免費軟件;您可以根據自由軟件基金會發布的 GNU 通用公共許可證第2版的條款重新分發和/或修改它。**  IgH EtherCAT 主站的分發目的是希望它有用,但沒有任何保證;甚至沒有適銷性或特定用途適用性的隱含保證。詳情請參閱 GNU 通用公共許可證。**  您應該已經收到了與 IgH EtherCAT 主站一起提供的 GNU 通用公共許可證的副本;如果沒有,請寫信給自由軟件基金會,地址是:51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA。**  ---**  上述許可證僅適用于源代碼。使用 EtherCAT 技術和品牌僅允許在遵守 Beckhoff Automation GmbH 的工業產權和類似權利的情況下使用。*****************************************************************************//**\fileEtherCAT 數據報對的方法。
*//*****************************************************************************/#include <linux/slab.h>#include "master.h"
#include "datagram_pair.h"/*****************************************************************************//** 數據報對構造函數。** \return 成功時返回零,否則返回負錯誤代碼。*/
int ec_datagram_pair_init(ec_datagram_pair_t *pair, /**< 數據報對。 */ec_domain_t *domain, /**< 父域。 */uint32_t logical_offset, /**< 邏輯偏移。 */uint8_t *data, /**< 數據指針。 */size_t data_size, /**< 數據大小。 */const unsigned int used[] /**< 輸入/輸出使用計數。 */)
{ec_device_index_t dev_idx;int ret;INIT_LIST_HEAD(&pair->list);pair->domain = domain;for (dev_idx = EC_DEVICE_MAIN;dev_idx < ec_master_num_devices(domain->master); dev_idx++) {ec_datagram_init(&pair->datagrams[dev_idx]);snprintf(pair->datagrams[dev_idx].name,EC_DATAGRAM_NAME_SIZE, "domain%u-%u-%s", domain->index,logical_offset, ec_device_names[dev_idx != 0]);pair->datagrams[dev_idx].device_index = dev_idx;}pair->expected_working_counter = 0U;for (dev_idx = EC_DEVICE_BACKUP;dev_idx < ec_master_num_devices(domain->master); dev_idx++) {/* 備份數據報有自己的內存 */ret = ec_datagram_prealloc(&pair->datagrams[dev_idx], data_size);if (ret) {goto out_datagrams;}}#if EC_MAX_NUM_DEVICES > 1if (!(pair->send_buffer = kmalloc(data_size, GFP_KERNEL))) {EC_MASTER_ERR(domain->master,"分配域發送緩沖區失敗!\n");ret = -ENOMEM;goto out_datagrams;}
#endif/* 下面的 ec_datagram_lxx() 調用不會失敗,因為數據報有外部內存或已預分配。 */if (used[EC_DIR_OUTPUT] && used[EC_DIR_INPUT]) { // 輸入和輸出ec_datagram_lrw_ext(&pair->datagrams[EC_DEVICE_MAIN],logical_offset, data_size, data);for (dev_idx = EC_DEVICE_BACKUP;dev_idx < ec_master_num_devices(domain->master); dev_idx++) {ec_datagram_lrw(&pair->datagrams[dev_idx],logical_offset, data_size);}// 如果使用 LRW,則輸出 FMMU 將工作計數器增加 2,// 而輸入 FMMU 將其增加 1。pair->expected_working_counter =used[EC_DIR_OUTPUT] * 2 + used[EC_DIR_INPUT];} else if (used[EC_DIR_OUTPUT]) { // 僅輸出ec_datagram_lwr_ext(&pair->datagrams[EC_DEVICE_MAIN],logical_offset, data_size, data);for (dev_idx = EC_DEVICE_BACKUP;dev_idx < ec_master_num_devices(domain->master); dev_idx++) {ec_datagram_lwr(&pair->datagrams[dev_idx],logical_offset, data_size);}pair->expected_working_counter = used[EC_DIR_OUTPUT];} else { // 僅輸入(或沒有)ec_datagram_lrd_ext(&pair->datagrams[EC_DEVICE_MAIN],logical_offset, data_size, data);for (dev_idx = EC_DEVICE_BACKUP;dev_idx < ec_master_num_devices(domain->master); dev_idx++) {ec_datagram_lrd(&pair->datagrams[dev_idx], logical_offset,data_size);}pair->expected_working_counter = used[EC_DIR_INPUT];}for (dev_idx = EC_DEVICE_MAIN;dev_idx < ec_master_num_devices(domain->master); dev_idx++) {ec_datagram_zero(&pair->datagrams[dev_idx]);}return 0;out_datagrams:for (dev_idx = EC_DEVICE_MAIN;dev_idx < ec_master_num_devices(domain->master); dev_idx++) {ec_datagram_clear(&pair->datagrams[dev_idx]);}return ret;
}/*****************************************************************************//** 數據報對析構函數。*/
void ec_datagram_pair_clear(ec_datagram_pair_t *pair /**< 數據報對。 */)
{unsigned int dev_idx;for (dev_idx = EC_DEVICE_MAIN;dev_idx < ec_master_num_devices(pair->domain->master);dev_idx++) {ec_datagram_clear(&pair->datagrams[dev_idx]);}#if EC_MAX_NUM_DEVICES > 1if (pair->send_buffer) {kfree(pair->send_buffer);}
#endif
}/*****************************************************************************//** 處理接收的數據。** \return 所有設備的工作計數器總和。*/
uint16_t ec_datagram_pair_process(ec_datagram_pair_t *pair, /**< 數據報對。 */uint16_t wc_sum[] /**< 工作計數器總和。 */)
{unsigned int dev_idx;uint16_t pair_wc = 0;for (dev_idx = 0; dev_idx < ec_master_num_devices(pair->domain->master);dev_idx++) {ec_datagram_t *datagram = &pair->datagrams[dev_idx];#ifdef EC_RT_SYSLOGec_datagram_output_stats(datagram);
#endifif (datagram->state == EC_DATAGRAM_RECEIVED) {pair_wc += datagram->working_counter;wc_sum[dev_idx] += datagram->working_counter;}}return pair_wc;
}/*****************************************************************************/

該文檔修改記錄:

修改時間修改說明
2024年7月1日EtherCAT主站IGH 該 文件解析

總結

以上就是EtherCAT主站IGH文件解析的內容。
有不明白的地方歡迎留言;有建議歡迎留言,我后面編寫文檔好改進。
創作不容,如果文檔對您有幫助,記得給個贊。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/37868.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/37868.shtml
英文地址,請注明出處:http://en.pswp.cn/web/37868.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

專題五:Spring源碼之初始化容器上下文

上一篇我們通過如下一段基礎代碼作為切入點&#xff0c;最終找到核心的處理是refresh方法&#xff0c;從今天開始正式進入refresh方法的解讀。 public class Main {public static void main(String[] args) {ApplicationContext context new ClassPathXmlApplicationContext(…

鴻蒙本地簽名不匹配問題

連接鴻蒙手機運行項目報如下錯誤 這是由于本地簽名和鴻蒙設備簽名不匹配導致的&#xff0c;需要注釋掉如下代碼&#xff0c;選擇file project 自動簽名 勾選auto選項&#xff0c;會在build-profile.json5中生成一個簽名&#xff0c;然后運行就ok了~

【Lua】腳本入門

文章目錄 總述一、Lua概述二、Lua環境安裝三、Lua基本語法四、Lua的庫和擴展五、Lua的應用場景六、學習資源 語法1. Lua基本語法示例變量和數據類型控制結構函數 2. Lua標準庫示例字符串操作數學函數文件I/O 3. Lua作為腳本擴展示例&#xff08;假設Lua嵌入在某個應用程序中&am…

vscode python格式化

插件 Black Formatter Black 默認會遵循 PEP 8 的規范&#xff0c;可配置的參數很少&#xff0c;用的人很多。 setting.json 配置&#xff0c;更改插件的每行字符數限制 {"[python]": {"editor.defaultFormatter": "ms-python.black-formatter"…

Redis命令大全(基礎版)

一、基礎命令 redis-server --service-start # 開啟服務 redis-server --service-stop # 停止服務redis-cli # 進入redis界面redis界面操作&#xff1a; ping # 檢測狀態&#xff0c;返回pong證明連接正常set key value # 設置 key 字段的值為value&#xff0c;返回o…

創建一個Django用戶認證系統

目錄 1、Django2、Django用戶認證系統User 模型&#xff1a;Authentication 視圖&#xff1a;認證后端 (Authentication Backends)&#xff1a;Form 類&#xff1a;中間件 (Middleware)&#xff1a;權限和組 (Permissions and Groups)&#xff1a; 3、創建一個django用戶認證系…

服務器的分類,主流服務器的應用場景

一、服務器分類 服務器可以按應用層次、體系架構、用途、外形等進行分類。以下是詳細說明&#xff1a; 按應用層次分類 入門級服務器&#xff1a;這些服務器一般用于小型企業或部門的簡單任務&#xff0c;如文件共享和打印服務。工作組級服務器&#xff1a;適用于中小型企業&…

html2canvas相關(生成圖片)

根據 DOM 生成對應的圖片 function export3png(row, type null) { html2canvas( document.querySelector(#bug), //要生成圖片的dom節點 {useCORS: true, }) 圖片跨域 .then((canvas) > { const saveUrl canvas.toDataURL(image/png) Canvas對象生成base64代碼 co…

MNIST手寫字體識別(算法基礎)

快教程 10分鐘入門神經網絡 PyTorch 手寫數字識別 慢教程 【深度學習Pytorch入門】 簡單回歸問題-1 梯度下降算法 梯度下降算法 l o s s x 2 ? s i n ( x ) loss x^2 * sin(x) lossx2?sin(x) 求導得&#xff1a; f ‘ ( x ) 2 x s i n x x 2 c o s x f^(x)2xsinx x^…

uORF和non-overlap對翻譯效率的影響

以下是重疊和非重疊上游開放閱讀框&#xff08;uORFs&#xff09;對翻譯效率影響的總結&#xff1a; 重疊uORFs&#xff1a; 重疊uORFs對主要編碼區的翻譯影響更為顯著&#xff0c;因為它們直接與下游編碼序列&#xff08;CDSs&#xff09;競爭核糖體結合。重疊uORFs的翻譯起始…

在C++程序中嵌入quickjs實現C++和javascript互相調用

quickjs是一個C實現的輕量級javascript解析引擎&#xff0c;可以嵌入到C程序中&#xff0c;實現C和js代碼的交互。 以下基于quickjs-ng這一社區分支實現樣例代碼演示利用quickjs編寫程序進行C和js互相調用&#xff0c;支持linux和windows。 代碼結構 quickjs_demo- quickjs-…

Cesium大屏-vue3注冊全局組件

1.需求 說明&#xff1a;產品經理要求開發人員在地圖大屏上面隨意放置組件&#xff0c;并且需要通過數據庫更改其組件大小&#xff0c;位置等&#xff1b;適用于大屏組件中場站視角、任意位置標題等。 2.實現 2.1GlobalComponents.vue 說明&#xff1a;containerList可以通…

python基礎語法 004-2流程控制- for遍歷

1 遍歷 1.1 什么是遍歷&#xff1f; 可以遍歷的元素&#xff1a;字符串、列表、元組、字典、集合字符串是可以進行for 循環。&#xff08;容器對象&#xff0c;序列&#xff09;可迭代對象iterable 例子&#xff1a; 1 &#xff09;、for遍歷字符串&#xff1a; name xiao…

RK3568驅動指南|第十五篇 I2C-第167章 I2C上拉電阻

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工藝&#xff0c;搭載一顆四核Cortex-A55處理器和Mali G52 2EE 圖形處理器。RK3568 支持4K 解碼和 1080P 編碼&#xff0c;支持SATA/PCIE/USB3.0 外圍接口。RK3568內置獨立NPU&#xff0c;可用于輕量級人工…

SpringBoot實現圖片添加水印

提示&#xff1a;今日完成圖片添加水印功能 后續可能還會繼續完善這個功能 文章目錄 目錄 文章目錄 前端部分 后端 Xml Controller層 Sercive層 Service實現層 Config配置層 application.properties 文件后綴名獲取 常量定義 前端部分 <!DOCTYPE html> <htm…

WIN11,如何同時連接有線網絡與WLAN無線網絡

之前寫了兩篇文章&#xff0c;一篇是雙網卡多網卡時win11如何設置網卡優先級_多網卡設置網卡優先級-CSDN博客 另一篇是win11 以太網和WLAN沖突 連接網線時導致WiFi掉線 解決_win11 以太網和wifi不能同時生效-CSDN博客 這篇是對上面兩篇的補充&#xff1a;主要解決電腦重啟后&…

語音芯片TD5580,USB小音響芯片—拓達半導體

有時候電腦的聲卡會出現損壞的問題&#xff0c;給我們的生活帶來了很多麻煩。這時候&#xff0c;我們就需要一款方便易用的產品來解決聲卡問題。USB聲卡小音響就是為了解決這個問題而設計的一款便捷的產品。它不僅可以作為一個小音響&#xff0c;讓您在工作和娛樂的時候享受高品…

docker-compose搭建minio對象存儲服務器

docker-compose搭建minio對象存儲服務器 最近想使用oss對象存儲進行用戶圖片上傳的管理&#xff0c;了解了一下例如aliyun或者騰訊云的oss對象存儲服務&#xff0c;但是呢涉及到對象存儲以及經費有限的緣故&#xff0c;決定自己手動搭建一個oss對象存儲服務器&#xff1b; 首先…

燒結銀到底有多牛?歡迎咨詢SHAREX善仁新材研究院

燒結銀到底有多牛&#xff1f;歡迎咨詢SHAREX善仁新材研究院 在當今日新月異的科技浪潮中&#xff0c;材料科學以其獨特的魅力引領著人類探索未知領域的步伐。在眾多前沿材料中&#xff0c;燒結銀憑借其卓越的性能和廣泛的應用前景&#xff0c;逐漸嶄露頭角&#xff0c;成為科…

創建XCOM窗體和跳轉連接

Xcom 窗體&#xff1a; (groupBox組合框&#xff0c;comboBox下拉框) xcom代碼&#xff1a; namespace _01_作業 {// 1kb 1024B 1200B// 1MB public partial class Form1 : Form{public List<string> botelv new List<string> { "600","1200&…