19. ADS通讯一段时间后出现故障如何排查?

这种情况经常发生在 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 添加。


可能原因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 报文来完成,这就会使得该报文会较大, 加之网络传输延时, 可能会出现报文在传输过程中出现延迟较大或部分丢失的现象,一般在 TwinCAT 2 环境下单个报文包含的变量个数不要超过 300 个(以简单数据类型计算),如果变量为复杂数据类型 Array、 Struct 等,则变量个数要适当减小如 100 个,具体要依照实际报文大小来确定。 不建议客户通过注册事件回调方式进行长时间、网络间的通信。推荐的应用场景如:客户希望在一段时间内进行数据录播,在录播结束后就退出了注册回调方式通信; HMI 和 PLC 处于同一台控制器上,有一些逻辑要求在变量发生更改后能够带有时间戳的应用场合。 这会造成通讯及其不稳定,注册事件回调一般适用于本机方式,且通讯一段时间后就停止的应用场景。 这是由于 PLC 是以 ms 级别进行周期性执行,每个周期会产生大量的新数据,如果采用回调方式通信,则 Client侧需要有足够快响应能力才可以使用如此之快的数据发送,否则会造成网络堵塞或者 Socket 底层异常。

当然, 也可以通过设置 Router Memory 大小来提高通信的响应性和稳定性,默认TwinCAT 2 设置为 2048K,建议设置为 8192K, TwinCAT 2 最大可以设置到 32767K。 TwinCAT 3 默认为 32M, 最大可以设置为 1024M。具体请依实际网络情况、通信数据量、控制器内存大小来设置。 Router Memory 大小往往在 SCADA 侧尤为重要,因为 SCADA 会同时连接多个 Server 进行通信,因此 TC 环境时强烈建议设置到 32767K。 设置了 Router Memory 后一定要进行激活并重启控制器才可以生效,如果客户使用 X64 位 TwinCAT 2 环境也需要点击激活按钮,即便他无法切换到运行模式。



可能原因6:

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

2025.7.7 汪继彬 编辑