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.

[参考译文] AM261-AM261x-EVM:SOM EtherNet/IP–配置组装、定制服务和空闲/运行标头问题

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1616301/am261-som-evm-am261x-ethernet-ip-configuration-assembly-custom-services-and-idle-run-header-questions

器件型号: AM261-EVM-EVM SOM

您好、

我目前正在上从事 EtherNet/IP 工作 AM261-LP 消息流 IND_COMMS_SDK_am261x_2025_00_07 。 我正在使用 hilsher EtherNet/IP 工具 AS (PLC/MASTER)。 我有以下几个问题:

  1. 配置装配体

  2. 自定义服务

  3. 怠速/运行收割台处理

我希望澄清以下几点。


主题 1 — 配置参数

Q1–如何从工程工具触发配置装配体?

我怎么会这样呢 配置组件 以触发配置回调?

目前、要执行回调、我临时将(在连接路径中)输出程序集 (0x65)(通用设备示例的)替换为配置程序集(我创建的:ID:0x28)。 这是有效的、但我认为这不是正确的方法。

什么是正确的方法:

  • 配置器件、使该工具发送配置数据?

  • 确保在 ForwardOpen 请求期间触发了配置回调?


Q2–装配体成员自定义映射行为

对于每个配置参数:

  • 我打电话 EI_API_CIP_addAssemblyMemberCustomMapped()

  • 启动assembCustomMapCfg.assemblyMemberLength出现问题

  • 已注册 a 设置回调

我的期望:

  • 应根据配置参数触发回调。

观察到的行为:

  • 该回调只调用一次

  • 属性 ID 对应于第一个注册属性

为什么没有根据配置参数单独触发回调?
是否将配置程序集作为单个块处理、而不是按成员处理? 这样用户就有责任解析它?


Q3–o2t_pt2o_p配置回调中和的含义

关于此堆栈回调:

typedef uint32_t(*EI_API_CIP_CBCfgAssemblySimple)(
    EI_API_CIP_NODE_T* pCipNode_p,
    uint16_t o2t_p,
    uint16_t t2o_p,
    uint16_t cfg_inst_p,
    const uint8_t* const cfg_data,
    uint16_t cfg_data_size
);

以下的确切含义是什么:

  • o2t_p

  • t2o_p

它们代表什么信息?

准确解释它们所代表的内容将会有所帮助。


主题 2–定制服务

Q1–栈回调与用户回调

实施自定义服务时:

  • 而设计的 堆栈回调 触发的

  • 用户回调 从不调用

为什么会发生这种情况?

是否存在可能缺失的必需注册步骤?
这是否与堆栈内的类/服务所有权有关?

 

主题 3–汇编空闲/运行标头

Q1–适用性

是空闲/运行标头:

  • 仅适用于输出 (O→T) 组件?

  • 还是用于输入 (T→O) 组件?


Q2–更改运行→空闲状态

如何从 Hilsher 工具更改 Idle/Run 标头值 (Run→Idle)?


Q3–轮询模式+空闲/运行接头

对于循环数据、我使用轮询(无回调)。

若要读取汇编数据、我使用:

EI_API_CIP_getAssemblyData()

观察结果:

  • 该 API 只接受循环 I/O 大小(没有 4 字节空闲/运行标头)。

  • 它不允许使用更大的缓冲区(包括标头)。

  • 我的输出程序集只有 1 个字节。

  • 但是、返回值pDestinationBuffer_p[0] () 总是1、即使我使用 Hilscher 工具发送了不同的值。

问题:

  1. 使用轮询时如何检索 Idle/Run 标头值?

  2. 报头是否由堆栈在内部移除?

  3. 常量返回值1 () 是否对应于运行状态而不是实际的循环数据?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid=“609281" url="“ url="~“~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1616301/am261-som-evm-am261x-ethernet-ip-configuration-assembly-custom-services-and-idle-run-header-questions

    Q2–更改运行→空闲状态

    如何从 Hilsher 工具更改 Idle/Run 标头值 (Run→Idle)?

    [/报价]

    我找到了这个。

    常量返回值 (1) 是否对应于运行状态而不是实际循环数据?

    我相信对上一个问题的答案是 是的 —从工具在运行和空闲之间切换时、该值在1和之间正确更改0、这似乎与运行/空闲状态相对应。

    但是、我观察到 API 出现了意外行为。

    我修改了大会、使之包含两个成员:

    • 成员 1:1 字节

    • 成员 2:2 字节

    调用时EI_API_CIP_getAssemblyData()、返回的缓冲区pDestinationBuffer_p[] () 的行为如下:

    • 而设计的 第一个字节 根据运行/空闲状态而变化。

    • 缓冲区中的其余字节仍然保留0、即使我要从工具中更改它们的值。

    这让我怀疑:

    • 返回空闲/运行标头、而不是实际的循环数据、

    • 或者 API 没有正确复制完整的汇编有效载荷。

    请您澄清一下:

    1. Idle/Run 标头是否包含在返回的数据中EI_API_CIP_getAssemblyData()

    2. API 是否应该仅返回实际的汇编数据(没有 4 字节标头)?

    3. 是否必须配置特定的组件才能正确检索所有装配体成员?

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

    尊敬的 Abdelaziz:
    在下面的答案中、我引用了离散 I/O 示例、因为它可能会回答您的大多数问题。
    主题 1 — 配置参数

    Q1 和 Q3:
    要触发配置回调、请在连接路径的末端包含配置数据(如第 1-3.38 卷 C-1.4.5.1 节“简单数据段“中所述)。

    例如、在离散/IO 示例中、标准连接路径为:20 04 24 28 2C 21 2C 03

    要附加配置数据、请使用:

    20 04 24 28 2C 21 2C 03 80 01 01 00

    其中:
    - 80:表示数据段
    - 01:以字为单位的数据长度
    - 01 00:实际配置数据

    O2T、T2O 和 cfg_inst_p 参数表示每个连接点的程序集 ID。 在我们的示例中:
    - O2T: 0x21  
    T2O:0x03
    -配置组件:0x28

    Q2–装配体成员自定义映射行为:
    `EI_API_CIP_addAssemblyMemberCustomMapped`将属性从对象链接到汇编实例、而`EI_API_CIP_setCfgAssemblyCb`专门为配置参数注册回调。

    在离散 IO 示例 (function `DIO_DEVICE_ASM_createOutputConfiguration` in DISCRETE_IO_DEVICE_ASM.c) 中、`EI_API_CIP_addAssemblyMemberCustomMapped`将两个属性添加到汇编实例 0x28。 当将 get-attribute 请求发送到汇编实例 0x28 的 attribute-3 时、Map_Get 将触发两次` io_device_asm_outputConfigCustom“CbC.cb `D回调—每个链接的对象触发一次。

    请`D、Map_Get` io_devm_asm_outputConfigCustom“Cb.cb"<eps>“ 中的 for-loop 存在、因为这两个属性值占用相同的字节、因此在每次调用中都会收集这两个值。

    总结:
    -使用`EI_API_CIP_setCfgAssemblyCb`注册的回调每次打开时调用一次(仅当包含配置数据时)。
    -`EI_API_CIP_addAssemblyMemberCustomMapped`提供标准汇编功能:将一个或多个属性链接到汇编实例。

    主题 2–定制服务
    ServiceStack 和 ServiceUser 功能的命名可能会令人困惑。 注册自定义服务时、仅调用 ServiceStack 回调。 ServiceUser 参数仅因遗留原因而存在、不起任何作用。

    名称“ServicStack"具有“具有误导性—它可能更好地命名为“CustomService",“,因为、因为它与堆栈参与无关。 我们计划在未来增强这种命名。

    主题 3–汇编空闲/运行标头
    在连接中使用 Idle/Run 标头时、请通过调用`EI_API_CIP_setAssemblyFormat`来正确配置汇编。

    请参阅分立式 IO 示例、其中 O2T 方向使用 32 位空闲/标头格式(请参阅 function` io_device_asm_createOutputs Point_Members `Din discted_io_device_asm.c)。

    正确设置格式、然后再继续。 作为程序集的一般最佳实践、我们强烈建议使用回调方法而不是轮询。
    此致、
    Pourya