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**** 2794665 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.不幸的是,我不能在我们这边测试自定义代码   

    此致

    库纳尔。