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},