精华内容
下载资源
问答
  • EtherCAT对象字典分析

    千次阅读 2019-07-23 11:08:27
    EtherCAT开发中,主要通过两款软件查看XML文件,分别是"XML Notepad"和...通过igh开发EtherCAT应用程序首先必须知道从站的对象字典,我们可以通过igh自带的ethercat软件查看从站的对象字典。实验设备为安装了xe...

    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},
    
    展开全文
  • EtherCAT学习之路——对象字典

    千次阅读 2020-03-13 14:51:46
    所谓的对象字典就是一个有序的对象组,描述了对应 CANopen 节点的所有参数,包括通讯数据的存放位置也列入其索引,这个表变成可以传递形式就叫做 EDS 文件(电子数据文档Electronic Data Sheet)。对象字典,就像...

    首发与知乎

    1.对象字典

    CANopen 对象字典(OD: Object Dictionary)是 CANopen 协议最为核心的概念。所谓的对象字典就是一个有序的对象组,描述了对应 CANopen 节点的所有参数,包括通讯数据的存放位置也列入其索引,这个表变成可以传递形式就叫做 EDS 文件(电子数据文档Electronic Data Sheet)。对象字典,就像体检表,具备这个人每个功能的参数,便于用人单位(主站)进行合理分配工作。

    这部分引用自周立功的《CANopen轻松入门》,对于CANopen协议不清楚的地方,可以看看这本书,加强理解。

    图1-1 对象字典与体检表标题

    对象字典中的每个对象都描述了它的功能、名字、索引、子索引、数据类型,以及这个对象是否必需、读写属性等等。下表为通用通讯对象的举例:

    标图1-2 通用通讯对象题

    每个对象采用一个 16 位的索引值来寻址,这个索引值通常被称为索引,其范围在 0x0000到 0xFFFF 之间。为了避免数据大量时无索引可分配,所以在某些索引下也定义了一个 8 位的索引值,这个索引值通常被称为子索引,其范围是 0x00 到 0xFF 之间。子索引可以进一步描述对象的参数和功能等信息。

    标题图1-3 PDO对象

    总结来说,对象字典即是一张表,表中记录了各种各样的对象,这些对象可以是int32,bool这种通用数据类型,也可以是自定义的结构体数据类型。对象字典内使用Index来对对象进行索引,对象中还可以存在Sub-Index进一步描述对象的参数和功能。

    1.1 CoE(CANopen over EtherCAT)

    EtherCAT协议在应用层支持CANopen协议,并作了相应的扩充。CoE协议完全遵从CANopen协议,其对对象字典的定义也相同,如表1-3所示。表1-4列出了CoE通讯数据对象。其中针对EtherCAT通讯扩展了相关通讯对象0x1C00~0x1C4F,用于设置存储同步管理器的类型,通讯参数和PDO数据分配。

    标图1-4 CoE对象字典定义题

     

    图1-5 CoE通讯对象定义标题

    对于CoE对象字典,这里我们先不做具体的介绍,在后面的章节中会具体根据代码来具体说明。

    2.EtherCAT Slave Information中的对象字典描述

    2.1 EtherCAT Slave Information

    在EtherCAT Slave Information(ESI)用于描述从站参数及特性,使用xml的形式进行描述。EtherCAT配置工具通过ESI文件生成EtherCAT Network Information(ENI)。

    For each EtherCAT Slave a device description, the so called EtherCAT Slave Information (ESI) has tobe delivered. This is done in form of an XML file (eXtensible Markup Language). It describes EtherCAT specific as well as application specific features of the slave.The ESI file is used by an EtherCAT configuration tool to generate the EtherCAT Network Information(ENI).

    事实上,目前我也还没弄明白ESI具体细节,特别是从站具体是如何使用ESI的还不是很清楚。不过,只要知道ESI中包含哪些内容,与EtherCAT协议是怎样的一种对应关系,做从站开发也足够了。ESI的具体内容,我会在其他的文章中介绍,这里就详细讲一下ESI中的对象字典。

    ESI是用xml进行描述的,在例程中可以找到如AX58100-UC16-R1.xml的文件,用xmlspy打开如下图。

    图2-1 对象字典标题

    xmlspy将xml文件按照列表的形式进行排列,这里是ESI中Dictionary部分,也即是ESI中的对象字典描述。ESI中将对象字典分成了DataTypes和Objects两个部分,其中,Objects中描述了对象,DataTypes描述了对象的数据类型。

    2.2 ESI中的对象

    我所使用的例程中,共有23个对象,每一行即是一个对象的描述。包括对象的索引,名称,数据类型,位宽,还有一个Info域和Flags域。

    图2-2 对象字典标题

    Info域中包含了对象的子项,如对象0x7010就由9个子项构成,Sub-Index000和LED1~8。其中,Sub-Index000是对象中子索引的数目,0x7010中有LED1~8,所有其Sub-Index000就等于8。每一个有子项的对象的第一个子项都是Sub-Index000,且都表示该对象子索引的数目。

    Flags域描述对象的读写限制。

    2.3 对象的数据类型

    对象的数据类型是多种多样的,可以是通用类型UDINT(即uint32),也可以是结构体类型。BIT2,BOOL,DINT这些数据类型都是在ETG.1020中定义的;DT1601,DT1C12等则是根据CoE协议进行定义的;DT6000,DT7010则是一些用户自定义类型。

    图2-3 对象字典数据类型标题

    可以看到0x7010这个对象的子项和其数据类型的子项是一一对应起来的,都是包含了一个Sub-Index000和LED1~8。同时数据类型的子项中进一步描述了对象子项的子索引,名称,类型,位宽,比特偏移等信息。

    3.Slave Stack Code中的对象字典

    Slave Stack Code(SSC)是倍福提供的从站协议栈代码,SSC的具体内容会在另一篇文章中介绍,这里具体关注SSC中的对象字典。

    3.1 对象列表

    /**
     *\brief EL9800 Application specific object dictionary
     * 
     */
    TOBJECT    OBJMEM ApplicationObjDic[] = {
       /* Enum 0x0800 */
       {NULL,NULL, 0x0800, {DEFTYPE_ENUM, 0x02 | (OBJCODE_REC << 8)}, asEntryDesc0x0800, 0, apEnum0800 },
       /* Object 0x1601 */
       {NULL,NULL,  0x1601, {DEFTYPE_PDOMAPPING, 10 | (OBJCODE_REC << 8)}, asEntryDesc0x1601, aName0x1601, &sDORxPDOMap, NULL, NULL, 0x0000 },
        /* Object 0x1C12 */
       {NULL,NULL,   0x1C12, {DEFTYPE_UNSIGNED16, 1 | (OBJCODE_ARR << 8)}, asPDOAssignEntryDesc, aName0x1C12, &sRxPDOassign, NULL, NULL, 0x0000 },
       /* Object 0x7010 */
       {NULL,NULL,   0x7010, {DEFTYPE_RECORD, 16 | (OBJCODE_REC << 8)}, asEntryDesc0x7010, aName0x7010, &sDOOutputs, NULL, NULL, 0x0000 },
       {NULL,NULL, 0xFFFF, {0, 0}, NULL, NULL, NULL, NULL}};
    #endif    //#ifdef _OBJD_
     

    上面是我使用的例程中部分的对象定义,可以看到包含了对象的Index(如0x7010),对象的描述(如asEntryDesc0x7010),对象的名称(如aName0x7010),对象的实例(如sDOOutputs)。

    需要注意的一点是,这里的ApplicationObjDic并不是对象字典,ApplicationObjDic只是简单的把对象罗列出来。因为各种对象的数据类型是不相同的,所以,无法简单地以数组的形式来实现对象字典,在SSC中使用链表的形式来实现对象字典。准确来讲ApplicationObjDic中的每一行并不是一个对象,而是一个对象字典入口(Object Dictionary Entry),除了对象本身的描述之外,还包含了一些链表指针。不过,为了简单理解,可以先暂时把ApplicationObjDic理解成对象字典。

    3.2对象字典Entry

    下面是对象字典Entry的结构体定义:

    /**
     * \brief Object dictionary entry structure
     */
    typedef struct OBJ_ENTRY
    {
        struct OBJ_ENTRY                      *pPrev; /**< \brief Previous entry(object) in the object dictionary list*/
        struct OBJ_ENTRY                      *pNext; /**< \brief Next entry(object) in the object dictionary list*/
    
        UINT16                                Index; /**< \brief Object index*/
       TSDOINFOOBJDESC                       ObjDesc; /**< \brief Object access, type and code*/
       OBJCONST TSDOINFOENTRYDESC OBJMEM     *pEntryDesc; /**< \brief pointer to object entry descriptions*/
       OBJCONST UCHAR OBJMEM                 *pName; /**< \brief Pointer to object and entry names*/
       void MBXMEM                           *pVarPtr; /**< \brief Pointer to object buffer*/
       UINT8 (* Read)( UINT16 Index, UINT8 Subindex, UINT32 Size, UINT16 MBXMEM * pData, UINT8 bCompleteAccess ); /**< \brief Function pointer to read function (if NULL default read function will be used)*/
       UINT8 (* Write)( UINT16 Index, UINT8 Subindex, UINT32 Size, UINT16 MBXMEM * pData, UINT8 bCompleteAccess ); /**< \brief Function pointer to write function (if NULL default write function will be used)*/
       UINT16                                 NonVolatileOffset; /**< \brief Offset within the non volatile memory (need to be defined for backup objects)*/
    }
    TOBJECT;
    • *pPrev和*pNext是指向前链和后链的指针,通过*Prev和*pNext即可将各个对象链接起来,组成链表。

    • Index即是对象索引;

    • objDesc包含了“对象的数据类型”;

    • *pEntryDesc是对象entry的描述,包含了“entry的数据类型和读写限制”;

    • *pName是对象名称;

    • *pVarPtr是对象的实例。

    objDesc中英文释义是object access,type and code。这里的object type与ESI中对象数据类型不是相同的东西。ESI中的对象数据类型是在*pEntryDesc中描述的。

    3.3 对象数据类型(pEntryDesc)

    下面以对象0x7010来介绍对象Entry描述:

    /**
     * \brief Object 0x7010 (Digital output object) entry descriptions
     *
     * SubIndex 0 : read only<br>
     * SubIndex x : (One description for each led) read only and RxPdo mappable<br>
     *  (x > 0)
    */
    #ifdef _OBJD_
    OBJCONST TSDOINFOENTRYDESC    OBJMEM asEntryDesc0x7010[] = {
       {DEFTYPE_UNSIGNED8, 0x8, ACCESS_READ }, /* Subindex 000 */
       {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 001: LED 1 */
       {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 002: LED 2 */
       {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 003: LED 3 */
       {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 004: LED 4 */
       {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 005: LED 5 */
       {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 006: LED 6 */
       {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 007: LED 7 */
       {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 008: LED 8 */
       {0x0000, 0x08, 0}
       }; /* Subindex 008 for align */

    其中,第一列是数据类型,第二列是位宽,第三列是读写限制。

    标图3-1 对象7010数据类型题

    对象Entry描述即是ESI中的对象数据类型。

    3.4对象实例(pVarPtr)

    对象数据类型中描述了各个子项的数据类型,位宽,读写限制,还需要一个对象的实例来存储各子项的值。

    /** \brief 0x7010 (Digital output object) data structure*/
    typedef struct OBJ_STRUCT_PACKED_START {
       UINT16   u16SubIndex0; /**< \brief SubIndex 0*/
       BOOLEAN(bLED1); /**< \brief LED 1*/
       BOOLEAN(bLED2); /**< \brief LED 2*/
       BOOLEAN(bLED3); /**< \brief LED 3*/
       BOOLEAN(bLED4); /**< \brief LED 4*/
       BOOLEAN(bLED5); /**< \brief LED 5*/
       BOOLEAN(bLED6); /**< \brief LED 6*/
      BOOLEAN(bLED7); /**< \brief LED 7*/
      BOOLEAN(bLED8); /**< \brief LED 8*/
      ALIGN8(SubIndex008) /**< \brief 8Bit alignment*/
    } OBJ_STRUCT_PACKED_END
    TOBJ7010;
    
    PROTO TOBJ7010 sDOOutputs
    #ifdef _EVALBOARD_
    = {8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0}
    #endif
    ;

    TOBJ7010定义了对象0x7010的数据结构,而sDOOutputs则是其实例。可以把这里的TOBJ7010视为ESI中的对象子项描述。

    原本以为写博客是一件很简单的事情,亲自动手以后才发现这么耗时间。计划每天1小时,每周写2篇博客的,谁知道1周也写不完一篇。动手写的时候,才发现其实还有不少的内容自己没有理清楚,需要重新整理;还有不少的细节记不清,需要重新查证。因为个人的精力实在有限,所以,有些地方(比如ESI文件的调用)自己也还没完全搞清楚就先写出来了,不足之处望请谅解。

    展开全文
  • EtherCAT对象字典解析

    千次阅读 2016-06-23 17:30:20
    原文地址:... 关于对象字典的数据结构如下: [cpp] view plain copy /*/////////////////////////////////////////////////////////////////////

    原文地址:http://blog.csdn.net/huangxianxinalice/article/details/10956137

    关于对象字典的数据结构如下:

    [cpp]  view plain  copy
    1. /*/ 
    2. // 
    3. //    Object dictionary entry structure 
    4. */  
    5.   
    6. typedef struct OBJ_ENTRY  
    7. {  
    8. #if !STATIC_OBJECT_DIC  
    9.     struct OBJ_ENTRY                      *pPrev;                    //previous entry(object) in the object dictionary list  
    10.     struct OBJ_ENTRY                      *pNext;                    //next entry(object) in the object dictionary list  
    11. #endif //#if !STATIC_OBJECT_DIC  
    12.   
    13.     UINT16                                Index;  
    14.     TSDOINFOOBJDESC                       ObjDesc;  
    15.     OBJCONST TSDOINFOENTRYDESC OBJMEM     *pEntryDesc;  
    16.     OBJCONST UCHAR OBJMEM                 *pName;  
    17.     void MBXMEM                           *pVarPtr;  
    18.     UINT8 (* Read)( UINT16 Index, UINT8 Subindex, UINT32 Size, UINT16 MBXMEM * pData, UINT8 bCompleteAccess );  
    19.     UINT8 (* Write)( UINT16 Index, UINT8 Subindex, UINT32 Size, UINT16 MBXMEM * pData, UINT8 bCompleteAccess );  
    20.     UINT16                                 NonVolatileOffset;  
    21. }  
    22. TOBJECT;  

    代码1

    对象字典的对象的数据结构是采用链表的形式,组成整个对象字典。

    其中,在对象里面定义了索引,对象的描述,SDO入口指针的描述,对象字典的名称,变量的指针,还定义了读和写两个虚函数

    ObjDesc的数据结构如下:

    [cpp]  view plain  copy
    1. typedef struct MBX_STRUCT_PACKED_START  
    2. {  
    3.     UINT16            DataType;            // 关于索引的数据类型  
    4.     UINT16            ObjFlags;  
    5.     /*对象代码和最大子索引将被人为得设置在对象字典里面,这个值经常以大端模式被创造 */  
    6.     #define    OBJFLAGS_MAXSUBINDEXMASK    0x00FF//最大子索引的掩码  
    7.     #define    OBJFLAGS_MAXSUBINDEXSHIFT   0<span style="white-space:pre">  </span> //最大子索引的偏移  
    8.     #define    OBJFLAGS_OBJCODEMASK        0x0F00//对象的掩码  
    9.     #define    OBJFLAGS_OBJCODESHIFT       8<span style="white-space:pre">  </span> //对象的偏移  
    10.   
    11.     #define    OBJCODE_VAR                 0x07  
    12.     #define    OBJCODE_ARR                 0x08  
    13.     #define    OBJCODE_REC                 0x09  
    14. //        char                Name[];                // rest of mailbox data  
    15. }MBX_STRUCT_PACKED_END  
    16. TSDOINFOOBJDESC;  
    代码2
    其中,对于OBJCODE里面这三个宏定义OBJCODE_VAR  OBJCODE_ARR  OBJCODE_REC (请问这三个宏定义分别代表着哪三种情况)

    从字面上的意思来说,OBJCODE的变量,OBJCODE的队列,OBJCODE的记录

    OBJCODE通过函数  

     UINT8 objCode = (pObjEntry->ObjDesc.ObjFlags & OBJFLAGS_OBJCODEMASK) >> OBJFLAGS_OBJCODESHIFT;

    最后,得出的是OBJCODE的类别

    如果是变量的话,就return 0;

    如果是对象的队列和记录得话,则可以得出OBJCODE的偏移量

    如果对象字典object code的类别得出是OBJCODE的队列的时候,得出对象字典的入口地址是&pObjEntry->pEntryDesc[1];

    如果,是OBJCODE_REC的时候,得出的对象字典的入口地址是&pObjEntryDesc[i];

    Obj_Desc的作用是为了找到关于对象的描述


    SDO入口地址的描述

    [cpp]  view plain  copy
    1. // SDO Information / Entry Description:  
    2. typedef struct MBX_STRUCT_PACKED_START  
    3. {  
    4.     UINT16                DataType;                // 关于索引的数据类型  
    5.     UINT16                BitLength;  
    6.     UINT16                ObjAccess;                // Bit 0: Read Access in Pre-Op  
    7.                                                     // Bit 1: Read Access in Safe-Op  
    8.                                                     // Bit 2: Read Access in Op  
    9.                                               <span style="white-space:pre">    </span>    // Bit 3: Write Access in Pre-Op  
    10.                                             <span style="white-space:pre">  </span>    // Bit 4: Write Access in Safe-Op  
    11.                                           <span style="white-space:pre">    </span>    // Bit 5: Write Access in Op  
    12.                                           <span style="white-space:pre">    </span>    // Bit 6: mappable in RxPDO  
    13.                                           <span style="white-space:pre">    </span>    // Bit 7: mappable in TxPDO  
    14.                                          <span style="white-space:pre"> </span>    // Bit 8: entry will be included in backup  
    15.                                          <span style="white-space:pre"> </span>    // Bit 9: entry will be included in settings  
    16.   
    17.         #define    ACCESS_READWRITE             0x003F  
    18.         #define    ACCESS_READ                  0x0007  
    19.         #define    ACCESS_READ_PREOP            0x0001  
    20.         #define    ACCESS_READ_SAFEOP           0x0002  
    21.         #define    ACCESS_READ_OP               0x0004  
    22.         #define    ACCESS_WRITE                 0x0038  
    23.         #define    ACCESS_WRITE_PREOP           0x0008  
    24.         #define    ACCESS_WRITE_SAFEOP          0x0010  
    25.         #define    ACCESS_WRITE_OP              0x0020  
    26.         #define    OBJACCESS_NOPDOMAPPING       0x0000  
    27.         #define    OBJACCESS_RXPDOMAPPING       0x0040  
    28.         #define    OBJACCESS_TXPDOMAPPING       0x0080  
    29.         #define    OBJACCESS_BACKUP             0x0100  
    30.         #define    OBJACCESS_SETTINGS           0x0200  
    31.         #define    OBJACCESS_SAFEINPUTS         0x0400  
    32.         #define    OBJACCESS_SAFEOUTPUTS        0x0800  
    33.         #define    OBJACCESS_SAFEPARAMETER      0x1000  
    34. //        UINT16            UnitType;                // optional if bit3 of valueInfo  
    35. //        UINT8                DefaultValue[];        // optional if bit4 of valueInfo  
    36. //        UINT8                MinValue[];            // optional if bit5 of valueInfo  
    37. //        UINT8                MaxValue[];            // optional if bit6 of valueInfo  
    38. //        char                Desc[];                 // rest of mailbox data  
    39. }MBX_STRUCT_PACKED_END  
    40. TSDOINFOENTRYDESC;  
    代码3

    算法:
        for (i = 1; i <= subindex; i++)
        {
            /* get the entry description获得入口描述 */
            if (objCode == OBJCODE_ARR)
                pEntry = &pObjEntry->pEntryDesc[1];
            else
                pEntry = &pObjEntry->pEntryDesc[i];

    这里根据子索引数找到相关的入口地址

    其中,pObjEntry->pEntryDesc (见代码1),是定义了一个指针,指针类型是TSDOINFOENTRYDESC的结构体。那里上面的代码是指向它相邻的一个结构体的pEntryDesc吗?那这个pEntryDesc,是存放它第一个子索引的入口描述?

    那它子索引的初始化是怎样初始化?

    展开全文
  • EtherCAT之相知(状态机&字典

    千次阅读 2019-05-31 17:12:10
    ethercat在建立主从连接时,需要通过一套逻辑状态机来完成,状态机的模型如下: Init(初始化):在这个状态下,通过主机同步EtherCAT总线网路, 主机仅访问从设备的寄存器,但在应用层没有任何交互; I TO P: • ...

    状态机

    ethercat在建立主从连接时,需要通过一套逻辑状态机来完成,状态机的模型如下:
    在这里插入图片描述
    Init(初始化):在这个状态下,通过主机同步EtherCAT总线网路, 主机仅访问从设备的寄存器,但在应用层没有任何交互;

    I TO P:在这里插入图片描述
    • 主机读取Eeprom的加载状态;
    主机为邮箱交互方式配置SM通道(专属于邮箱通信的SM0和SM1通道);
    • 主站设置AL Control寄存器申请转换为Pre-OP状态;
    • 从站完成邮箱通道部署并对其进行验证。

    Pre-OP(预运行):在此状态下,主站与从站之间可以通过邮箱进行通信,但不可以进行过程数据通信;在这里插入图片描述
    P TO S:
    • 主机通过通过邮箱来配置过程数据映射的参数;
    • 主机配置FMMU通道,SM通道(专属于过程数据的缓存通道SM2和SM3)为过程数据交互做准备;
    • 主机申请转换为Safe-OP状态;
    • 从站完成过程数据映射参数的配置,分配过程数据缓冲区,设置看门狗,将过程数据从MCU的RAM拷贝到ESC的DPRAM中。

    Safe-OP(安全运行):在该状态下,总线上所有设备都进入安全状态,应用层可以用邮箱通信,有过程数据通信,但仅限输入数据;
    在这里插入图片描述
    S to O:
    • 启动过程数据的输出更新,主机发送有效的过程数据输出;
    • 主机发送OP状态请求;
    • 从站做相应数据和标志位的确认。

    OP(运行):
    在这里插入图片描述
    过程数据的输入输出皆有效,这样ethercat主从设备之间的交互同道就完全的建立起来了。

    在状态转换的过程中,其中有三个寄存器值得特别的说明一下:
    AL_Control:是主机发起的状态申请
    AL_Status:是从机记录自身当前的状态
    AL_Event Request:是主机发给从机的需求事件

    字典

    在这里插入图片描述
    ˃ 对象字典是COE最重要的特性,它将设备的描述标准化
    ˃ 使用邮箱访问COE对象字典及其对象;
    ˃ 使用对象字典映射过程数据,周期性传输指令数据和状态数据。
    ˃ 主机与从机同一份对象字典
    通过邮箱访问对象字典建立一个链表结构,再通过过程数据方式来填充该链表中对应的对象内容,最终实现通过PC端(Master)来控制从设备(Slave)的执行变量的操作

    展开全文
  • EtherCAT(以太网控制自动化技术)是一个以以太网为基础的开放架构的现场总线系统,EtherCAT名称中的CAT为Control Automation Technology(控制自动化技术)首字母的缩写。最初由德国倍福自动化有限公司(Beckhoff ...
  • EtherCAT】基础概念

    千次阅读 2019-11-10 12:20:25
    EtherCAT(以太网控制自动化技术)是最初由德国倍福(Beckhoff)公司开发的实时(real—time)工业以太网(Ethernet)技术,它是一种以以太网为基础的现场总线系统,其名称的CAT为控制自动化技术...
  • 通过Arduino技术,大大简化EtherCAT从站的开发。ArduCAT开发板包含两路可用于EtherCAT实时以太网的100BASE-TX网口,所以它特别适合基于PC的自动化方案。ArduCAT使用ATMega1280 处理器,兼容Arduino Mega开发板,并...
  • 1.2 CoE之对象字典概念

    千次阅读 2020-03-28 11:21:25
    1、 在Ethernet帧中,在Ethernet Header、EtherCAT Header之后是每个从站的子报文。在这些子报文中的开头是10个字节的子报文头,包含命令、索引、地址等信息。 2、 逻辑寻址:通过FMMU(每一个ESC内都有FMMU)...
  •  EasyCAT库:用户基于EasyCAT_Config_GUI编辑对象字典,支持PDO;支持IRQ方式与芯片通信,代码占用空间极小;  AuduCAT库:用户只需编辑EXCEL表格便生成完整的协议栈,支持PDO、CoE(CANOpen over EtherCAT),...
  • EtherCAT学习之路——例程解析

    千次阅读 2020-03-13 14:53:55
    2.4 在sampleappl.h中更新对象字典的参考 2.5 在sampleappl.c中更新过程数据大小 更新过程数据大小(过程数据大小应该与对应的SM大小一致)。 注:如果某一个变量与ESI文件中记录的信息不一致,从站状态无法从PreOP...
  • 倍福运动控制功能介绍,通过EtherCAT控制步进电机,完整的操作步骤,程序流程,主流控制协议。 解决简单控制器配置,驱动器程序实现等。
  • 基于EtherCAT伺服系统设计,梁之杰,何永义,EtherCAT是一种新型的工业以太网技术,文章主要介绍了EtherCAT技术的原理特点以及主站功能及配置方法、从站驱动程序设计和适用于EtherCAT
  • EtherCAT (学习笔记)

    万次阅读 多人点赞 2020-10-31 09:03:05
    EtherCAT原理介绍2.1 实时性2.2 端口管理2.3 EtherCAT网络拓扑2.4 EtherCAT网络协议栈2.5 EtherCAT数据帧格式2.6 EtherCAT设备寻址方式2.7 分布式时钟(Distribute Clock)2.8 应用层(Application Layer)2.9 设备配置...
  • 封装接口的关键是对象字典的操作,根据手册设置对象字典即可,标准的Ethercat接口伺服电机一般来说对象字典定义基本是一样的,可能稍微有差别 5. 标准Igh Master接口的使用例子 mytest目录 mytest/test_torque_...
  • 的:在EtherCAT开发板上IO程序基础上增加一个16位的变量mytest,用于传输模拟量发送给主站 XML配置修改 ... 更改数据字典对象表 更改0x1A02数据对象--输出映射表AI TxPDO-Map (1)增..
  • 文章目录1 启动脚本1.1 start1.2 stop2 主站实例创建2.1 Master Phases2.2 数据报与状态机数据报状态机2.3 master状态机及数据报初始化2.4 初始化EtherCAT device2.5 设置IDLE 线程的发送间隔:2.6 初始化字符设备3 ...
  • 在他人资源基础上,精校了目录
  • Beckhoff Automation的EtherCAT Slave Stack Code(SSC)是ANSI ... “对象字典工具”(OD-Tool)已集成到SSC OD配置工具中,支持离线和在线对象字典的一致定义。 详细的产品信息可以在官方的EtherCAT产品指南中找到。
  • 对于PDO映射关系,了解这个的话需要知道一个状态机,就是从站扫描状态机中的子状态机,ec_fsm_pdo状态机原理就是配置对象字典0x1C10~0x1C2F这32个PDO,这32个PDO名为Sync Manager PDO Assignment,分别对应0~31同步...
  • EtherCAT通信主站----PDO过程数据映射

    千次阅读 2020-09-07 22:38:33
    EtherCAT其中COE在数据链路层采用EtherCAT协议,在运用层采用CanOpen协议,其和兴是对象字典,对PDO和SDO相关知识,可以参考CanOpen通信----PDO与SDO,本文将只PDO的映射相关知识。 FMMU与Sync Manager配置 为了使SDO...
  • EtherCAT总线通信架构模型以及CoE参考模型解析 1、主从站系统构成模型 EtherCAT 总线通信支持几乎所有的通讯布线拓扑类型,包括线型(菊花链)、树型、星型等,一般使用菊花链形串联比较简单,支持最大65535个从站...
  • 该手册为中文版高创伺服驱动器的使用手册,主要包含can/ethercat总线的说明和使用例程,已经所有的对象字典定义,报错处理等。
  • 之前正运动技术与大家分享了,运动控制器的固件升级、ZBasic 程序开发、ZPLC 程序开发、与触摸屏通讯和输入/输出IO 的应用、运动控制器数据与存储的应用、运动控制器ZCAN、EtherCAT 总线的使用、示波器的应用、多...
  • SSC生成EtherCAT从站代码

    千次阅读 2018-11-13 09:38:13
    SSC版本5i11。 在使用SSC生成从站代码时,导入的excel名称中最好不要有特殊符号“.”,可以使用下划线“_”。 使用“.”会带来偶然意外的问题,比如无法生成user文件,无法生成xml文件,TwinCAT无法识别出xml等。...
  • EtherCAT 之邮箱

    千次阅读 2020-05-25 15:16:52
    EtherCAT特点 由于工作需要, 最近在学习EtherCAT总线,对于主站和从站的通信,发表一下我个人的理解。 1. EtherCAT为保证低延迟高响应,不可能像MODBUS一样用软件解析数据包再转发的模式,而是采用“高速火车”...
  • EtherCAT之相识

    千次阅读 2019-05-31 11:40:39
    这次讨论一下ETHERCAT是如何工作的: 应用层-数据链路层-物理层 物理层: RJ45标准连接器;TX to FX转换器;LVDS:低电压差分信号;接收标准以太网帧结构 应用层: 通过过程数据接口(PDI:SEMC)可以连接MCU或者I/...
  • 下载ethercat源码并且安装好之后,测试ethercat使用可以遵循以下步骤: 1.开启ethercat系统:执行这一步需要确保一点,那就是按照ethercat源码中的README指导将一些需要的文件复制以及创建软连接到/opt/init.d/...
  • EtherCAT是如何工作的

    2020-09-28 09:54:23
    这次讨论一下ETHERCAT是如何工作的: 应用层-数据链路层-物理层 物理层: RJ45标准连接器;TX to FX转换器;LVDS:低电压差分信号;接收标准以太网帧结构 应用层: 通过过程数据接口(PDI:SEMC)可以连接MCU或者I/O...
  • Ethercat 学习总结一:协议总结

    万次阅读 多人点赞 2018-11-06 10:11:21
    自己学习记录用,禁止私自转载 EtherCAT 总线的国家标准相关资料,比较详细介绍了协议: ... EtherCAT(以太网控制自动化技术)是一个以以太网为基础的开放架构的现场总线系统,EtherCAT名称中的CAT为Control Au...

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 155
精华内容 62
关键字:

ethercat对象字典