通过ADS协议实现与beckhoff控制器的以太网通讯
2014-07-30 19:45
260 查看
最近公司安排给我一个新活,通过ADS协议完成与beckhoff的通讯。相对于modbusTCP协议来说,ADS协议支持句柄访问,通过句柄访问到数据,这样上位机的编程就更为灵活了。
ADS在传输层上使用的是TCP协议,这样数据的传输就更为可靠了。同样在数据通讯时需要TCP的三次握手,这里要注意,传输层上绑定的端口号是48898,而不是beckhoff提供RealTimeSystem1中所说的801,注意那个801是在应用层上所使用的端口号。至于为什么是48898,不想说了,因为我也不知道。
在TCP建立好连接之后,我们就可以愉快的进行通讯啦,废话不多说,咱们直接看ADS报文吧,先抓一条正常ADS通讯的以太网报文,这是一条通过地址发出的读请求指令。
00 01 05 16 a7 69 74 d4 35 22 d4 14 08 00 45 00 00 5a 02 14 40 00 40 06 45 2c a9 fe 60 d1 a9 fe 3e 90 04 0c bf 02 ad 3d 7e 47 05 c8 c9 c5 50 18 ff ff 09 34 00 00 00 00 2c 00 00 00 05 16 a7 68 01 01 21 03 a9 fe a4 a3 01 01 76 80 02 00 04 00 0c 00 00 00 00
00 00 00 01 00 00 00 20 40 00 00 00 00 00 00 01 00 00 00
看着别晕哈,分析下
00 01 05 16 a7 69 74 d4 35 22 d4 14 08 00 -----------------------MAC层
45 00 00 5a 02 14 40 00 40 06 45 2c a9 fe 60 d1 a9 fe 3e 90 -----------------IP层
04 0c bf 02 ad 3d 7e 47 05 c8 c9 c5 50 18 ff ff 09 34 00 00 ----------------------TCP层
00 00 2c 00 00 00 05 16 a7 68 01 01 21 03 a9 fe a4 a3 01 01 76 80 02 00 04 00 0c 00 00 00 00 00 00 00 01 00 00 00 20 40 00 00 00 00 00 00 01 00 00 00--------------AMS层
别的不多说,只要AMS报文。
---------------------------------AMS报文解析-------------------------------------------------
00 00 2c 00 00 00 -------------------头信息
05 16 a7 68 01 01--------------------目的AMS地址
21 03 ---------------------------目的端口
a9 fe a4 a3 01 01 -----------------源AMS地址
76 80 -------------------------源端口
02 00 -------------------------命令号CmdID
04 00 -------------------------状态标志StateFlag
0c 00 00 00 ----------------命令长度cbData
00 00 00 00 ----------------错误号
01 00 00 00 ----------------序号
20 40 00 00 ----------------组索引GroupIndex
00 00 00 00 ----------------偏移量OffsetIndex
01 00 00 00----------------读写长度Lenth
好了,一目了然,下面就解释一下各个部分的含义(此处是自己的理解,如有问题,请批评指正)
头信息:第三、四个字节表示从目的AMS地址开始的报文长度,其他啥意思我也不知道
目的AMS地址:beckhoff控制器的AMS地址
目的端口:所谓的801端口
源AMS地址:本机的AMS地址,这里建议本机首先安装twincat软件,然后手动设置一个AMS地址,之后通讯的源AMS地址都用这个地址就可以了
源端口号:我随便设置的一个值
命令号:读写命令号,02是读,03是写
状态标志:这个在下面再说。
命令长度:从组索引开始的报文长度
错误号:顾名思义
序号:貌似没啥用,赋值0x01就行吧
组索引:beckhoff提供的变量区的索引 M区对应0x4020
偏移量:顾名思义
读写长度:这里的单位是字节
这里我说说状态标志StateFlags,两个字节共16bit,其中最高字节表示是否为广播发送,高字节的其他位应该是保留,这里我不确定。低字节共8位,每一个bit代表一个含义,从最低位到最高位的顺序所表达的含义分别是:respone; no return; ADS command; system command; high priority command; timestamp added; udp command: init command。
我在调试的时候发现了一个问题,编写的程序在别的电脑上就不能正常运行,通过抓包发现,每当我建立一次TCP连接的时候,控制器会自动发送报文将连接断开,导致后续的AMS报文无法被发送,目前正在解决这个问题。
以上都是本人在调试ADS协议时的一些心得,全是个人理解,有不准确的地方希望大家可以批评指正。
ADS在传输层上使用的是TCP协议,这样数据的传输就更为可靠了。同样在数据通讯时需要TCP的三次握手,这里要注意,传输层上绑定的端口号是48898,而不是beckhoff提供RealTimeSystem1中所说的801,注意那个801是在应用层上所使用的端口号。至于为什么是48898,不想说了,因为我也不知道。
在TCP建立好连接之后,我们就可以愉快的进行通讯啦,废话不多说,咱们直接看ADS报文吧,先抓一条正常ADS通讯的以太网报文,这是一条通过地址发出的读请求指令。
00 01 05 16 a7 69 74 d4 35 22 d4 14 08 00 45 00 00 5a 02 14 40 00 40 06 45 2c a9 fe 60 d1 a9 fe 3e 90 04 0c bf 02 ad 3d 7e 47 05 c8 c9 c5 50 18 ff ff 09 34 00 00 00 00 2c 00 00 00 05 16 a7 68 01 01 21 03 a9 fe a4 a3 01 01 76 80 02 00 04 00 0c 00 00 00 00
00 00 00 01 00 00 00 20 40 00 00 00 00 00 00 01 00 00 00
看着别晕哈,分析下
00 01 05 16 a7 69 74 d4 35 22 d4 14 08 00 -----------------------MAC层
45 00 00 5a 02 14 40 00 40 06 45 2c a9 fe 60 d1 a9 fe 3e 90 -----------------IP层
04 0c bf 02 ad 3d 7e 47 05 c8 c9 c5 50 18 ff ff 09 34 00 00 ----------------------TCP层
00 00 2c 00 00 00 05 16 a7 68 01 01 21 03 a9 fe a4 a3 01 01 76 80 02 00 04 00 0c 00 00 00 00 00 00 00 01 00 00 00 20 40 00 00 00 00 00 00 01 00 00 00--------------AMS层
别的不多说,只要AMS报文。
---------------------------------AMS报文解析-------------------------------------------------
00 00 2c 00 00 00 -------------------头信息
05 16 a7 68 01 01--------------------目的AMS地址
21 03 ---------------------------目的端口
a9 fe a4 a3 01 01 -----------------源AMS地址
76 80 -------------------------源端口
02 00 -------------------------命令号CmdID
04 00 -------------------------状态标志StateFlag
0c 00 00 00 ----------------命令长度cbData
00 00 00 00 ----------------错误号
01 00 00 00 ----------------序号
20 40 00 00 ----------------组索引GroupIndex
00 00 00 00 ----------------偏移量OffsetIndex
01 00 00 00----------------读写长度Lenth
好了,一目了然,下面就解释一下各个部分的含义(此处是自己的理解,如有问题,请批评指正)
头信息:第三、四个字节表示从目的AMS地址开始的报文长度,其他啥意思我也不知道
目的AMS地址:beckhoff控制器的AMS地址
目的端口:所谓的801端口
源AMS地址:本机的AMS地址,这里建议本机首先安装twincat软件,然后手动设置一个AMS地址,之后通讯的源AMS地址都用这个地址就可以了
源端口号:我随便设置的一个值
命令号:读写命令号,02是读,03是写
状态标志:这个在下面再说。
命令长度:从组索引开始的报文长度
错误号:顾名思义
序号:貌似没啥用,赋值0x01就行吧
组索引:beckhoff提供的变量区的索引 M区对应0x4020
偏移量:顾名思义
读写长度:这里的单位是字节
这里我说说状态标志StateFlags,两个字节共16bit,其中最高字节表示是否为广播发送,高字节的其他位应该是保留,这里我不确定。低字节共8位,每一个bit代表一个含义,从最低位到最高位的顺序所表达的含义分别是:respone; no return; ADS command; system command; high priority command; timestamp added; udp command: init command。
我在调试的时候发现了一个问题,编写的程序在别的电脑上就不能正常运行,通过抓包发现,每当我建立一次TCP连接的时候,控制器会自动发送报文将连接断开,导致后续的AMS报文无法被发送,目前正在解决这个问题。
以上都是本人在调试ADS协议时的一些心得,全是个人理解,有不准确的地方希望大家可以批评指正。
相关文章推荐
- 基于NIO实现客户端通过HTTP协议访问WEB站点
- 用51单片机控制RTL8019AS实现以太网通讯
- 稳扎稳打Silverlight(54) - 4.0通信之对UDP协议的支持: 通过 UdpAnySourceMulticastClient 实现 ASM(Any Source Multicast),即“任意源多播”
- 通过Socket实现进程间异步通讯(一)
- 稳扎稳打Silverlight(54) - 4.0通信之对UDP协议的支持: 通过 UdpAnySourceMulticastClient 实现 ASM(Any Source Multicast),即“任意源多播”
- 通过Socket实现进程间异步通讯(一)
- 通过Socket实现进程间异步通讯(二)
- C#.NET通过Socket实现平行主机之间网络通讯(含图片传输的Demo演示)
- Comet通讯:Bayeux协议(ajax实现客户端和服务器的双向交互)
- 通过Socket实现进程间异步通讯(四)
- C#通过委托和异步调用实现窗体间的通讯
- 实现普通用户通过远程桌面连线登陆域控制器
- 在J2ME中实现基于UDP协议通讯程序
- QTE下通过Http协议以同步方式与Web服务器通信的实现
- DELPHI实现通过URL触发自定义协议的软件
- 通过UniObject的标准化协议,实现即插即用式的系统通信
- 通过Socket实现进程间异步通讯(三)
- 稳扎稳打Silverlight(54) - 4.0通信之对UDP协议的支持: 通过 UdpAnySourceMulticastClient 实现 ASM(Any Source Multicast),即“任意源多播”
- 通过Socket实现进程间异步通讯(四)
- CPU卡中T=0通讯协议的分析与实现