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.

[参考译文] AM2434:EtherCAT 从站控制器寄存器 0x0910-0x0917 中的系统时间

Guru**** 2828555 points

Other Parts Discussed in Thread: AM2434, TIDEP-01032

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1598297/am2434-system-time-in-ethercat-slave-controller-register-0x0910-0x0917

器件型号: AM2434
主题: TIDEP-01032 中讨论的其他器件

尊敬的 TI 专家:

我们正在 AM2434 微控制器上使用 EtherCAT 接口开发应用。 我们使用的是工业通信 SDK V11.00.00。  

对于我们的应用、我们需要一个时间戳。 我们最喜欢的解决方案是使用 EtherCAT 系统时间。 我们正尝试从 EherCAT 从控制寄存器 0x0910-0x0917 读取此信息。 但是、存在意外行为。 我不确定我是否遗漏了一些东西或是否存在另一个问题。

出现了两个问题:

  1. 寄存器 0x0914-0x0917 中的值未更新。 此器件连接到 EtherCAT 主站 (Beckhoff IPC)、并在直流同步模式下运行。 我看到、当我将系统切换到运行模式时、最初设置寄存器中的值。 之后、只有 0x0910-0x0913 中的值在变化。 应该每~4 秒发生一次溢出、导致较高寄存器发生变化、但不会发生这种情况。
    我还尝试使用 TwinCAT 读取从器件的寄存器值。 在这里更新了这些值。 读取寄存器后、如果在控制器应用中读取这些值、还可以在寄存器中看到更新的值。
    我是否需要调用任何函数来更新系统时间寄存器 0x0914-0x0917? 还是我遗漏了其他东西?
  2. 如果我们的器件未连接到任何 EtherCAT 主站、则系统时间始终显示为 0。 这是正常的 bevaviour 吗? 我本以为设备有一个从零开始的“本地时间“。

我´ve 两种读取寄存器的方法:

  1. 使用指向寄存器地址的指针进行直接访问
  2. 使用 ecSlvApi_esc.h 中的 EtherCAT Slave API 函数 EC_API_SLV_readDoubleWordEscRegister ()  

这两种方式的行为是相同的。

提前感谢您的支持!

此致、
基督教

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我是否需要调用任何函数来更新系统时间寄存器 0x0914-0x0917? 或者我缺少其他东西吗?

    您是否可以尝试使用 AM243x 工业通信 SDK:适用于 EtherCAT 协议栈的计时器 API bsp_get_local_sys_time

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

    感谢您的答复!  
    我也尝试了此函数、但它给了我一个异常(数据中止,很明显在函数内)。 我´ve 看到还有几个其他 BSP_xx 函数需要初始化。 这些项链是要调用之前? 似乎发生了很多基本初始化、我认为这肯定是之前发生的。

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

    尊敬的 Christian:  

    所以我尝试  使用 bsp_get_local_sys_time () API 用 EtherCAT 子器件 Beckhoff SSC 演示记录系统时间寄存器 (0x910 - 0x917):

    ====== EtherCAT System Time Reading ======
    System Time Low:  0x2b19adb3
    System Time High: 0x0b5eb047
    Complete Time: 0x0b5eb0472b19adb3
    ======================================
    ====== EtherCAT System Time Reading ======
    System Time Low:  0x676b81cc
    System Time High: 0x0b5eb047
    Complete Time: 0x0b5eb047676b81cc
    ======================================
    ====== EtherCAT System Time Reading ======
    System Time Low:  0xa3bd77ac
    System Time High: 0x0b5eb047
    Complete Time: 0x0b5eb047a3bd77ac
    ======================================
    ====== EtherCAT System Time Reading ======
    System Time Low:  0xe00f6341
    System Time High: 0x0b5eb047
    Complete Time: 0x0b5eb047e00f6341
    ======================================
    ====== EtherCAT System Time Reading ======
    System Time Low:  0x1c614870
    System Time High: 0x0b5eb048
    Complete Time: 0x0b5eb0481c614870
    ======================================
    ====== EtherCAT System Time Reading ======
    System Time Low:  0x58b32f4e
    System Time High: 0x0b5eb048
    Complete Time: 0x0b5eb04858b32f4e
    ======================================
    ====== EtherCAT System Time Reading ======
    System Time Low:  0x95050e36
    System Time High: 0x0b5eb048
    Complete Time: 0x0b5eb04895050e36
    ======================================
    ====== EtherCAT System Time Reading ======
    System Time Low:  0xd156f0ed
    System Time High: 0x0b5eb048
    Complete Time: 0x0b5eb048d156f0ed
    ======================================
    ====== EtherCAT System Time Reading ======
    System Time Low:  0x0da8d28c
    System Time High: 0x0b5eb049
    Complete Time: 0x0b5eb0490da8d28c
    ======================================
    ====== EtherCAT System Time Reading ======
    System Time Low:  0x49fabcc3
    System Time High: 0x0b5eb049
    Complete Time: 0x0b5eb04949fabcc3
    ======================================
    ====== EtherCAT System Time Reading ======
    System Time Low:  0x864c7d76
    System Time High: 0x0b5eb049
    Complete Time: 0x0b5eb049864c7d76
    ======================================
    ====== EtherCAT System Time Reading ======
    System Time Low:  0xc29e856f
    System Time High: 0x0b5eb049
    Complete Time: 0x0b5eb049c29e856f
    ======================================
    ====== EtherCAT System Time Reading ======
    System Time Low:  0xfef04008
    System Time High: 0x0b5eb049
    Complete Time: 0x0b5eb049fef04008
    ======================================
    ====== EtherCAT System Time Reading ======
    System Time Low:  0x3b424aec
    System Time High: 0x0b5eb04a
    Complete Time: 0x0b5eb04a3b424aec
    ======================================

    我还使用 bsp_read_byte () API 读取了寄存器、并且观察到 0x914-0x917 在 0x910-0x913 溢出后递增。 这确认固件正确处理 0x914-0x917。

    使用指向寄存器地址的指针进行直接访问

    我已经尝试使用以下代码的指针读取寄存器并查看预期结果:

        // Get base address of shared RAM
        uint8_t *pEscBase = (uint8_t *)(((PRUICSS_HwAttrs *)(pruIcssHandle->hwAttrs))->baseAddr + PRUICSS_SHARED_RAM);
        
        // Create pointers to the system time registers
        uint32_t *pSysTimeLow = (uint32_t *)(pEscBase + 0x910);
        uint32_t *pSysTimeHigh = (uint32_t *)(pEscBase + 0x914);
        
        // Read values using pointer dereferencing
        uint32_t ptr_systime_low = *pSysTimeLow;
        uint32_t ptr_systime_high = *pSysTimeHigh;
        
        // Print header for the pointer-based reading
        DebugP_log("==== System Time via Pointer Access ====\n\r");
        
        // Print the low part (32 bits)
        DebugP_log("System Time Low:  0x%08x\n\r", ptr_systime_low);
        
        // Print the high part (32 bits)
        DebugP_log("System Time High: 0x%08x\n\r", ptr_systime_high);
        
        // Print the complete 64-bit time as a summary
        DebugP_log("Complete Time: 0x%08x%08x\n\r", ptr_systime_high, ptr_systime_low);
        DebugP_log("======================================\n\r");

    您能分享您尝试读取系统时间的代码吗? 我也可以尝试从我这边运行相同的。

    此致、
    Aaron

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

    您好 Aaron、

    感谢您的答复。 非常有趣 基本上、您的代码与我的代码没有太大不同。 我´ve 了两个版本、结果相同:

    第一个版本 (ESL_CONTROLLER_REGISTER::偏移= 0x30090000):

        volatile uint32_t* esc32 = (volatile uint32_t*) ESL_controller_register::OFFSET;
        // Read registers
        volatile uint32_t lo1 = esc32[0x0910u / 4u]; // 0x0910..0x0913
        volatile uint32_t hi  = esc32[0x0914u / 4u]; // 0x0914..0x0917
        volatile uint32_t lo2 = esc32[0x0910u / 4u]; // read again for overflow detection
        // Overflow during read?
        if (lo2 < lo1)
        {
            hi  = esc32[0x0914u / 4u];
            lo1 = lo2;
        }
        uint64_t t = ((uint64_t) hi << 32) | lo1;
        debugPrint(MessageLevelEnum::status, DebugSourceEnum::EVENTHANDLER, "Hi: %u, Lo: %u, Time %llu\r\n", hi, lo1, t);
    第二个版本:
        uint32_t low  = 0;
        uint32_t high = 0;
        EC_API_SLV_readDoubleWordEscRegister(p_ethercat_stack->get_ec_slv_handle(), 0x0910, &low);
        EC_API_SLV_readDoubleWordEscRegister(p_ethercat_stack->get_ec_slv_handle(), 0x0914, &high);
     
    我无法相信、读取寄存器值时会出现问题。 如前所述、我获得某些“事件“时间点的正确值(使用 TwinCAT 读取寄存器值,将从设备连接到主设备)。 我们的应用基于 《TIDEP-01032 EtherCAT 连接单芯片双伺服电机驱动参考设计》。 我们仅使用 Kunbus 包装器来控制 EtherCAT 接口、BSP_xx 函数在代码中的任何位置都不使用。 您认为这可能会有所不同吗?
    此致、
    基督教
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Christian:

    看起来线程错误地得到了“解决“?

    如前所述、我可以获得特定“事件“时间点的正确值(将我们的从站连接到主站,使用 TwinCAT 读取寄存器值)

    您能提供网络拓扑吗? 网络中是否有多个 EtherCAT 节点? 这里的第一个节点是否被视为 DUT?

    此外、当您说在对相应空间进行 TwinCAT 读取后值正在更新时、您是否进行一次性连续读取或读取(自动重新加载)?

    您认为这可能会有什么不同吗?

    我预计 API 不会有任何问题、因为指针读取本身不会返回预期值。 基于拓扑、我怀疑系统时间是否按预期更新。 您是否还可以从 CCS Memory Browser(“View"->"Memory Browser"“ Browser")“)监视“ 监视系统时间寄存器 (0x30090910 - 0x30090917)

    确保在视图中启用“Continuous Refresh“(连续刷新)。 这将提供有关值是否在没有任何干扰的情况下得到更新的信息。

    此外、如果可能、请共享 ICSS 存储器转储:

    • 0x30080000 - 0x300C0000、用于 ICSSG1
    • 对于 ICSSG0、为 0x30000000 - 0x30040000

    根据测试环境的拓扑结构、我可以提供更多详细信息。

    此致、
    Aaron

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

    尊敬的 Araron:

    是的、我不小心检查了“这解决了我的问题“、抱歉! 问题仍然存在。

    该拓扑如下所示:Beckhoff IPC(主器件)=> Beckhoff 轴控制器(第一个从器件)=>我们的器件(第二个从器件)

    不幸的是,我无法找到时间来处理这个问题。 我只是进行了快速测试并调试应用以检查寄存器。 在调试会话期间、它实际上看起来好像在按应该的方式工作。 之前的测试都是在从闪存启动版本构建时完成的。 我想您的测试也是使用了调试构建的吗?  

    我需要在圣诞假期后对此进行更深入的研究。 我´ll 在 1 月 7 日回到办公室,并提供你要求的其他信息。

    再次感谢您的大力支持! 我祝你圣诞快乐。

    此致
    基督教

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

    尊敬的 Christian:

    当然、我将使用更多详细信息更新该主题。

    快乐的假期&新年快乐!

    此致、
    Aaron

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

    尊敬的 Christian:

    因此、为了提供系统工作时间的背景信息、 主器件 (TwinCAT) 发送 4 个字节的 ARMW、这将读取第一个(参考)节点的系统时间、然后将该数据写入其余节点。

    由于会向第一个节点发出读取命令、ESC 会在内部从 IEP 寄存器更新 ESC 寄存器的所有 8 个字节。
    对于其余节点、写入操作仅更新 4 个字节(因为数据报长度为 4 个字节)、因此 0x914 - 0x917 寄存器未更新。 只有向非基准节点(从 TwinCAT 读取)发出读取数据报时、才会更新 0x914-0x917、这就是您从主器件读取时看到更高 32 位更新的原因。

    Beckhoff IPC (master)=> Beckhoff 轴控制器(第一个从器件)=>我们的器件(第二个从器件)

    要使用以下拓扑进行扩展: Beckhoff IPC(主器件)=> AM243x(第一个从器件或基准从器件)=> Beckhoff 轴控制器(第二个从器件)、您将看到 AM243x 上的 0x910 - 0x917 寄存器正在更新。

    我认为这澄清了系统时间实现。 如果您对此有进一步的疑问、请告诉我。

    此致、
    Aaron

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

    您好 Aaron、

    非常感谢您提供的其他信息。 这很有帮助、可以解决这个问题。 我可以准确地看到我们的器件出现了这种行为。

    螺纹可以关闭。 感谢您的大力支持!

    此致、
    基督教