0

我最近通过更换 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)请给我一些建议或让我知道您还需要了解有关设置的其他信息。

4

1 回答 1

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,但从内部处理来看,我不认为这是可能的。

于 2014-07-07T16:37:15.360 回答