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.mzph.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&…