本文描述了非过程数据的ADI定义以及在西门子TIA Portal(V14)软件配置非周期访问ADI.
适用产品
AB6600、AB6670
注意事项
本文描述了如何通过西门子PLC非周期访问ADI,更多详细信息请参考官网手册:
《Anybus CompactCom 40 - Software Design Guide》
《Anybus CompactCom 40 - Host Application Implementation Guide》
《Anybus CompactCom 40 - PROFIBUS DP Network Guide》
本示例建立在Anybus CompactCom 40模块已经驱动成功,并且已经成功与PROFINET控制器组态通信.
本次测试使能了appl_adimap_simple16.c ADI设置模板。
目录
- 定义非过程数据ADI
- 非周期读取ADI
- 非周期写入ADI
定义非过程数据ADI
- 首先定义需要的数据变量,如图本次示例定义了两个用于测试的变量,数据类型为UINT16
-
UINT16 ADI_GET_TESTRD;
UINT16 ADI_GET_TESTWR;
-
- 在const AD_AdiEntryType APPL_asAdiEntryList[]添加相应的ADI,ADI号分别为0x55AA,0x55AB
-
/*-------------------------------------------------------------------------------------------------------------
** 1. iInstance | 2. pabName | 3. bDataType | 4. bNumOfElements | 5. bDesc | 6. pxValuePtr | 7. pxValuePropPtr
**--------------------------------------------------------------------------------------------------------------
*/各参数含义
const AD_AdiEntryType APPL_asAdiEntryList[] =
{
{ 0x1, "OUTPUT", ABP_UINT16, 1, APPL_READ_MAP_WRITE_ACCESS_DESC,{ { &M_Output, &appl_sUint16Prop } } },
{ 0x2, "INPUT", ABP_UINT8, 2, APPL_WRITE_MAP_READ_ACCESS_DESC,{ { &M_Iutput, &appl_sUint8Prop } } },
{ 0x55AA, "ADI_GET_TEST_IR", ABP_UINT16, 1, APPL_NOT_MAP_READ_ACCESS_DESC,{ { &ADI_GET_TESTRD, &appl_sUint16Prop } } },//Input parameter
{ 0x55AB, "ADI_SET_TEST_OW", ABP_UINT16, 1, APPL_NOT_MAP_WRITE_ACCESS_DESC,{ { &ADI_GET_TESTWR, &appl_sUint16Prop } } }//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 0x55AA为例)
- 读取ADI之前首先需要使用DP-V1写命令(0x5F)将要读取的ADI号写入Slot 0x00/ Index 0xFF,Byte 5之后的字节为写命令的数据负载。
- Call Header,Ext.Funtion no.为0x08 ,设置读取ADI时Subindex 应为0x0002
- ADI Number为要读取的ADI示例号,注意与驱动保持一致,此处示例为0x55AA。
- 模块收到该命令后转化为模块向驱动程序读取ADI的Message
-
使用HMS PROFIBUS Master Simulator示例如下,
-
选择write指令(0x5F)
- Slot number 0x00,Index 0xFF
- Call Header(Ext Function no 0x08 , SubIndex 0x0002),ADI number 0x55AA
- message log
-
- 主站使用read服务(0x5E)获取ADI(0x55AA)读取的结果。ADI的值为0x0005(UINT16)
- Anybus CompactCom 40返回至主站的数据含义如下。
- 使用西门子PLC(本例中所用为S7_1200系列PLC)作为PROFIBUS DP主站非周期读取ADI数据,在TIA Portal中配置步骤如下。
- PLC通过RDREC与WRREC功能块实现对ADI的非周期访问。
-
RDREC功能块各参数类型如下。
- ID为硬件标识符,S7-300PLC中为模块诊断地址;
- INDEX数据记录号,此处固定为255(0xFF)
- MLEN为要读取的数据长度;
- RECORD为读取数据的存放区,可以通过定义DB块存放读取的数据;
- LEN为实际读取数据长度
- VALID为新数据有效标志
- ERROR数据访问错误
- WRREC功能块各参数类型如下。
- ID为硬件标识符,S7-300PLC中为模块诊断地址;
- INDEX数据记录号,此处固定为255(0xFF)
- RECORD为写入数据的存放区,若数据字节数较多,可以通过定义DB块存放读取的数据;
- DONE为本次请求完成标志
- ERROR数据访问错误
-
- 在PLC工程中组态Anybus Compact Com 40
-
获取Anybus CompactCom 40硬件标识符。
- 分别定义2个数据块,用于存放读取ADI操作的配置数据(写命令的负载数据)和读取到的ADI相关的数据。
- PLC通过RDREC与WRREC功能块实现对ADI的非周期访问。
- 添加功能块RDREC与WRREC功能块至程序中,程序设置如下。
- WRREC功能块设置如下
- WRREC功能块配置ADI至Slot 0 Index 0xFF完成后,使能RDREC功能块,关闭WRREC功能块。
- 数据读取成功后,失能RDREC功能块、WRREC功能块
- RDREC功能块配置如下
- 设置Write_cfg数组的值如下,设置WR_ADI_REQ为TRUE即可触发程序执行,读取ADI(0x55AA)的值。
- 读取的值存放在Read_cfg数组中
非周期写入ADI(以ADI 0x55AB为例)
- 使用HMS PROFIBUS Master Simulator示例如下。
-
选择write指令(0x5F)
- Slot number 0x00,Index 0xFF
- Call Header(Ext Function no 0x08 , SubIndex 0x0001),ADI number 0x55AB ,Data 0x0708
-
-
message log
-
主站使用DP-V1 read服务(0x5E),查看写入操作是否成功
- HMS PROFIBUS Master Simulator示例如下,如果status为Read Ok,则写入成功
- 上文中已经展示了如何在TIA Portal中配置读取ADI,向ADI写入数据需更改Write_cfg数组的值,修改如下。
-
- 随后设置WR_ADI_REQ为TURE,即可将数据写入ADI(0x55AB)
-
附加信息
以上示例仅作参考,不作为功能的最终实现,最终需求根据实际情况而定,请您先梳理该功能实现的流程,并参考官网英文手册实现功能需求。
官网手册下载地址如下: