EtherCAT对象字典分析

EtherCAT开发中,主要通过两款软件查看XML文件,分别是"XML Notepad"和"Altova XMLSpy",两款界面如下:在这里插入图片描述
在这里插入图片描述
通过对比可以看出Altova XMLSpy软件显示的更为直观,因此我在开发时主要使用此软件。
接下来进入正题。通过igh开发EtherCAT应用程序首先必须知道从站的对象字典,我们可以通过igh自带的ethercat软件查看从站的对象字典。实验设备为安装了xenomai和igh的am4377开发板、倍福EL2008从站和淘宝店家“易元素电子”的stm32从站。
在这里插入图片描述
在命令行输入ethercat cstruct即可查看到主站连接的所有从站设备的对象字典。本文主要对从站4,也就是图中的stm32从站的对象字典进行分析,通过ethercat工具查到的信息如下:

/* Master 0, Slave 4, "LAN9252-EVB-HBI"
 * Vendor ID:       0x00000009
 * Product code:    0x00009252
 * Revision number: 0x00000001
 */

ec_pdo_entry_info_t slave_4_pdo_entries[] = {
    {0x7010, 0x01, 1}, /* LED 1 */
    {0x7010, 0x02, 1}, /* LED 2 */
    {0x7010, 0x03, 1}, /* LED 3 */
    {0x7010, 0x04, 1}, /* LED 4 */
    {0x7010, 0x05, 1}, /* LED 5 */
    {0x7010, 0x06, 1}, /* LED 6 */
    {0x7010, 0x07, 1}, /* LED 7 */
    {0x7010, 0x08, 1}, /* LED 8 */
    {0x0000, 0x00, 8}, /* Gap */
    {0x6000, 0x01, 1}, /* Switch 1 */
    {0x6000, 0x02, 1}, /* Switch 2 */
    {0x6000, 0x03, 1}, /* Switch 3 */
    {0x6000, 0x04, 1}, /* Switch 4 */
    {0x6000, 0x05, 1}, /* Switch 5 */
    {0x6000, 0x06, 1}, /* Switch 6 */
    {0x6000, 0x07, 1}, /* Switch 7 */
    {0x6000, 0x08, 1}, /* Switch 8 */
    {0x0000, 0x00, 8}, /* Gap */
    {0x6020, 0x01, 1}, /* Underrange */
    {0x6020, 0x02, 1}, /* Overrange */
    {0x6020, 0x03, 2}, /* Limit 1 */
    {0x6020, 0x05, 2}, /* Limit 2 */
    {0x0000, 0x00, 8}, /* Gap */
    {0x1802, 0x07, 1}, /* TxPDOState */
    {0x1802, 0x09, 1}, /* TxPDO Toggle */
    {0x6020, 0x11, 16}, /* Analog input */
};

ec_pdo_info_t slave_4_pdos[] = {
    {0x1601, 9, slave_4_pdo_entries + 0}, /* DO RxPDO-Map */
    {0x1a00, 9, slave_4_pdo_entries + 9}, /* DI TxPDO-Map */
    {0x1a02, 8, slave_4_pdo_entries + 18}, /* AI TxPDO-Map */
};

ec_sync_info_t slave_4_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_4_pdos + 0, EC_WD_ENABLE},
    {3, EC_DIR_INPUT, 2, slave_4_pdos + 1, EC_WD_DISABLE},
    {0xff}
};

stm32从站主要实现了8路输入、8路输出和1路ad转换功能。

ec_pdo_entry_info_t 结构体

从站信息的第一部分比较简单就是每个变量对应的对象字典,比如LED 1对应的对象字典的主索引号为0x7010、子索引号为0x01、大小为1bit。我们可以通过查看ec_pdo_entry_info_t结构体了解更详细的信息。

/** PDO entry configuration information.
 * This is the data type of the \a entries field in ec_pdo_info_t.
 * \see ecrt_slave_config_pdos().
 */
typedef struct {
    uint16_t index; /**< PDO entry index. */
    uint8_t subindex; /**< PDO entry subindex. */
    uint8_t bit_length; /**< Size of the PDO entry in bit. */
} ec_pdo_entry_info_t;

查看XML文件中的对应部分。
在这里插入图片描述

ec_pdo_info_t 结构体

这一部分主要描述了PDO数据的映射关系。TxPDO是从站向主站发送数据,RxPDO是从站向主站接收数据。
如下图,TxPDO的组成由映射关系16XX的值来决定排序和长度,而映射管理0x1C12的值决定使用哪些映射关系(一个或多个)。同理RxPDO也是如此。
在这里插入图片描述
ec_pdo_info_t 结构体信息如下:

/** PDO configuration information.
 * This is the data type of the \a pdos field in ec_sync_info_t.
 * \see ecrt_slave_config_pdos().
 */
typedef struct {
    uint16_t index; /**< PDO index. */
    unsigned int n_entries; /**< Number of PDO entries in \a entries to map.
                              Zero means, that the default mapping shall be
                              used (this can only be done if the slave is
                              present at bus configuration time). */
    ec_pdo_entry_info_t *entries; /**< Array of PDO entries to map. Can either
                                    be \a NULL, or must contain at
                                    least \a n_entries values. */
} ec_pdo_info_t;

以{0x1601, 9, slave_4_pdo_entries + 0}, /* DO RxPDO-Map */为例。从站使用0x1601来管理slave_4_pdo_entries [0]开始的9个变量:

    {0x7010, 0x01, 1}, /* LED 1 */
    {0x7010, 0x02, 1}, /* LED 2 */
    {0x7010, 0x03, 1}, /* LED 3 */
    {0x7010, 0x04, 1}, /* LED 4 */
    {0x7010, 0x05, 1}, /* LED 5 */
    {0x7010, 0x06, 1}, /* LED 6 */
    {0x7010, 0x07, 1}, /* LED 7 */
    {0x7010, 0x08, 1}, /* LED 8 */
    {0x0000, 0x00, 8}, /* Gap */

XML中的对应部分如下
在这里插入图片描述

ec_sync_info_t 结构体

这部分主要描述sm的配置信息。

/** Sync manager configuration information.
 * This can be use to configure multiple sync managers including the PDO
 * assignment and PDO mapping. It is used as an input parameter type in
 * ecrt_slave_config_pdos().
 */
typedef struct {
    uint8_t index; /**< Sync manager index. Must be less
                     than #EC_MAX_SYNC_MANAGERS for a valid sync manager,
                     but can also be \a 0xff to mark the end of the list. */
    ec_direction_t dir; /**< Sync manager direction. */
    unsigned int n_pdos; /**< Number of PDOs in \a pdos. */
    ec_pdo_info_t *pdos; /**< Array with PDOs to assign. This must contain
                            at least \a n_pdos PDOs. */
    ec_watchdog_mode_t watchdog_mode; /**< Watchdog mode. */
} ec_sync_info_t;

首先查看这部分的XML文件。
在这里插入图片描述
此例中,sm0管理MBoxOut,sm1管理MBoxIn,因为stm32从站程序并没有用到邮箱通信,因此这部分没有数据传输,所以结构体设置如下:

    {0, EC_DIR_OUTPUT, 0, NULL, EC_WD_DISABLE},
    {1, EC_DIR_INPUT, 0, NULL, EC_WD_DISABLE},

由上一部分的slave_4_pdos可知,本文用到了1个RxPDO和2个TxPDO。sm2管理RxPDO因此结构体中方向设置为EC_DIR_OUTPUT,个数设置为1,起始位置为slave_4_pdos[0]。sm3管理TxPDO因此结构体中方向设置为EC_DIR_INPUT,个数设置为2,起始位置为slave_4_pdos[1]。

    {2, EC_DIR_OUTPUT, 1, slave_4_pdos + 0, EC_WD_ENABLE},
    {3, EC_DIR_INPUT, 2, slave_4_pdos + 1, EC_WD_DISABLE},
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值