2. ADS 设备与路由基础
在 TwinCAT 系统中,ADS 通信能否成功,首先取决于两个基础条件:目标设备是否拥有可被寻址的 AMS NetId,以及本机与目标设备之间是否存在一条可用的路由。很多初学者遇到“ADS 连接失败”时,第一反应是检查代码或端口,但实际原因往往出在 NetId 写错、路由未添加或路由方向不完整。本节围绕 AMS NetId 的结构、路由表的配置方法、本地与远程设备的发现方式,以及连接测试手段展开,帮助建立一套可复现的排查与验证流程。
一、AMS NetId 的结构与含义
AMS NetId 是 ADS 通信中的设备地址标识,本质是一个由 6 个字节组成的地址,通常写成“a.b.c.d.e.f”的形式,例如 192.168.1.10.1.1。它由两部分构成:前 4 个字节表示设备的 IP 地址,后 2 个字节表示该设备内部的 AMS 端口号(也称 AMS Router 端口)。例如 192.168.1.10.1.1 中,192.168.1.10 是 IP,1.1 是 TwinCAT 运行时默认的 AMS 端口。
需要特别注意的是,NetId 并不等同于 IP 地址。IP 地址用于网络层寻址,而 NetId 用于 AMS 层的逻辑寻址。一个设备可以拥有多个 AMS 端口,例如 TwinCAT 运行时通常使用 1.1,而某些 PLC 运行时或特殊服务可能使用其他端口。因此,在编写 ADS 客户端代码时,必须同时指定目标 NetId 和目标端口号,二者缺一不可。
在 TwinCAT 中,本机 NetId 可以在系统托盘图标右键菜单的“Router”中查看,也可以在 Visual Studio 的 TwinCAT 项目属性中查看。对于本地通信,通常使用 127.0.0.1.1.1 或本机实际 NetId;对于远程通信,则必须使用目标设备的实际 NetId。若目标设备未配置固定 IP,其 NetId 可能随 DHCP 变化,此时建议在目标设备上设置静态 IP 或使用主机名解析。
二、路由表配置:让 ADS 请求找到目标
仅有 NetId 还不够。ADS 请求需要经过 AMS Router 转发,而 Router 依据路由表决定将请求发往哪个网络接口或哪台设备。路由表本质上是一组“目标 NetId 范围 → 下一跳地址”的映射规则。在 TwinCAT 中,路由表通过“Add Route”对话框进行配置,核心字段包括:目标 NetId、目标 IP、路由类型(本地/远程)、用户名与密码(用于远程认证)。
配置路由时,常见做法有两种。第一种是在开发机上添加指向目标设备的路由:打开 TwinCAT 系统托盘 → Router → Add Route,输入目标设备的 IP 或主机名,系统会自动读取目标设备的 NetId 并填入。第二种是在目标设备上添加指向开发机的路由,适用于目标设备需要主动回连或双向通信的场景。若只配置单向路由,可能出现“能发不能收”或“连接超时”的现象,因此建议在通信双方都确认路由存在。
对于远程设备,路由配置还涉及认证。TwinCAT 3 默认要求输入目标设备的 Windows 用户名和密码,且该用户需属于目标设备的 TwinCAT 管理员组或具有相应权限。若目标设备未开启远程路由服务,还需在目标设备上启用“TwinCAT Remote Manager”或确认防火墙放行 AMS 端口(默认 TCP 48898)。
三、本地与远程设备发现
本地设备发现相对简单:在同一台机器上,TwinCAT 运行时默认使用 127.0.0.1.1.1 或本机 NetId,无需额外路由即可通信。可以通过 TwinCAT 系统托盘 → Router → “Local NetId”查看本机 NetId,也可以使用 TcAdsDll 或 ADS API 中的 AdsGetLocalAddress 获取。
远程设备发现则依赖网络可达性与路由配置。常用方法包括:在 Add Route 对话框中输入目标 IP 后点击“Enter”自动读取 NetId;使用 TwinCAT 的“Broadcast Search”功能扫描同一子网内的 TwinCAT 设备;或通过目标设备的 Web 界面、TwinCAT 工程连接列表查看。若目标设备位于不同子网,广播搜索通常无效,必须手动指定 IP 并确保路由可达。
在实际项目中,建议为每台远程设备建立一份“设备档案”,记录其 IP、NetId、AMS 端口、路由方向、认证账号和最后验证时间。这样在出现通信故障时,可以快速比对当前配置与档案是否一致,避免盲目排查。
四、连接测试与结果判断
配置完成后,必须进行连接测试。最直接的方式是使用 TwinCAT 自带的“ADS Monitor”或“Router”中的“Test”功能,向目标 NetId 发送一个简单的读取请求。若返回“0x00000000”或“OK”,说明路由与 NetId 均正确;若返回“0x00000001”或“0x00000002”,通常表示端口未打开或目标不可达;若返回“0x00000005”,则可能是 NetId 不匹配或路由缺失。
在代码层面,可以使用 ADS API 的 AdsPortOpen 和 AdsGetLocalAddress 先确认本地端口打开成功,再调用 AdsSyncReadStateReq 读取目标设备状态。若该调用返回错误码,可结合错误码表定位问题。例如错误码 0x00000006 表示“目标端口未找到”,0x00000007 表示“目标机器未找到”,0x0000000B 表示“路由未建立”。
// 示例:使用 ADS API 测试远程连接(伪代码)
long nErr;
AmsAddr addr;
addr.netId.b[0] = 192; addr.netId.b[1] = 168;
addr.netId.b[2] = 1; addr.netId.b[3] = 10;
addr.netId.b[4] = 1; addr.netId.b[5] = 1;
addr.port = 851; // 目标 AMS 端口
nErr = AdsPortOpen();
if (nErr == 0) {
nErr = AdsSyncReadStateReq(&addr, &state);
if (nErr == 0) {
// 连接成功,state 中包含目标设备状态
} else {
// 根据 nErr 判断:0x06 端口未找到,0x07 机器未找到,0x0B 路由未建立
}
}
除了 API 测试,还可以使用命令行工具 TcAdsDef 或第三方 ADS 客户端(如 ADS Logger)进行快速验证。对于 PLC 项目,可以在 PLC 中调用 ADSREAD 或 ADSWRITE 功能块,观察其 bBusy、bError 和 nErrId 输出,从而判断通信是否成功。
五、常见问题与排查顺序
当 ADS 连接失败时,建议按以下顺序排查:第一,确认本机 NetId 与目标 NetId 是否输入正确,特别是后两位端口号;第二,检查路由表中是否存在目标 NetId 对应的条目,且路由方向是否覆盖当前通信方向;第三,确认网络层可达,使用 ping 测试目标 IP;第四,确认目标设备防火墙是否放行 TCP 48898;第五,确认目标设备上的 TwinCAT 运行时是否已启动,AMS 端口是否处于监听状态;第六,检查认证账号是否具有远程路由权限。按照这个顺序,可以覆盖绝大多数 ADS 连接问题。
掌握 NetId 结构、路由表配置、设备发现与连接测试这四项基础能力后,后续的 ADS 读写、通知、事件等高级功能才有稳定的通信基础。建议在每次部署新设备时,都先完成一次完整的连接测试并记录结果,形成可追溯的配置档案。