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.

[参考译文] LAUNCHXL-F28P65X:需要帮助:TI C2000 F28P65x EtherCAT 从站 (CPU1 Echoback) 在 TwinCAT 3 中未达到 OP 状态

Guru**** 2988540 points

Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1609430/launchxl-f28p65x-help-needed-ti-c2000-f28p65x-ethercat-slave-cpu1-echoback-not-reaching-op-state-in-twincat-3

器件型号: LAUNCHXL-F28P65X
主题: C2000WARE 中讨论的其他器件

您好 TI 支持团队:

我正在撰写学士学位论文、需要帮助获取 TI C2000 EtherCAT 从站示例、以便与 Beckhoff PLC 主站通信并进入 OP 状态。 下面是我的设置、步骤和观察结果的详细信息。

目标:
使 TI C2000 F28P65x EtherCAT 从站与 PLC 主站通信并在 TwinCAT 3 中达到 OP 状态。

需要问题帮助:
我无法让 MCU 和 PLC 进行通信 — 当我将 TwinCAT 切换到 Config/Run 时、从站绝不会达到 OP。 扫描后、TwinCAT 检测到项 1 (EK1100)、但它不会自动找到 TI 从站。 我使用我生成的 ESI 手动添加 TI MCU 从站框并复制到 TwinCAT 目录中、然后通过 TI-slave-box > EtherCAT > Advanced Settings > ESC Access > E2‑PROM > Smart View 对 EEPROM 进行编程。 如果我删除了器件并重新扫描、则会显示 TI 从器件框、但仍然永远不会转换到 OP。 LaunchPad 上的 EtherCAT 链路/活动 LED (D11/D12) 保持熄灭。 即使电路板未连接到 PLC、TI 从站盒仍会在扫描后出现(可能是因为存在 ESI)、但不存在实际的链路或活动。 这就是我遇到的问题。

硬件:
MCU/板:TI C2000 F28P650 (LaunchPad;板载确切器件:F28P650DK9)
PLC:Beckhoff(两个标有 X000 和 X001 的以太网端口)
EtherCAT 耦合器:Beckhoff EK1100
电缆:标准以太网电缆;USB Type‑C 至 USB‑A、用于 CCS 调试/编程

软件和文件:
CCS:Code Composer Studio(请告知您是否需要确切的版本,我可以提供)
TwinCAT:TwinCAT 3(请告知您是否需要精确的构建;我可以提供)
SSC:SSC V5.12
TI 指南:EtherCAT_Suborder Device_Controller_Software_User_Guide
SSC 配置:f28p65x_ssc_config.xml
使用的示例:“3.2 Echoback CPU1 示例解决方案“
ESI:由 SSC 生成;放置在 C:/TwinCAT/3.1/Config/Io/EtherCAT 中

网络拓扑:
初始设置:
PLC X000 通过 USB‑转‑以太网适配器连接到工程 PC (TwinCAT)
PLC X001 直接连接到中的 TI LaunchPad EtherCAT
LaunchPad 通过 USB 连接到 PC 以进行 CCS 调试
更新了设置(根据 ETG 建议):
PLC X001→EK1100 X1 IN→EK1100 X2 OUT→中的 TI LaunchPad EtherCAT

执行的步骤:
将 SSC 配置“f28p65x_ssc_config.xml"导“导入 SSC V5.12。
在自定义菜单中选择了“TI F28P65x CPU1 Echoback Solution“。
从 SSC 生成的从站源代码和 ESI。
将生成的工程导入 CCS 并进行编译、加载到 F28P650、然后运行应用。
将生成的 ESI 复制到 TwinCAT 目录 C:/TwinCAT/3.1/Config/Io/EtherCAT.中

在 TwinCAT 中:
已扫描设备。
最初看到的是“Device 3 (EtherCAT)(X001)(X001)“和“Term 1 EK1100“。
使用 ESI 手动添加了 TI 从动箱。
通过 TI‑的 SLAVE‑Box > EtherCAT > Advanced Settings > ESC Access > E2‑PROM > Smart View 写入 EEPROM。
已删除器件并重新扫描;在此过程之后将显示 TI 从器件框。

当前行为和观察结果:
当我将 TwinCAT 切换到 Config/Run 时、从器件绝不会达到 OP 状态。
TwinCAT 显示了 EK1100、并在手动步骤后显示了 TI 从站框、但状态不会进展到 OP。
电路板 LED D11/D12 (EtherCAT 端口/链路/活动 LED) 始终熄灭。
即使 LaunchPad 与 PLC 物理断开并重新扫描、也可以添加 TI 从动箱(可能是由于存在 ESI)、但实际没有链路活动。
PLC 与 TI 从器件之间不会建立通信。

已尝试故障排除:
已在 TwinCAT 中验证 ESI 放置和手动添加。
在 TwinCAT 中通过智能视图对 EEPROM 进行编程。
测试了这两种拓扑(直接 PLC→LaunchPad 和 PLC→EK1100→LaunchPad)。
已确认应用程序已加载并在 CPU1 上运行。
已检查电缆并已使用 LaunchPad 上的 EtherCAT IN 端口。

问题:
F28P650 LaunchPad 上的“TI F28P65x CPU1 Echoback Solution“是否需要任何已知问题或额外步骤来到达 TwinCAT 3 中的 OP?

EEPROM 应该是从外部编程的、还是 TwinCAT 的 Smart View 对于此示例而言足够了?

我是否需要配置 F28P650 上的 PHY 或端口设置(例如配置引脚,内部 ESC 配置)才能建立链路? 这是否能解释 D11/D12 关闭的原因?

我是否应该检查特定的 AL/DL 寄存器值、以诊断为什么未达到 OP?

本示例是否需要 EK1100、或者直接 PLC→LaunchPad 是否应该正常工作? 需要注意的布线或拓扑限制?



 

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

    您好、  

    USB 转以太网适配器也可能导致问题、因为抖动更好地与支持 EtherCAT 的内置 NIC 配合使用。

    您可以跳过  EK1100 设置并尝试直接连接到笔记本电脑。

    您可以检查以下内容:  

    正如 您正在加载正确 EEPROM 的确认一样(请参阅屏幕截图)

    参考:{C2000Ware_6_00_00_00}\libraries\communications\EtherCAT\f28p65x\docs

    也可以在 main 函数中添加断点,调试并检查程序是否正常运行(它在 MainLoop () 中或其卡在某个位置) 。

    (按照相同的参考文档,您也可以首先尝试运行 f28p65x_cpu1_pdi_hal_test_app,看看其是否正常工作。)

     如果物理链路位为 1、则可以检查 ESC DL 状态 (0x0110:0x0111) 寄存器

    您可以发送 134 寄存器的屏幕截图吗?

    此致

    库纳尔。

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

    尊敬的 Kunal:

    感谢您的指导和快速答复。

    以下是我尝试过的设计和看到的设计:


    “我忘记添加一件重要的事情:   我也有一个会议从 ETG 支持团队,他们通过点击重新加载设备发送了一些帧,并检查了主服务器的在线选项卡,但它总是显示 17 帧丢失,这意味着板的物理层有严重的错误。

    “请记住、我们是在没有在 CCS 中运行任何代码的情况下执行此操作的、只是将 MCU 连接到 PLC 并通过我的笔记本电脑为其供电“

    我收到了一份文档“F28P65X Launchpad REVA Bug“、其中表明该错误是由于 2023 年错误电路板上的投影芯片被错误、并且电路板上的版本号为 MCU117B。我不确定该错误是否是我无法将 MCU 开发为 EtherCAT 从器件的原因  “

    a1) 我的笔记本电脑上实际上没有 RJ45 端口、这就是我使用耦合器的原因。


    a2) 是的、我按照文档中所示的相同方法对 EEPROM 进行编程。扫描 EtherCAT 主站后、我为我扫描了具有 EK1100 的耦合器、然后从这里显示。我使用从 SSC 生成的 ESI 手动添加 TI MCU 从动箱、并复制到 TwinCAT 目录中、然后通过 TI-slave-box > EtherCAT > Advanced Settings > ESC Access > ESC‑PROM > Smart View 对 EEPROM 进行编程。

    如果我删除了器件并重新扫描、就会出现如图 1 所示的 TI 从机框。

    重要说明:即使电路板未连接到 PLC、TI 从站盒仍会在扫描后出现(可能是因为存在 ESI)、但不存在实际的链路或活动。 这就是我遇到的问题。


    图 1“编程 EEPROM“


    有关更多上下文信息、我上传到了工作区树的另一个屏幕截图、以便您可以确认我是否使用了图 2 中所需的正确文件。


    图 2“完整的工作区树“


    也尝试像您在第 515 行和第 523 行中所示的那样添加断点、但在调试和恢复后、它将转至第 515 行、如果我停止它并再次按下它、它将转至第 246 行的 ethercat_subdevice_cpu1_hal.c 文件、如图 3 所示、如果我继续恢复并保持它多次、则切换到文件 ecatslv.c 的第 354 行


    图 3“断点调试“


    在图 4 中、可以找到您要求注册的屏幕截图。

    图 4 “注册屏幕截图“

    非常感谢您的帮助、期待收到您的答复。
    Moiz Zaheer Malik。

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

    嘿、我看到在工作区中您尚未选择 LaunchPad 的构建配置。 默认配置适用于控制卡。

    您可以执行这些设置、重建和检查吗? 。 (右键点击 project、进入 build configuration 并选择 launchxl-RAM)

    关于 Rev A 问题、您可以确认 LaunchPad 底部的序列号。

    希望这可以解决您的问题。

    此致

    库纳尔

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

    尊敬的 Kunal:

    非常感谢您的帮助。 问题在于我没有为 LaunchPad 选择正确的构建配置。 设置完成后、当我在配置模式下运行时、从器件和主器件都达到 OP、D12 LED 亮起绿色。

    TI 或任何其他文档中均未提及这一点。

    但您是如何确定这可能是问题所在的。

    非常感谢您的指导和耐心。 再次感谢!



    图 1.



    图 2.

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

    您好,看到了您分享的屏幕截图,然后看到您使用的是 launchpad 但未在构建配置中提及. 这是运行 TI 的任何标准示例、 根据 controlCard 和 Launchpad 选择构建配置的标准件。 我们将在下一个版本中修复文档

    谢谢。

    库纳尔。

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

    您好、现在我遇到的当前问题是、当我在运行模式下运行完全相同的项目时、正如您在屏幕短路中看到的那样、它给了我以下错误、并且当我更改 LED 的值时、开关的值也不会改变、但在配置模式下工作正常。



    从设备的联机状态也是空的、您可以在下面的屏幕截图中看到  




    但主器件的在线状态为 PREOP




    方法 2.

    我尝试了另一种方法、在构建配置中选择了 LAUNCHXL-RAM    、但在“Run"选项“选项卡中选择了 CCS 中的闪存工程

     

    我还将 TI MCU 直接连接到 PLC、而不是使用 EK1100 作为桥接器  

    我遵循了完全相同的流程之前扫描它,编程的 EEPROM 和后重新扫描它  
    在这之前,主器件和从器件都工作正常,都处于运行状态。

    但是、当我    通过点击此图标在运行模式下运行它时、现在不会出现任何错误、但通信无法正常工作。例如、如果我点击 LED 1 并将其值更改为“1",“,预期、预期行为应该是开关 1 的值也应该从“0"更“更改为“1",“,但、但这没有发生。


                 LED 1 为高电平                   开关 1 为低电平  

    但没有显示错误



    此外、MCU 上的 LED D12(绿色 LED)保持闪烁

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

    您好、

    写入仅在 CONFIG 模式下发生。

    关于:  

    “方法 2

    我尝试了另一种方法、在构建配置中选择了 LAUNCHXL-RAM    、但在“Run"选项“选项卡中选择了 CCS 中的闪存工程

    不明白你能发送屏幕截图。

    如果要从闪存运行、请选择 launchxl_flash。

    此致

    库纳尔。

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

    你好 Kunal。
    首先、我非常感谢您的帮助、耐心以及您的快速答复。 我们非常接近实现本项目的最终目标、如果您能帮助我完成该项目的最后阶段、我将不胜感激。

    1) 首先,我会解决方法#2 与你,然后
    2) 我将解释我的项目的主要目标,我们非常接近实现它  



    1) 方法 2 讨论

    相关 方法 2.  我在前面提到过。

    我想说的是、我没有在 RAM 中运行代码、而是尝试通过构建配置使用闪存运行代码、如下图所示。

    此方法也适用于配置模式 、但在运行模式下运行时不起作用  。


    图 1“选择构建配置“LAUNCHXL-FLASH"</s>“


    图 2“选择 Flash 项目“。

    执行此操作后、它最初会出现此错误、如下图 3 所示


    图 3“ EEPROM 编程后出现错误“

    删除主器件“Device 3“和从器件“Box 1“并重新扫描后、此错误将消失、它在配置模式下工作正常、   但在运行模式下  回显示例无法正常工作。  

     主设备“设备 3“和从设备“框 1“的状态都在“ PREOP “  




    2) 项目的主要目标  

    请求: 您可以检查它或在您自己的设备上运行它、看看它是否正常工作吗?您还可以向我解释工作流程如何做到这一点  

    因此、该项目的主要目标是

    1:从 PLECS 设计控制器模型  
    2:生成其代码.c /.h 文件  
    3:在 SSC 中创建自定义 PDO 并生成文件  
    4:将通过 SSC 和 PLECS 生成的代码生成的所有文件集成到 CCS 中

    因此、我在 PLECS 中设计的控制器代码是一个非常简单的代码、如果我们从 TwinCAT 发送>0 的 LEDSetpoint、MCU 上的 LED 4 和 LED 5 应该会亮起、就是这样  

    在这里、我将上传图 4 中设计的模型的图片。
    我还将附上所生成代码的.c 和.h 填充。



    图 4 :PLECS 控制器型号

    模型的.c 文件。

    /*
     * Implementation file for: LED_controller blink twincat test/led_controller
     * Generated with         : PLECS 4.9.8
     * Generated on           : 26 Nov 2025 09:55:02
     */
    #include "led_controller.h"
    #ifndef PLECS_HEADER_led_controller_h_
    #error The wrong header file "led_controller.h" was included. Please check
    #error your include path to see whether this file name conflicts with the
    #error name of another header file.
    #endif /* PLECS_HEADER_led_controller_h_ */
    #if defined(__GNUC__) && (__GNUC__ > 4)
    #   define _ALIGNMENT 16
    #   define _RESTRICT __restrict
    #   define _ALIGN __attribute__((aligned(_ALIGNMENT)))
    #   if defined(__clang__)
    #      if __has_builtin(__builtin_assume_aligned)
    #         define _ASSUME_ALIGNED(a) __builtin_assume_aligned(a, _ALIGNMENT)
    #      else
    #         define _ASSUME_ALIGNED(a) a
    #      endif
    #   else
    #      define _ASSUME_ALIGNED(a) __builtin_assume_aligned(a, _ALIGNMENT)
    #   endif
    #else
    #   ifndef _RESTRICT
    #      define _RESTRICT
    #   endif
    #   ifndef _ALIGN
    #      define _ALIGN
    #   endif
    #   ifndef _ASSUME_ALIGNED
    #      define _ASSUME_ALIGNED(a) a
    #   endif
    #endif
    #include <stdint.h>
    #include <stdbool.h>
    #include <math.h>
    #include <string.h>
    #define PLECSRunTimeError(msg) led_controller_errorStatus = msg
    #define led_controller_UNCONNECTED 0
    static uint32_t led_controller_tickLo;
    static int32_t led_controller_tickHi;
    led_controller_ExternalInputs led_controller_U;
    led_controller_ExternalOutputs led_controller_Y;
    led_controller_BlockOutputs led_controller_B;
    const char * led_controller_errorStatus;
    const float led_controller_sampleTime = 0.001f;
    const char * const led_controller_checksum =
       "24ac5794f297441319d1d42cd36ddc15eadbe0ab";
    void led_controller_initialize(float time)
    {
       float remainder;
       led_controller_errorStatus = NULL;
       led_controller_tickHi =
          floor(time/(4294967296.0*led_controller_sampleTime));
       remainder = time - led_controller_tickHi*4294967296.0*
                   led_controller_sampleTime;
       led_controller_tickLo = floor(remainder/led_controller_sampleTime + .5);
       remainder -= led_controller_tickLo*led_controller_sampleTime;
       if (fabsf(remainder) > 1e-6*fabsf(time))
       {
          led_controller_errorStatus =
             "Start time must be an integer multiple of the base sample time.";
       }
    }
    
    void led_controller_output(void)
    {
       if (led_controller_errorStatus)
       {
          return;
       }
    
       /* Relational Operator : 'led_controller/Relational\nOperator'
        * incorporates
        *  Signal Inport : 'led_controller/led_u'
        *  Constant : 'led_controller/Constant'
        */
       led_controller_B.RelationalOperator = led_controller_U.led_u > 0.f;
    
       /* Global output signals */
       led_controller_Y.led5_cmd = led_controller_B.RelationalOperator;
       led_controller_Y.led4_cmd = led_controller_B.RelationalOperator;
    
    }
    
    void led_controller_update(void)
    {
       if (led_controller_errorStatus)
       {
          return;
       }
    }
    
    void led_controller_terminate(void)
    {
    }
    



    模型的.h 文件  
    /*
     * Header file for: LED_controller blink twincat test/led_controller
     * Generated with : PLECS 4.9.8
     * Generated on   : 26 Nov 2025 09:55:02
     */
    #ifndef PLECS_HEADER_led_controller_h_
    #define PLECS_HEADER_led_controller_h_
    
    #include <stdbool.h>
    #include <stdint.h>
    
    /* Model floating point type */
    typedef float led_controller_FloatType;
    
    /* Model checksum */
    extern const char * const led_controller_checksum;
    
    /* Model error status */
    extern const char * led_controller_errorStatus;
    
    
    /* Model sample time */
    extern const float led_controller_sampleTime;
    
    
    /* External inputs */
    typedef struct
    {
       float led_u;                     /* led_controller/led_u */
    } led_controller_ExternalInputs;
    extern led_controller_ExternalInputs led_controller_U;
    
    
    /* External outputs */
    typedef struct
    {
       bool led5_cmd;                   /* led_controller/led5_cmd */
       bool led4_cmd;                   /* led_controller/led4_cmd */
    } led_controller_ExternalOutputs;
    extern led_controller_ExternalOutputs led_controller_Y;
    
    
    /* Block outputs */
    typedef struct
    {
       bool RelationalOperator;         /* led_controller/Relational Operator */
    } led_controller_BlockOutputs;
    extern led_controller_BlockOutputs led_controller_B;
    
    /* Entry point functions */
    void led_controller_initialize(float time);
    void led_controller_output(void);
    void led_controller_update(void);
    void led_controller_terminate(void);
    
    #endif /* PLECS_HEADER_led_controller_h_ */
    


    我制作的 PDO 的 Excel 工作表  


     
    用于更好地理解的方框图。


    谢谢你。
    Moiz.






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

    您好、  

    1. 正如我在回显示例中所说的,写入到 led 只能在配置模式下工作。 EEPROM 编程后,关闭并重新打开主板电源(移除电源,保持 10-15 秒)尝试再次刷新程序。 (选择“flash project option“时的区别是、程序加载在 ram 存储器或闪存中、这取决于选择的是 launchxl-ram 还是选择了 launchxl-flash)  

    (参考: EtherCAT_Subordinate Device_Controller_Software_User_Guide 存在于 SDK 中)

    2.不幸的是,我不能在我们这边测试自定义代码   

    此致

    库纳尔。