ADS 通信与诊断

        ADS 是倍福 TwinCAT 实时核与外部环境交互的接口,在日常使用 TwinCAT 中经常会遇到各种通 信和故障诊断的问题,因此, 本文将重点介绍在使用 ADS 遇到问题时如何能够快速进行故障排除。

目录

ADS 简介

ADS 协议

ADS Router

ADS 诊断

无法扫描或添加路由

网卡 IP 地址设置分析

防火墙设置分析

网络交换机或路由器设置分析

运行一段时间后出现故障

可能原因分析 1:

可能原因分析 2:

可能原因分析 3:

可能原因分析 4:

可能原因分析 5:

可能原因分析 6:


ADS 简介

ADS 全称为 Automation Device Specification ,是倍福 TwinCAT 实时核与外部环境交互的接口,该协议是倍
福定义和开发的,倍福的软件和硬件产品均支持 ADS 协议。
由于 TwinCAT 是基于微软 Windows 系统并具备实时逻辑处理的工程软件,因此微软的 WinCE5 WinCE6
XP WES7 Win10 等的 X86 位和 X64 位系统中均可以运行 TwinCAT 软件。当前用户可以购买的 TwinCAT 软件
分为 TwinCAT 2 (简称 TC2 ) 和 TwinCAT 3 (简称 TC3 )两大类。 TC 3 是基于 TC2 功能基础上推出的全新架构
的工程软件,在 ADS 通信方面 TC3 向下兼容 TC2 ,但 TC3 ADS 通信又有了一些新功能的扩展如 ADS over
MQTT ADS Serurity 等。

ADS 协议

ADS 协议是开放的,用户可以查阅倍福官方在线文档 https://infosys.beckhoff.com/index_en.htm 来了解
ADS 协议原理。
AdsMonitor 是倍福开发的对 ADS 报文抓取和报文分析、数据诊断的小工具,功能类似于 Wireshark
如果用户希望使用 ADS 客户端进行开发时,只需要安装 TwinCAT 即具备了 ADS 客户端与 Server 端通信能力。
TwinCAT 提供了标准的 ADS DLL 和完善 ADS API 接口可供各种开发语言来调用,也提供了大量的帮助文档和示例
程序供用户参考。如果客户需要以 Linux MAC OS IOS Andriod 等平台作为 ADS 客户端的话,也可以自行开发
ADS 客户端,开发客户端无需任何 SDK ,倍福也不提供相关 SDK ,当然,为了降低客户端的开发难度,倍福在
https://github.com/Beckhoff/ADS 上面共享了一个基于 VS C++ ADS 客户端代码,用户可以自行下载并集成
到项目中,这只是一个基础的 ADS Client 协议封装的代码,如果用户需要承载大批量的数据通信,则需要学习并掌
握该代码后自行完善相关功能。除非特殊需求,客户才需要基于开源代码来开发 ADS 客户端。
ADS 本质上是 TCP 通信,只是对 TCP 的收发数据进行了一系列的规范,以更好的适应不同的应用需求。 ADS
对外通信的端口统一为 48898 ,客户无法修改端口。

ADS Router

ADS Router ADS Client TwinCAT 实时核交互的接口, ADS Router 通过 48898 接收 ADS Client 发送来
的请求,并把请求命令交付于实时核处理,实时核处理完请求并做出反馈, ADS Router 把反馈结果响应给 ADS
Client ADS Router TwinCAT 底层不可或缺的功能,如果用户使用 TwinCAT 来作为 ADS Client 的话,也具备
ADS Router 的功能。由于 ADS 通信是通过两端的 ADS Router 来完成的,也就意味着两端接收数据的端口均为
48898 (端口不可更改,这个地方与常规的 TCP 通讯是有区别的)。由于一台 Windows 控制器只能安装唯一的
TwinCAT ,而一个 TwinCAT 只有唯一的 ADS Router ,也就意味着一台控制器只能有一个 ADS Router 来承接所有
外部所有通信请求。 Beckhoff China 技术文档
ADS Router 可以查找本网络里面所有已安装 ADS Router (即 TwinCAT )的控制器,也就是我们所说的扫描目
标控制器,扫描功能发送的是 UDP 报文,端口为 48899 (端口不可更改)。 ADS Router 通过 48899 接收到扫描报
文请求后,会把本机的 TwinCAT 和系统相关信息反馈给扫描端的 ADS Router 48899 ),扫描端把扫描到的信息呈
现在扫描对话框中。
添加路由( Add Route )发送的是 ADS 请求报文,实现双方通信前把建立通信所必要的对方信息报备到本地
ADS Router 列表中,以便后续建立流畅的 ADS 通信,添加路由后进行通信也是工业设备互相通信的安全要求。

ADS 诊断

ADS 协议已经有 20 年的应用历史,可谓非常稳定了,由于 ADS 非常灵活,因此在使用前对 ADS 理解不到位,
就必然会产生一些应用故障。这些故障一般会发生在通信建立之前(即扫描添加路由时)和正常通信一段时间后,
下面对着两种故障进行详细介绍:

无法扫描或添加路由

网卡 IP 地址设置分析

如果 IP 地址设置不合理,则 ADS 通信一定无法建立,两端控制器的 IP 是否在同一网段,子网掩码设置是否合理,
如: A 控制器设置为: 192.168.1.11 B 控制器设置为: 192.168.1.22 ,子网掩码均为: 255.255.0.0
如果需要连接外网的话,网关设置是否合理,如果不需要外网通信,请不要设置网关。
不可在同一个网卡上设置多个 IP 地址,这会造成 ADS 通讯无法添加路由或者后续出现通讯不稳定。
建议先禁用其他不进行 ADS 通信的网卡,等 ADS 通信已经建立完成后,再使能其他网卡( TC2 环境下会更
有效果)。
打开命令行界面, ping 对方 IP ,看看是否能够 ping 通,如果不通,则继续以上几步看看哪里设置不合理;如
果可以 ping 通则尝试在 TwinCAT 中进行扫描和添加路由。 Beckhoff China 技术文档

防火墙设置分析

如果是 WES7 或者 Win10 的系统,在初次添加路由时防火墙可能会阻止 UDP 报文的收发,因此需要关闭防
火墙或者在防火墙中开放入站端口( 48898 48899 ),一般情况,先关闭防火墙, Client Server 两端的防火墙
都需要关闭,扫描到目标机并添加了路由后,再启动防火墙。

网络交换机或路由器设置分析

有些用户的局域网中禁止发送 UDP 报文,因此会在路由器或者交换机上设置了 UPD 报文包过滤的屏障,这会
导致目标机无法正确收发 UDP 扫描报文,这个情况可以通过在控制器两段分别安装 Wireshark 来实时抓取网络数
据包来分析,看看本机是否可以接收到目标 IP 发送过来的请求或响应报文。广域网之间的 TwinCAT 进行通讯 ADS
通讯时,经常会遇到这个问题,需要在设置 VPN 传输时,设置透传功能,这样目标控制器收到的报文中的 src IP
息不会被路由器自动修改了。这个现象也可以通过 Wirshark 来抓取两端的数据包进行分析 src IP dst IP 是否匹
配即可找到问题的症结。 Beckhoff China 技术文档

 

运行一段时间后出现故障

这种情况经常发生在 ADS Client Server 进行通信一段时间后,在 Client 侧通过 TwinCAT 扫描 Server 时出
现无法找到 Server 或者无法添加路由的情况,此时有可能已存在的 ADS 连接依然可以正常通讯,主要原因是由于
Server 端对 Client 端发送过来的 UDP 报文或者 Add Route 报文不在响应造成,可能的原因分析是:

可能原因分析 1

Server 在之前的运行过程中曾经有人连接过,并进行过添加路由操作,而添加时 Client 侧的 ADS 通信必要
Host Name IP NetID )信息和 Server 端已备案的信息产生冲突: 如之前通过 IP 地址添加的路由,而现在改
host Name 添加路由;直接通过 Host Name 添加路由;添加路由的 IP 地址、 NetID HostName 等信息不同但
是在已建立通信的连接中存在等情况。这会导致 Ads Router 出现处理异常,严重时会导致以后再也无法建立连接,
需要重启控制器才可以解决问题。解决办法:尝试删除 Router 表中重复的,不需要的路由信息,以 Host Name
加的路由等,并重新激活或重启控制器。

可能原因分析 2

Client 在添加路由时采用 Host Name 添加,由于 Host Name 一般为控制器的名称,如果包含一些特殊字
符或者中文等信息,在添加路由后,会导致控制器运行一段出现无法添加新的路由,即使重启控制器也无法解决。
必须要手动删除控制器 Router 列表的信息后,重启控制器才可以解决问题。因此,我们不建议中国用户添加路由时
选择 Host Name 添加。 Beckhoff China 技术文档

 

可能原因分析 3

网络延迟严重,在跨网通信时,经常会出现网络延时较大的情况,如: Client 端发送了请求报文,由于网络延
时原因, Client 在超时到达时依然没有收到 Server 的响应,这时, Client 端就会断开当前 TCP 连接而重新创建新
的连接,而新的连接又发送新的请求给 Server 端,这会导致 Server 对老的连接释放和新连接的管理的混乱,这主
要是由于 TCP 的几次握手时间和网络延时造成,从而导致 ADS 通信不稳定或无法再建立新连接。用户可以通过命
令行命令 netstat 查看网络连接状态,如果出现通信不稳定或者时好时坏时,则 TCP 连接状态表中将会出现
TIME_WAIT CLOSE_WAIT 等多种状态。由于 TCP 连接在出现异常后的消失需要较长时间,不同系统有所差异,
有的可能 2-4 小时,有的会半天等待,因此,也会有一种现象是在发生通信故障一段时间后网络还会恢复正常。出
现这种情况,需要通过优化网络环境、延长通信超时设定、降低通信频率、减少通信数据量等办法来逐步解决。

 

可能原因分析 4

ADS 通讯报文存在错误,由于客户的 ADS Client 在请求报文中的数据信息存在异常(如 GroupIndex
OffsetIndex 等信息错误),导致 Server 在接收到请求报文会进行一些异常处理,如果这种异常报文非常多,而且可
能是来之于不同的 Client 侧的,这就会导致 Ads Router 会频繁处理错误报文,如果再加之某一瞬间, CPU 的使用
率有会很高时,就会导致 Ads Router 处理报文的任务被大量阻塞或过悬挂,这也会造成 Router 内存的增长( TC2
默认为 2M )、这些被阻塞或悬挂的任务也会新影响新的请求命令,这样持续运行一段时间后就会导致 Ads Router
法再继续响应 Client 端发送的任何报文了,进而出现无法 Client 端的任何请求报文了,这样通过抓取网络报文和分
Client 端的代码来解决。

可能原因分析 5

ADS Client 端代码的进行 ADS 读写方式不合理造成, ADS 通信可以采用单个变量方式读写,多个变量批量方
式读写,注册事件回调方式。如果客户的代码采用批量方式读写,即多个变量的读写请求可以通过一个 ADS 报文来 Beckhoff China 技术文档
完成,这就会使得该报文会较大,加之网络传输延时,可能会出现报文在传输过程中出现延迟较大或部分丢失的现
象,一般在 TC2 环境下单个报文包含的变量个数不要超过 300 个(以简单数据类型计算),如果变量为复杂数据类
Array Struct 等,则变量个数要适当减小如 100 个,具体要依照实际报文大小来确定。 不建议客户通过注册事
件回调方式进行长时间、网络间的通信。推荐的应用场景如:客户希望在一段时间内进行数据录播,在录播结束后
就退出了注册回调方式通信; HMI PLC 处于同一台控制器上,有一些逻辑要求在变量发生更改后能够带有时间
戳的应用场合。这会造成通讯及其不稳定,注册事件回调一般适用于本机方式,且通讯一段时间后就停止的应用场
景。这是由于 PLC 是以 ms 级别进行周期性执行,每个周期会产生大量的新数据,如果采用回调方式通信,则 Client
侧需要有足够快响应能力才可以使用如此之快的数据发送,否则会造成网络堵塞或者 Socket 底层异常。
当然,也可以通过设置 Router Memory 大小来提高通信的响应性和稳定性,默认 TC2 设置为 2048K ,我建议
用户设置为 8192K TC2 最大可以设置到 32767K TC3 默认为 32M ,最大可以设置为 1024M 。具体请依实际网
络情况、通信数据量、控制器内存大小来设置。 Router Memory 大小往往在 SCADA 侧尤为重要,因为 SCADA
同时连接多个 Server 进行通信,因此 TC 环境时强烈建议设置到 32767K 。 设置了 Router Memory 后一定要进行
激活并重启控制器才可以生效,如果客户使用 X64 TC2 环境也需要点击激活按钮,即便他无法切换到运行模式。

 

可能原因分析 6

使用开源的 ADS Client 代码进行开发:这部分代码只实现了 ADS 协议解析和分装,只是个 demo 程序,没有
自动添加路由的功能,没有 ADS Router 的功能,也没有网络可靠性方面的代码,因此,客户在使用该代码时,请
合理增加 Socket 在通讯方面参数优化的部分,以提高代码稳定性,这也对开发人员提出了挑战,而且在出现通讯故
障时,也是比较难于诊断的,因此除非你有足够的能力来掌控这些代码,否则还是建议选择 TwinCAT 提供的标准
ADS DLL 进行通讯。出现问题时,请选择 Wireshark 进行网络抓包,并配合代码逻辑来具体问题具体分析。

你可能感兴趣的:(linux,c++,学习,网络)