本文描述了非过程数据的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中- 首先定义需要的数据变量,如图本次示例定义了两个用于测试的变量,数据类型为UINT32
-
UINT32 ADI_GET_TESTRD;
UINT32 ADI_GET_TESTWR;
-
- 在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
};
-
-
如果该变量为参数型数据需要将在定义ADI时设置变量的访问权限,如果参数为只读型,将访问权限设定为APPL_NOT_MAP_READ_ACCESS_DESC,如果参数为可写型,将其访问权限设置为APPL_NOT_MAP_WRITE_ACCESS_DESC。至此ADI已经定义完毕,请注意不要将其映射到APPL_asAdObjDefaultMap数组中。
- 有关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的对象。具体请参考
- 打开TwinCAT软件,创建工程,将Anybus CompactCom 40 EtherCAT 模块组态至工程中,可直接通过设备的CoE_Online界面直接查看与改写ADI数据。
基于TwinCAT 的SDO请求非周期访问ADI
本文演示了在TwinCAT PLC程序中调用功能块FB_EcCoESdoRead和FB_EcCoESdoWrite发送SDO请求访问ADI数据。
详细信息请参考倍福官网在线资料:Beckhoff Information System - English
- 创建TwinCAT工程,连接Anybus CompactCom 40,在创建PLC程序之前,需要先获取EtherCAT 的主站NetId与Anybus CompactCom 40模块EtherCAT addr。
-
添加PLC程序
- 添加EtherCAT库引用
-
在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
- 点击”Active Configuration“快捷键按钮,使能配置,TwinCAT进入RUN Mode
- 点击Login快捷键,随后点击“Start”按钮,程序开始运行。
- 将数据写入ADI,将startWrite预设置为TRUE,将startRead预设置为FALSE,将要写入的值预设至Wint32Buffer。点击Force按钮,即可将数据写入ADI(0x07)。
- 读取ADI数据,将startWrite预设置为FALSE,将startRead预设置为TRUE,点击Force按钮,即可读取ADI 数据(0x06)。
附加信息
以上代码仅作参考,不作为功能的最终实现,最终实现需要根据实际情况而定,请您先梳理该功能实现的流程,并参考官网英文手册实现功能需求。
官网手册下载地址如下:
注意:本次实验需要配置TwinCAT运行使用独立的CPU核。