如何实现Anybus CompactCom40 DeviceNet ADI Remap(重映射)功能

07 12月 2023

本文描述了Anybus CompactCom 40 DeviceNet模块的ADI重映射(Remap)功能相关的驱动程序设置以及与重映射相关的对象实例属性,并基于HMS DeviceNet Master simulator主站仿真软件进行了Remap功能测试。

所述ADI重映射(Remap)是指在Anybus CompactCom40 DeviceNet模块运行过程中,无需修模块改驱动程序,即可实现CIP周期性过程数据组合实例(Assmebly instance)的修改。

 

 

使用产品

AB6601、AB6671

 

注意事项

所使用的DeviceNet主站需要支持CIP协议所规定的基于显式消息的服务:获取属性服务(Get_Attribute())与设置属性服务(Set_Attribute()),更多信息请参考官网英文手册:

更多详细信息请参考官网手册:

《Anybus CompactCom 40 - Software Design Guide》

《Anybus CompactCom 40 - DeviceNet Network Guide》

本示例建立在Anybus CompactCom 40模块已经驱动成功,并且可以正常与主站通信.

本次测试使能了驱动程序appl_adimap_asm.c ADI设置模板。

 

目录

  • Anybus CompactCom40 DeviceNet ADI重映射功能实现原理
  • Anybus CompactCom40 DeviceNet ADI重映射功能相关的驱动程序设置
  • Anybus CompactCom40 DeviceNet ADI重映射功能测试

 

Anybus CompactCom40 DeviceNet ADI重映射功能实现原理

 

  1. ADI重映射由于DeviceNet网络侧主站设备访问周期性过程数据的路径发生变化产生,在模块与PLC通信建立时,由DeviceNet主站发送Explicit Messages设置 CIP 对象Connection object(05h)的instance#2 Attribute#14(INPUT Data)与#16(OUTPUT Data),即周期数据访问组合实例号。随后通过设置 CIP 对象Connection object(05h)的instance#2 Attribute#9(Expected Packet Data)触发remap命令。实现ADI映射修改。
  2. 详情请参考英文手册《Anybus CompactCom 40 DeviceNet™NETWORK GUIDE》3.5与4.6小节。
  3. 通信数据组合实例号由驱动程序的DeviceNet Host Object(0xFC)对象预定义,每一个实例号对应一个ADI映射数组,通过DeviceNet主站更改数据访问组合实例路径即可触发remap命令,Remap命令根据Connection object(05h)所指定的访问路径设定新的ADI映射数组,作为新的周期性过程数据参与DeviceNet网络通信。

 

Anybus CompactCom40 DeviceNet ADI重映射功能相关的驱动程序设置

  1. 使能驱动\abcc_adapt\abcc_drv_cfg.h的中的ABCC_CFG_REMAP_SUPPORT_ENABLED宏定义
    • /*------------------------------------------------------------------------------
      ** Remap support configuration
      **
      ** Check the descriptions in "./abcc_drv/inc/abcc_cfg.h" for more information
      ** about the purpose of each separate 'define'.
      **------------------------------------------------------------------------------
      */
      #ifndef ABCC_CFG_REMAP_SUPPORT_ENABLED
      #define ABCC_CFG_REMAP_SUPPORT_ENABLED ( TRUE )
      #endif
  2. 使能\abcc_adapt\abcc_obj_cfg.h中的DEV_OBJ_ENABLEASM_OBJ_ENABLEASM_IA_NAME_ENABLE宏定义

    • #ifndef DEV_OBJ_ENABLE
      #define DEV_OBJ_ENABLE TRUE
      #endif

      #ifndef ASM_OBJ_ENABLE
      #define ASM_OBJ_ENABLE TRUE
      #endif

      #if ASM_OBJ_ENABLE
      /*
      ** Attribute 13: Name (Array of CHAR - {0x00-0xFF))
      */
      #ifndef ASM_IA_NAME_ENABLE
      #define ASM_IA_NAME_ENABLE TRUE
      #endif
  3. \abcc_adapt\abcc_identification.h 所有关于DeviceNet的宏定义说明:该属性中的DEV_IA_VENDOR_ID_VALUE(厂商ID)需要由贵司向ODVA协会申请,其余属性根据需求进行修改,同时需要对EDS文件中的对应属性描述做出修改,初始测试阶段,将下列宏定义设置为FALSE即可。

    • #if DEV_OBJ_ENABLE
      /*
      ** Attribute 1: Vendor ID (UINT16 - 0x0000-0xFFFF)
      */
      #ifndef DEV_IA_VENDOR_ID_ENABLE
      #define DEV_IA_VENDOR_ID_ENABLE FLASE
      #define DEV_IA_VENDOR_ID_VALUE 0x0090
      #endif

      /*
      ** Attribute 2: Device type (UINT16 - 0x0000-0xFFFF)
      */
      #ifndef DEV_IA_DEVICE_TYPE_ENABLE
      #define DEV_IA_DEVICE_TYPE_ENABLE FLASE
      #define DEV_IA_DEVICE_TYPE_VALUE 0x0043
      #endif

      /*
      ** Attribute 3: Product code (UINT16 - 0x0000-0xFFFF)
      */
      #ifndef DEV_IA_PRODUCT_CODE_ENABLE
      #define DEV_IA_PRODUCT_CODE_ENABLE FLASE
      #define DEV_IA_PRODUCT_CODE_VALUE 0x0063
      #endif

      /*
      ** Attribute 4: Revision (Array of UINT8 - {0x01-0xFF})
      */
      #ifndef DEV_IA_REVISION_ENABLE
      #define DEV_IA_REVISION_ENABLE FALSE
      #define DEV_IA_REVISION_MAJOR_VALUE 5
      #define DEV_IA_REVISION_MINOR_VALUE 5
      #endif

      /*
      ** Attribute 5: Serial number (UINT32 - function/variable/0x00000000-0xFFFFFFFF)
      */
      #ifndef DEV_IA_SERIAL_NUMBER_ENABLE
      #define DEV_IA_SERIAL_NUMBER_ENABLE FLASE
      #define DEV_IA_SERIAL_NUMBER_VALUE 0x12345678
      #endif

      /*
      ** Attribute 6: Product name (Array of CHAR)
      */
      #ifndef DEV_IA_PRODUCT_NAME_ENABLE
      #define DEV_IA_PRODUCT_NAME_ENABLE FLASE
      #define DEV_IA_PRODUCT_NAME_VALUE "CompactCom 40 DeviceNet(TM)"
      #endif

      #endif /* #if DEV_OBJ_ENABLE */
  4. 将\example_app\appl_adi_config.h中的APPL_ACTIVE_ADI_SETUP 设置为APPL_ADI_SETUP_ASM
    • #ifndef APPL_ACTIVE_ADI_SETUP
      #ifdef USE_BOARD_SPECIFIC_ADI_SETUP
      #define APPL_ACTIVE_ADI_SETUP APPL_ADI_SETUP_SIMPLE_16
      #else
      #define APPL_ACTIVE_ADI_SETUP APPL_ADI_SETUP_ASM
      #endif
      #endif
  5. 打开\example_app\appl_adimap_asm.c文件,可在APPL_asAdiEntryList[]添加ADI,并添加到APPL_asAsmObjWrite/ReadMap*[]等系列数组中,通过增删ADI条目数,即可修改周期过程数据内容,有关ADI定义请参考英文指导手册。本次测试使用示例ADI定义。
    • INPUT DATA
      const AD_MapType APPL_asAsmObjWriteMap1[] = //0x96
      {
      { 1, PD_WRITE, AD_MAP_ALL_ELEM, 0 },
      { 3, PD_WRITE, AD_MAP_ALL_ELEM, 0 },
      { AD_MAP_END_ENTRY }
      };

      const AD_MapType APPL_asAsmObjWriteMap2[] = //0x97
      {
      { 1, PD_WRITE, AD_MAP_ALL_ELEM, 0 },
      { AD_MAP_END_ENTRY }
      };

      const AD_MapType APPL_asAsmObjWriteMap3[] = //0x98
      {
      { 3, PD_WRITE, AD_MAP_ALL_ELEM, 0 },
      { AD_MAP_END_ENTRY }
      };

      /*------------------------------------------------------------------------------
      ** Example read maps.
      **------------------------------------------------------------------------------
      */
      OUTPUT DATA
      const AD_MapType APPL_asAsmObjReadMap1[] = //0x64
      {
      { 2, PD_READ, AD_MAP_ALL_ELEM, 0 },
      { 4, PD_READ, AD_MAP_ALL_ELEM, 0 },
      { AD_MAP_END_ENTRY }
      };

      const AD_MapType APPL_asAsmObjReadMap2[] = //0x65
      {
      { 2, PD_READ, AD_MAP_ALL_ELEM, 0 },
      { AD_MAP_END_ENTRY }
      };
  6. 修改EDS文件,将所访问组合实例号设置与需求一致
  7. 示例程序\example_app\appl_adimap_asm.c\ADI定义及过程数据映射(组合实例号)对应关系,用户可根据实际需求增删

    /******************************ADI定义******************************************/
    const AD_AdiEntryType APPL_asAdiEntryList[] =
    {
    { 0x1, "ABP_UINT32", ABP_UINT32, 1, APPL_WRITE_MAP_READ_ACCESS_DESC, { { &appl_lUint32, &appl_sUint32Prop } } },
    { 0x2, "ABP_SINT32", ABP_SINT32, 1, APPL_READ_MAP_WRITE_ACCESS_DESC, { { &appl_lInt32, &appl_sSint32Prop } } },
    { 0x3, "ABP_UINT16", ABP_UINT16, 1, APPL_WRITE_MAP_READ_ACCESS_DESC, { { &appl_iUint16, &appl_sUint16Prop } } },
    { 0x4, "ABP_SINT16", ABP_SINT16, 1, APPL_READ_MAP_WRITE_ACCESS_DESC, { { &appl_iInt16, &appl_sSint16Prop } } }
    };
    /******************************************************************************/
    /*******************DeviceNet数据组合实例号************************************/
    const UINT16 DEV_aiProdInstNumList[] =
    {
    0x0096,
    0x0097,
    0x0098
    };


    const UINT16 DEV_aiConsInstNumList[] =
    {
    0x0064,
    0x0065
    };
    /*****************************对应关系************************************/

    |-----组合实例号:0x96------|-----对应映射数组APPL_asAsmObjWriteMap1[]------|----INPUT Data-----|---字节数:6---|
    |-----组合实例号:0x97------|-----对应映射数组APPL_asAsmObjWriteMap2[]------|----INPUT Data-----|---字节数:4---|
    |-----组合实例号:0x98------|-----对应映射数组APPL_asAsmObjWriteMap3[]------|----INPUT Data-----|---字节数:2---|

    |-----组合实例号:0x64------|-----对应映射数组APPL_asAsmObjReadMap1[]------|----OUTPUT Data-----|---字节数:6---|
    |-----组合实例号:0x65------|-----对应映射数组APPL_asAsmObjReadMap2[]------|----OUTPUT Data-----|---字节数:4---|

 

Anybus CompactCom40 DeviceNet ADI重映射功能测试

  1. 本次测试基于HMS DeviceNet模拟主站软件,使用CIP Explicit messages通讯的 Set_Attribute服务,设置通信数据组合实例号,默认为0x96(INPUT) 0x64(OUTPUT) ,修改为0x97(INPUT) 0x65(OUTPUT) 
  2. 通信实例由0x96、0x64变为0x97 0x65   通信数根据ADI重映射的变化而变化
    • 通信实例为0x96,0x64时,通信数据为APPL_asAsmObjWriteMap1APPL_asAsmObjReadMap1
    • 通信实例为0x97,0x65时,通信数据为APPL_asAsmObjWriteMap2APPL_asAsmObjReadMap2

 

 

附加信息

以上代码仅作参考,不作为功能的最终实现,最终实现需要根据实际情况而定,请您先梳理该功能实现的流程,并参考官网英文手册实现功能需求。

官网手册下载地址如下:

Anybus文件和文档 - CompactCom