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文件解析的內容。
有不明白的地方歡迎留言;有建議歡迎留言,我后面編寫文檔好改進。
創作不容,如果文檔對您有幫助,記得給個贊。