在西门子TIA Portal中配置非周期访问Anybus Compact 40 ADI (PROFINET)

06 9月 2023

本文描述了非过程数据的ADI定义以及在西门子TIA Portal(V14)软件配置非周期访问ADI.

适用产品

AB6605、AB6675、AB6610(烧写PROFINET协议固件)、AB6680(烧写PROFINET协议固件)

 

注意事项

本文描述了如何通过西门子PLC非周期访问ADI,更多详细信息请参考官网手册:

《Anybus CompactCom 40 - Software Design Guide》

《Anybus CompactCom 40 - Host Application Implementation Guide》

《Anybus CompactCom 40 - PROFINET IRT Network Guide》

本示例建立在Anybus CompactCom 40模块已经驱动成功,并且已经成功与PROFINET控制器组态通信.

本次测试使能了appl_adimap_simple16.c ADI设置模板。

目录

  • 定义非过程数据ADI
  • 非周期读取ADI
  • 非周期写入ADI

 

定义非过程数据ADI

用户数据由用户在驱动程序侧定义在ADI中
  1. 首先定义需要的数据变量,如图本次示例定义了两个用于测试的变量,数据类型为UINT32
    • UINT32 ADI_GET_TESTRD;
      UINT32 ADI_GET_TESTWR;
  2. 在const AD_AdiEntryType APPL_asAdiEntryList[]添加与变量相应的ADI,ADI实例编号分别为0x06 0x07
    • /*-------------------------------------------------------------------------------------------------------------
      ** 1. iInstance | 2. pabName | 3. bDataType | 4. bNumOfElements | 5. bDesc | 6. pxValuePtr | 7. pxValuePropPtr
      **--------------------------------------------------------------------------------------------------------------
      */各参数含义
      const AD_AdiEntryType APPL_asAdiEntryList[] =
      {
      { 0x1, "ControlWord", ABP_UINT16, 1, APPL_READ_MAP_WRITE_ACCESS_DESC,{ { &CtrolWord, &appl_sUint16Prop } } },
      { 0x2, "SpeedRef", ABP_UINT32, 1, APPL_READ_MAP_WRITE_ACCESS_DESC,{ { &SpeedRef, &appl_sUint32Prop } } },
      { 0x3, "StatusWord", ABP_UINT16, 1, APPL_WRITE_MAP_READ_ACCESS_DESC,{ { &StatusWord, &appl_sUint16Prop } } },
      { 0x4, "SpeedActual", ABP_UINT32, 1, APPL_WRITE_MAP_READ_ACCESS_DESC,{ { &SpeedActual, &appl_sUint32Prop } } },
      { 0x5, "InputDI8", ABP_UINT8, 1, APPL_WRITE_MAP_READ_ACCESS_DESC,{ { &InputDI8, &appl_sUint8Prop } } },

      { 0x6, "ADI_GET_TEST_IR", ABP_UINT32, 1, APPL_NOT_MAP_READ_ACCESS_DESC,{ { &ADI_GET_TESTRD, &appl_sUint32Prop } }},//Input parameter INIT to 5
      { 0x7, "ADI_SET_TEST_OW", ABP_UINT32, 1, APPL_NOT_MAP_WRITE_ACCESS_DESC,{ { &ADI_GET_TESTWR, &appl_sUint32Prop } }},//Output parameter
      };
  3. 如果该变量为参数型数据需要将在定义ADI时设置变量的访问权限,如果参数为只读型,将访问权限设定为APPL_NOT_MAP_READ_ACCESS_DESC,如果参数为可写型,将其访问权限设置为APPL_NOT_MAP_WRITE_ACCESS_DESC。至此ADI已经定义完毕,请注意不要将其映射到APPL_asAdObjDefaultMap数组中。

  4. 有关ADI定义的更多信息请参考《Anybus CompactCom 40 - Software Design Guide》13.4小节

非周期读取ADI(本示例以西门子S7-1200PLC做为PROFINET控制器)

PLC可以通过Record Data read/write 指令非周期的访问ADI,该命令会被Anybus CompactCom 40模块转换成对象访问请求发送至驱动程序的Application Data Object (0xFE)。

PLC通过API0访问ADI,其中Index编号与ADI编号一一对应。

详情请参考《Anybus CompactCom 40 - PROFINET IRT Network Guide》第3.4小节

  1. 打开西门子TIA博图软件,创建工程并将Anybus CompactCom M40/B40组态至PROFINET网络中。
  2. 双击Main[],将RDREC功能块添加至程序中。

    • RDREC功能块各参数类型如下。

      • ID为硬件标识符;
      • INDEX数据记录号,与ADI实例号一一对应
      • MLEN为要读取的数据长度;
      • RECORD为读取数据的存放区,若数据字节较多,可以通过定义DB块存放读取的数据;
      • LEN为实际读取数据长度
      • VALID为新数据有效标志
      • ERROR数据访问错误
    • 查看硬件标识符
  3. RDREC功能块各参数设置示例,访问的ADI实例编号为0x06,将REQ置1时,发起数据访问请求。
  4. 编译工程并下载至PLC中,创建监控表,将REQEN与ADI6_DATA变量添加至监控表中,并将REQEN设置为TRUE。

写数据至ADI

  1. 非周期将数据写入ADI通过WRREC功能块实现,将该功能块添加至程序。
  2. WRREC功能块各参数类型如下,详细信息请参考西门子S7-1200 PLC编程手册。

    • ID为硬件标识符;
    • INDEX数据记录号,与ADI实例号一一对应
    • RECORD为写入数据的存放区,若数据字节数较多,可以通过定义DB块存放读取的数据;
    • DONE为本次请求完成标志
    • ERROR数据访问错误
  3. WRREC功能块各参数设置示例,访问的ADI实例编号为0x07,将REQ置1时,发起数据访问请求。
  4. 为更加直观展示数据写入效果,添加一个RDREC读取ADI实例7的变量值.

  5. 创建变量监控表,将所示变量添加至监控表中。将REQEN与WRQEN分别置1,查看各变量值,将R7REQEN设置为TRUE,查看数据写入效果.无需访问时请将上诉变量置0.

  6. 驱动程序Log打印,可知PROFINET Record Data read/write指令被转换为模块的对象访问指令(Message)
    • /***************************************************/
      读取ADI6变量大小
      Msg received:
      [ MsgBuf:0x200004c0 Size:0x0000 SrcId :0x00 DestObj:0xfe
      Inst :0x0006 Cmd :0x41 CmdExt0:0x05 CmdExt1:0x00 ]
      [ ]

      Msg sent:
      [ MsgBuf:0x200004c0 Size:0x0004 SrcId :0x00 DestObj:0xfe
      Inst :0x0006 Cmd :0x01 CmdExt0:0x05 CmdExt1:0x00 ]
      [ 0x00 0x00 0x00 0x05 ]
      /***************************************************/
      将数据写入ADI7变量
      Msg received:
      [ MsgBuf:0x200004c0 Size:0x0004 SrcId :0x00 DestObj:0xfe
      Inst :0x0007 Cmd :0x42 CmdExt0:0x05 CmdExt1:0x00 ]
      [ 0x00 0x00 0x00 0x08 ]

      Msg sent:
      [ MsgBuf:0x200004c0 Size:0x0000 SrcId :0x00 DestObj:0xfe
      Inst :0x0007 Cmd :0x02 CmdExt0:0x05 CmdExt1:0x00 ]
      [ ]
      /*************************************************/
      读取ADI7变量值
      Msg received:
      [ MsgBuf:0x200004c0 Size:0x0000 SrcId :0x00 DestObj:0xfe
      Inst :0x0007 Cmd :0x41 CmdExt0:0x05 CmdExt1:0x00 ]
      [ ]

      Msg sent:
      [ MsgBuf:0x200004c0 Size:0x0004 SrcId :0x00 DestObj:0xfe
      Inst :0x0007 Cmd :0x01 CmdExt0:0x05 CmdExt1:0x00 ]
      [ 0x00 0x00 0x00 0x08 ]
      /*************************************************/

附加信息

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

官网手册下载地址如下:

Anybus文件和文档 - CompactCom