This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F28388D:如何从 EtherCAT 示例更改 PDO

Guru**** 2369730 points
Other Parts Discussed in Thread: C2000WARE
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1042918/tms320f28388d-how-to-change-the-pdo-from-the-ethercat-example

主题中讨论的其他器件:C2000WARE

大家好、

我对 EtherCAT 和 C2000 uC 比较陌生、我对使用 F2838D 的 EtherCAT 有一些疑问。 我介绍了 C2000Ware 库中的 EtherCAT 示例。  f2838x_CPU1_echoback_solution 运行良好。

现在、我想根据我的应用更改 PDO。 假设我要发送2x int_16并从 TwinCAT 主站接收2x int_16变量、最简单的方法是什么?

根据我的理解、我们从 SSC 开始、创建一个新项目并导入 已包含 PDO 的 XML 文件 f2838x_sc_config。 如何生成相同类型的文件? 我是否需要手动编辑此 XML 以适合我的应用程序?

另外、TI F2838x CPU1样片(包含样片应用) TI F2838x CPU1样片之间有何区别?  生成要 在 CCS 中导入的"示例应用程序"?

谢谢你

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    ET9300应用手册是了解 SSC 实现和如何添加对象的好参考

    https://download.beckhoff.com/download/document/io/ethercat-development-products/an_et9300_v1i8.pdf

    您还可以从以下主题中找到一些相关信息

    https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/683485/tidm-delfino-ethercat-process-data-mapping

    谢谢、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢你 Ranjith

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    您还可以利用 ETG 成员领域的开发人员论坛来解决任何 SSC 相关问题。

    谢谢、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Ranjith:

    我使用 TI F2838x CPU1样片无样片创建了一个新应用:
     

    并按如下方式填充 Excel:

    它基本上只有一个输入和一个输出。 我生成了从文件并将其导入 CCS。 我想实现 APPL_InputMapping()和 APPL_OutputMapping(),如下所示:

    void APPL_InputMapping(UINT16* pData)
    {
        uint16_t j = 0;
        uint16_t *pTmpData = (uint16_t *)pData;
        uint16_t data;
    
    
       for (j = 0; j < sTxPDOassign.u16SubIndex0; j++)
       {
          switch (sTxPDOassign.aEntries[j])
          {
          /* TxPDO  */
          case 0x1A00: // 8 bits
              data = Result0x6000;
    
              * (volatile uint16_t *)pTmpData = data;
    
             break;
          }
       }
    }
    
    
    void APPL_OutputMapping(UINT16* pData)
    {
        uint16_t j = 0;
        uint16_t *pTmpData = (uint16_t *)pData;// allow byte processing
        uint16_t data = 0;
        for (j = 0; j < sRxPDOassign.u16SubIndex0; j++)
        {
            switch (sRxPDOassign.aEntries[j])
            {
            /* RxPDO */
            case 0x1600: //byte (8 bits)
                data = (*(volatile uint16_t *)pTmpData);
                Value0x7000 = data;
                break;
            }
        }
    }

    但未定义 Result0x6000和 Value0x7000。

    如果我选中 F2838x_CPU1_EtherCAT_Slave_1in1out1Objects.h、则看不到我的变量声明:

    /*
    * This source file is part of the EtherCAT Slave Stack Code licensed by Beckhoff Automation GmbH & Co KG, 33415 Verl, Germany.
    * The corresponding license agreement applies. This hint shall not be removed.
    */
    
    /**
    * \addtogroup F2838x_CPU1_EtherCAT_Slave_1in1out1 F2838x_CPU1_EtherCAT_Slave_1in1out1
    * @{
    */
    
    /**
    \file F2838x_CPU1_EtherCAT_Slave_1in1out1Objects
    \author ET9300Utilities.ApplicationHandler (Version 1.5.0.0) | EthercatSSC@beckhoff.com
    
    \brief F2838x_CPU1_EtherCAT_Slave_1in1out1 specific objects<br>
    \brief NOTE : This file will be overwritten if a new object dictionary is generated!<br>
    */
    
    #if defined(_F2838X__CPU1__ETHER_CAT__SLAVE_1IN1OUT1_) && (_F2838X__CPU1__ETHER_CAT__SLAVE_1IN1OUT1_ == 1)
    #define PROTO
    #else
    #define PROTO extern
    #endif
    /******************************************************************************
    *                    Object 0x1C12 : SyncManager 2 assignment
    ******************************************************************************/
    /**
    * \addtogroup 0x1C12 0x1C12 | SyncManager 2 assignment
    * @{
    * \brief Object 0x1C12 (SyncManager 2 assignment) definition
    */
    #ifdef _OBJD_
    /**
    * \brief Entry descriptions<br>
    * 
    * Subindex 0<br>
    */
    OBJCONST TSDOINFOENTRYDESC    OBJMEM asEntryDesc0x1C12[] = {
    { DEFTYPE_UNSIGNED8 , 0x8 , ACCESS_READ }};
    
    /**
    * \brief Object name definition<br>
    * For Subindex 1 to n the syntax 'Subindex XXX' is used
    */
    OBJCONST UCHAR OBJMEM aName0x1C12[] = "SyncManager 2 assignment\000\377";
    #endif //#ifdef _OBJD_
    
    #ifndef _F2838X__CPU1__ETHER_CAT__SLAVE_1IN1OUT1_OBJECTS_H_
    /**
    * \brief Object structure
    */
    typedef struct OBJ_STRUCT_PACKED_START {
    UINT16   u16SubIndex0;  /**< \brief Subindex 0 */
    } OBJ_STRUCT_PACKED_END
    TOBJ1C12;
    #endif //#ifndef _F2838X__CPU1__ETHER_CAT__SLAVE_1IN1OUT1_OBJECTS_H_
    
    /**
    * \brief Object variable
    */
    PROTO TOBJ1C12 sRxPDOassign
    #if defined(_F2838X__CPU1__ETHER_CAT__SLAVE_1IN1OUT1_) && (_F2838X__CPU1__ETHER_CAT__SLAVE_1IN1OUT1_ == 1)
    ={0}
    #endif
    ;
    /** @}*/
    
    
    
    /******************************************************************************
    *                    Object 0x1C13 : SyncManager 3 assignment
    ******************************************************************************/
    /**
    * \addtogroup 0x1C13 0x1C13 | SyncManager 3 assignment
    * @{
    * \brief Object 0x1C13 (SyncManager 3 assignment) definition
    */
    #ifdef _OBJD_
    /**
    * \brief Entry descriptions<br>
    * 
    * Subindex 0<br>
    */
    OBJCONST TSDOINFOENTRYDESC    OBJMEM asEntryDesc0x1C13[] = {
    { DEFTYPE_UNSIGNED8 , 0x8 , ACCESS_READ }};
    
    /**
    * \brief Object name definition<br>
    * For Subindex 1 to n the syntax 'Subindex XXX' is used
    */
    OBJCONST UCHAR OBJMEM aName0x1C13[] = "SyncManager 3 assignment\000\377";
    #endif //#ifdef _OBJD_
    
    #ifndef _F2838X__CPU1__ETHER_CAT__SLAVE_1IN1OUT1_OBJECTS_H_
    /**
    * \brief Object structure
    */
    typedef struct OBJ_STRUCT_PACKED_START {
    UINT16   u16SubIndex0;  /**< \brief Subindex 0 */
    } OBJ_STRUCT_PACKED_END
    TOBJ1C13;
    #endif //#ifndef _F2838X__CPU1__ETHER_CAT__SLAVE_1IN1OUT1_OBJECTS_H_
    
    /**
    * \brief Object variable
    */
    PROTO TOBJ1C13 sTxPDOassign
    #if defined(_F2838X__CPU1__ETHER_CAT__SLAVE_1IN1OUT1_) && (_F2838X__CPU1__ETHER_CAT__SLAVE_1IN1OUT1_ == 1)
    ={0}
    #endif
    ;
    /** @}*/
    
    
    
    /******************************************************************************
    *                    Object 0xF000 : Modular Device Profile
    ******************************************************************************/
    /**
    * \addtogroup 0xF000 0xF000 | Modular Device Profile
    * @{
    * \brief Object 0xF000 (Modular Device Profile) definition
    */
    #ifdef _OBJD_
    /**
    * \brief Object entry descriptions<br>
    * <br>
    * SubIndex 0<br>
    * SubIndex 1 - Index distance <br>
    * SubIndex 2 - Maximum number of modules <br>
    */
    OBJCONST TSDOINFOENTRYDESC    OBJMEM asEntryDesc0xF000[] = {
    { DEFTYPE_UNSIGNED8 , 0x8 , ACCESS_READ },
    { DEFTYPE_UNSIGNED16 , 0x10 , ACCESS_READ }, /* Subindex1 - Index distance  */
    { DEFTYPE_UNSIGNED16 , 0x10 , ACCESS_READ }}; /* Subindex2 - Maximum number of modules  */
    
    /**
    * \brief Object/Entry names
    */
    OBJCONST UCHAR OBJMEM aName0xF000[] = "Modular Device Profile\000"
    "Index distance \000"
    "Maximum number of modules \000\377";
    #endif //#ifdef _OBJD_
    
    #ifndef _F2838X__CPU1__ETHER_CAT__SLAVE_1IN1OUT1_OBJECTS_H_
    /**
    * \brief Object structure
    */
    typedef struct OBJ_STRUCT_PACKED_START {
    UINT16 u16SubIndex0;
    UINT16 IndexDistance; /* Subindex1 - Index distance  */
    UINT16 MaximumNumberOfModules; /* Subindex2 - Maximum number of modules  */
    } OBJ_STRUCT_PACKED_END
    TOBJF000;
    #endif //#ifndef _F2838X__CPU1__ETHER_CAT__SLAVE_1IN1OUT1_OBJECTS_H_
    
    /**
    * \brief Object variable
    */
    PROTO TOBJF000 ModularDeviceProfile0xF000
    #if defined(_F2838X__CPU1__ETHER_CAT__SLAVE_1IN1OUT1_) && (_F2838X__CPU1__ETHER_CAT__SLAVE_1IN1OUT1_ == 1)
    ={2,0x0010,0}
    #endif
    ;
    /** @}*/
    
    
    
    
    
    
    
    #ifdef _OBJD_
    TOBJECT    OBJMEM ApplicationObjDic[] = {
    /* Object 0x1C12 */
    {NULL , NULL ,  0x1C12 , {DEFTYPE_UNSIGNED16 , 0 | (OBJCODE_ARR << 8)} , asEntryDesc0x1C12 , aName0x1C12 , &sRxPDOassign , NULL , NULL , 0x0000 },
    /* Object 0x1C13 */
    {NULL , NULL ,  0x1C13 , {DEFTYPE_UNSIGNED16 , 0 | (OBJCODE_ARR << 8)} , asEntryDesc0x1C13 , aName0x1C13 , &sTxPDOassign , NULL , NULL , 0x0000 },
    /* Object 0xF000 */
    {NULL , NULL ,  0xF000 , {DEFTYPE_RECORD , 2 | (OBJCODE_REC << 8)} , asEntryDesc0xF000 , aName0xF000 , &ModularDeviceProfile0xF000 , NULL , NULL , 0x0000 },
    {NULL,NULL, 0xFFFF, {0, 0}, NULL, NULL, NULL, NULL}};
    #endif    //#ifdef _OBJD_
    #undef PROTO
    
    /** @}*/
    #define _F2838X__CPU1__ETHER_CAT__SLAVE_1IN1OUT1_OBJECTS_H_
    

    通常情况下、它应该由 SSC 直接生成、对吧?

     正如 Dawid Balcertzak 3年前所问的、 如果您有一本有关如何为  C2000创建应用的手册、那将会很好。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    该工具应生成头文件。 在这种情况下,不清楚为什么不发生这种情况。 导入 Excel 时是否看到任何错误? 我有一个问题是、如果只有一个变量、那么输入和输出数据为什么是类型记录。 这些不应该是变量类型?

    谢谢、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我使用了记录、以便将来可以添加更多变量。

    我尝试过几次、当我创建新应用程序时、SSC 会打开 Excel 并直接解析文件并创建空 Excel 的 PDO。 它 不会等到我填充 Excel 工作表... 因此,这就是为什么我的变量都没有在 Object.h 中声明的原因。

    现在我修复了这个问题,我可以看到我的变量在 Object.h 中声明,但是如果我尝试编译并得到几个错误:

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    请注意、SSC 工具问题已修复、并且您看到生成的对象。

    谢谢、