一、报文分析工具
1,抓包工具
倍福官网下载:TF6010 | TwinCAT 3 ADS Monitor | Beckhoff Worldwide
或者网盘下载:链接:https://pan.baidu.com/s/188GY9zuIrDFMXiTqky4MWg
提取码:a9k2
抓包工具安装在ADS通讯的机器上,比如我的环境:
在开发机中编写一个模块A、B通讯的程序,然后下载到工控机中,那么抓包工具需要安装在工控机上(而不是开发机上)。
2,浮点与16进制相互转换工具
链接:https://pan.baidu.com/s/1X4qol__ff50ShNJUh3KAYA
提取码:cu8z
浮点类型数据在内存中按IEEE 754存储,人工将浮点数转换成16进制很麻烦,所以需要借助这个转换工具。
如果待分析的报文中,没有浮点类型的数据,就不需要下载该工具了。
二、抓包
1,设置过滤规则
过滤规则中有AMS netid和port,可以在电脑的右下角点Twincat图标查看:Router->Change AMS NetId。
2,设置缓冲区大小
3,点开始抓包
三、报文分析
1,目标
用AdsReadWriteReq函数写一个完整的BasicControl结构体,结构体中有个Postion(double类型),将该变量值设置为1300,通过报文分析写入是否正确。
执行的接口函数:
AdsReadWriteReq(m_Addr, MoveAxisCAInvokeID, ADSIGRP_SUMUP_WRITE, 1, 4, sizeof(TDataParAxis), &BasicControl[idx]);
函数原型:
virtual int AdsReadWriteReq( AmsAddr& rAddr, ULONG invokeId, ULONG indexGroup,
ULONG indexOffset, ULONG cbReadLength, ULONG cbWriteLength, PVOID pData );
从原型中可以看出 indexGroup = ADSIGRP_SUMUP_WRITE,indexOffset = 1,后面查找报文时用到。
Twincat定义的indexGroup ,见C:\TwinCAT\3.1\sdk\Include\Ads.h,ADSIGRP_SUMUP_WRITE = 0xF081 。
2,Postion偏移量,
BasicControl结构体如下:
Postion在结构体中的偏移是:24+8*7 = 80个字节。
Sum Write报文的格式:
n * ULONG[3]定义如下:
内容 | 长度 | 描述 |
首地址 | 4 bytes | 数据写入的位置,也表示需要执行的命令类型 |
偏移量 | 4 bytes | 数据写入的位置,也表示需要执行的命令参数 |
长度 | 4 bytes | 以字节为单位,表示需要被写入的字节长度 |
IG、IO、Len(indexGroup,indexOffset,Length):从IG IO定义的变量位置开始,写Len长度的数据。
所以Postion在报文data区中的偏移是:n * ULONG[3] + 80 = 12 + 80 = 92 = 0x5C
3,报文中Postion的值
在已抓取的报文中,设置规则只显示indexGroup=0xF081的报文: