如何通过TwinCAT非周期访问Anybus CompactCom 40 ADI

20 9月 2023

本文描述了非过程数据的ADI定义以及在TwinCAT软件配置非周期访问ADI.

适用产品

AB6607、AB6677、AB6610(烧写EtherCAT协议固件)、AB6680(烧写EtherCAT协议固件)

 

注意事项

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

《Anybus CompactCom 40 - Software Design Guide》

《Anybus CompactCom 40 - Host Application Implementation Guide》

《Anybus CompactCom 40 - EtherCAT Network Guide》

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

本次测试使能了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

ADI在EtherCAT over CANOpen协议中被转化为对象字典中的数据对象,ADI实例号与数据对象的索引(Index)对应关系为CoE Object Index = ADI no.+0x2000,则本文中定义的ADI 0x06 0x07被转化为CoE对象字典中索引为0x2006与0x2007的对象。具体请参考

  1. 打开TwinCAT软件,创建工程,将Anybus CompactCom 40 EtherCAT 模块组态至工程中,可直接通过设备的CoE_Online界面直接查看与改写ADI数据。

 

基于TwinCAT 的SDO请求非周期访问ADI

本文演示了在TwinCAT PLC程序中调用功能块FB_EcCoESdoRead和FB_EcCoESdoWrite发送SDO请求访问ADI数据。
      详细信息请参考倍福官网在线资料:Beckhoff Information System - English
  1. 创建TwinCAT工程,连接Anybus CompactCom 40,在创建PLC程序之前,需要先获取EtherCAT 的主站NetId与Anybus CompactCom 40模块EtherCAT addr。
  2. 添加PLC程序

  3. 添加EtherCAT库引用
  4. 在POUs->MAIN中添加PLC程序。

    • 定义功能块与变量(参考倍福官网示例程序)
    • PROGRAM MAIN
      VAR
      fb_coe_write : FB_EcCoESdoWrite; // Function Block for writing in CoE
      fb_coe_read : FB_EcCoESdoRead; // Function Block for reading from CoE
      userNetId : T_AmsNetId := '192.168.0.133.3.1'; // Have to be entered
      userSlaveAddr : UINT := 1001; // Have to be entered
      startWrite : BOOL := FALSE; // Sign for start writing
      startRead : BOOL := TRUE; // Sign for start reading
      nState : BYTE := 0; // RW-status
      // Example: Read EL3751 PAI Internal Data: Temperature Value
      Ruint32Buffer : UDINT; // Buffer for readingW
      // Example: Select EL3751 Filter1: 22 = IIR Butterw. LP 5th Ord. 1000 Hz:
      Wuint32Buffer : UDINT:=6; // Buffer for writing
      //bTxPDOState AT%I* : BOOL; // (PDO for synchronization)
      END_VAR
    • 程序(参考倍福官网示例程序)
      CASE nState OF
      0:
      IF startWrite THEN
      // Prepare CoE-Access: Write value of CoE object/ sub index:
      fb_coe_write(bExecute := FALSE);
      nState := 1;// Next state for writing
      startWrite := FALSE;
      END_IF
      IF startRead THEN
      // Prepare CoE-Access: Read value of CoE object/ sub index:
      fb_coe_read(bExecute := FALSE);
      nState := 11;// Next state for reading
      startRead := FALSE;
      END_IF
      // ============== COE WRITE ================
      1:
      // Write entry
      fb_coe_write(
      sNetId:= userNetId,
      nSlaveAddr:= userSlaveAddr,
      nSubIndex:= 16#0,//only one element in ADI
      nIndex:= 16#2007,//ADI 07(WR)
      pSrcBuf:= ADR(Wuint32Buffer),//write data sourceW
      cbBufLen:= 4, //the length of "Wuint32Buffer" in byte
      bExecute:= TRUE,
      tTimeout:= T#1S
      );
      nState := nState + 1; // Next state
      2:
      fb_coe_write(); // Execute CoE write until done
      IF fb_coe_write.bError THEN
      nState := 100; // Error case
      ELSE
      IF NOT fb_coe_write.bBusy THEN
      nState := 0; // Done
      END_IF
      END_IF
      // ============== COE READ =================
      11:
      // Read entry
      fb_coe_read(
      sNetId:= userNetId,
      nSlaveAddr:= userSlaveAddr,
      nSubIndex:= 0, //only one element in ADI
      nIndex:= 16#2006,//ADI 06(RD)
      pDstBuf:= ADR(Ruint32Buffer), //Read data Destination source
      cbBufLen:= 4, //the length of "Ruint32Buffer" in byte
      bExecute:= TRUE,
      tTimeout:= T#1S
      );

      nState := nState + 1; // Next state
      12:
      fb_coe_read(); // Execute CoE read until done
      IF fb_coe_read.bError THEN
      nState := 100; // Error case
      ELSE
      IF NOT fb_coe_read.bBusy THEN
      nState := 0; // Done
      END_IF
      END_IF
      100:
      ; // Error handling..
      END_CASE
  5. 点击”Active Configuration“快捷键按钮,使能配置,TwinCAT进入RUN Mode
  6. 点击Login快捷键,随后点击“Start”按钮,程序开始运行。
  7. 将数据写入ADI,将startWrite预设置为TRUE,将startRead预设置为FALSE,将要写入的值预设至Wint32Buffer。点击Force按钮,即可将数据写入ADI(0x07)。
  8. 读取ADI数据,将startWrite预设置为FALSE,将startRead预设置为TRUE,点击Force按钮,即可读取ADI 数据(0x06)。

 

 

附加信息

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

官网手册下载地址如下:

Anybus文件和文档 - CompactCom

注意:本次实验需要配置TwinCAT运行使用独立的CPU核。