【问题标题】:PDO mapping and cyclic data transfer over CANopen with Anybus Compactcom使用 Anybus Compactcom 通过 CANopen 进行 PDO 映射和循环数据传输
【发布时间】:2014-04-17 18:13:23
【问题描述】:

我最近通过更换 Anybus Compactcom 并进行一些小的固件更新,将我的设备从 ModbusRTU 切换到 CANopen。该设备现在似乎可以作为 CANopen 节点正常运行,但我在映射 PDO 以进行循环数据传输时遇到了一些问题。

主机应用程序由 117 个 Anybus ADI 组成,每个 ADI 都是一个 UINT16。根据 Anybus 文档,ADI 对应于 CANopen 节点对象字典中从 2001h 到 5fffh (ADI 1-3fff) 中的对象。

当我尝试使用我的主模拟器直接从 CANopen 节点读取对象时,我每次都会得到预期值,但在映射我的 PDO 后,当我尝试循环时,我只会得到第一个 ADI(然后全为零)数据读取。

在我的 EDS 文件中,我像这样映射每个 ADI:

[2001]
ParameterName=ADI1
ObjectType=0x7
DataType=0x0006
LowLimit=0x0000
HighLimit=0xFFFF
DefaultValue=0x0
AccessType=ro
PDOMapping=1

在我的主配置程序中,我将需要的 ADI 映射到 PDO 并将配置下载到主控。当我开始数据传输时,我得到的只是第一个 ADI——即使我没有映射它。只要映射了任何对象,我就从第一个 ADI 获取数据,然后再全为零。

我知道这是一个复杂的设置,这可能不足以得到一个好的答案,但我是 CANopen 的新手,所以任何有 CANopen 经验的人(尤其是使用 Anybus-CC)请给我一些建议或者让我知道您还需要了解有关设置的其他信息。

【问题讨论】:

  • 您能否发布 PDO 映射,至少对于第一个 TPDO。这就是 Idx 1A00 的所有值。

标签: network-protocols bus can-bus canopen


【解决方案1】:

我还将在 AnyBusCC 上实现 CANopen 接口。内部处理映射的数据结构类型如下所示:

typedef struct ABCC_PdMapType
{
   UINT16            iNbrMaps;      /* Number of ADI Write/Read mappings   */
                                    /* present in asMaps[] array.          */
   ABCC_PdAdiMapType*  psMaps;      /* Pointer to Array of ADI mappings    */

}
ABCC_PdMapType;

不幸的是,AnyBusCC 将 psMaps 中的每个单独条目映射到单个 PDO。所以在我看来,您不能将多个 ADI 映射到同一个 PDO,而是将每个 ADI 映射到不同的 PDO。至少我能做到这一点。

我不知道另一边有什么可能,即您是否可以使用 0x16xx/0x1Axx 类型的对象映射多个 PDO,但从内部处理来看,我不认为这是可能的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-19
    • 1970-01-01
    相关资源
    最近更新 更多