协议

ADS(自动化设备规范)

qianmoQqianmoQ· 更新于 2026-10-01· 阅读 18 分钟· 0 次阅读

登录后可跨设备保存划线和私人笔记登录

banner

ADS(自动化设备规范)定义了一种与设备无关、与现场总线无关的接口,用于运行 TwinCAT 的 Beckhoff 自动化设备与其他实现了该接口的设备之间的通信。https://www.home-assistant.io/integrations/ads/ 来源(访问于 2022 年 8 月 7 日)

ADS 设备概念:https://infosys.beckhoff.com/english.php?content=../content/1033/ams_nat/4275563275.html&id= 来源(访问于 2022 年 8 月 7 日)

ADS 设备规范:https://infosys.beckhoff.com/english.php?content=../content/1033/ams_nat/4275563275.html&id= 来源(访问于 2022 年 8 月 7 日)

支持的操作

名称值说明
read读取一个或多个标签,可通过直接地址、字符串或符号方式寻址。
write写入一个或多个标签,可通过直接地址、字符串或符号方式寻址。
subscribe订阅在设备上解析的符号句柄。无论 load-symbol-and-data-type-tables 是否启用均可工作。
browse列出符号表。需要 load-symbol-and-data-type-tables;若将其禁用,浏览请求将以 UNSUPPORTED 作为响应。

连接字符串

ADS 连接字符串的格式如下:

ads:tcp://{ip-address}[:{port}]?{options}

tcp 是唯一受支持的传输方式。端口默认为 ADS TCP 端口,通常无需指定。target-ams-net-id、target-ams-port、source-ams-net-id 和 source-ams-port 是必填选项:

ads:tcp://192.168.23.20:48898?target-ams-port=851&source-ams-port=65534&source-ams-net-id=192.168.23.220.1.1&target-ams-net-id=192.168.23.20.1.1

连接字符串选项

名称

类型

默认值

必填

说明

名称

Beckhoff TwinCat ADS

代码

ads

Maven 依赖

<dependency>
  <groupId>org.apache.plc4x</groupId>
  <artifactId>plc4j-driver-ads</artifactId>
  <version>1.0.0</version>
</dependency>

默认传输(Default Transport)

tcp

支持的传输方式

  • tcp

配置选项:

target-ams-net-id

STRUCT

必填

目标的 AMS-Net-Id。AMS-Net-Id 的格式与 IPv4 IP 地址类似,只是由 6 段而非 4 段组成。

target-ams-port

INT

必填

目标的 AMS 端口。

source-ams-net-id

STRUCT

必填

源的 AMS-Net-Id。AMS-Net-Id 的格式与 IPv4 IP 地址相同,不过它由 6 段组成,而非 4 段。

source-ams-port

INT

必填

源的 AMS 端口。

request-timeout-ms

INT

4000

所有类型请求的默认超时时间。

max-data-type-table-depth

INT

20

解析从设备上传的数据类型表时所允许的最大嵌套深度。一个条目可能包含更多条目,因此若不设上限,树的深度将由设备而非驱动决定;一张不到一兆字节的表也可能嵌套得非常深,从而耗尽解析器的栈。真实的类型层级通常只有寥寥几层,所以默认值已经相当宽裕;对于已知需要更深嵌套的设备,可调高此值。请注意,无论此处如何配置,JVM 自身的栈都会带来几千层的实际上限。

load-symbol-and-data-type-tables

BOOLEAN

true

配置在连接时是否应读取数据类型表和符号表。这是一种优化手段,在 PLC 程序非常庞大、下载完整表会引发问题的情况下很有帮助。禁用后,读写操作仅限于直接地址({IndexGroup}/{IndexOffset}:{TYPE}):没有这些表就无法解析符号地址,此类操作会被拒绝并返回相应错误。出于同样的原因,浏览功能也不可用。订阅不受影响,因为它们在设备上解析符号句柄。

传输配置选项:

tcp

tcp.connect-timeout-ms

INT(整型)

5000

以毫秒为单位的连接超时时间。

tcp.read-timeout-ms

INT

0

Socket 读取超时时间(毫秒)。0 表示不超时。

tcp.write-timeout-ms

INT

0

以毫秒为单位的套接字写入超时时间。0 表示不超时。

tcp.no-delay

BOOLEAN

true

启用 TCP_NODELAY(禁用 Nagle 算法)。

tcp.keep-alive

BOOLEAN

false

启用 SO_KEEPALIVE。

tcp.send-buffer-size

INT

81920

发送缓冲区大小(字节)。0 表示使用系统默认值。

tcp.receive-buffer-size

INT

81920

接收缓冲区大小(字节)。0 表示使用系统默认值。

tcp.local-address

STRING

绑定的本地地址(可选)。如果未设置,则使用默认值。

tcp.local-port

INT

0

要绑定的本地端口(可选)。0 表示使用临时端口。

标签地址

寻址在 Go 和 Java 中均有实现。各实现支持的功能请参见协议支持矩阵。

通用格式

驱动程序接受三种类型的地址。

数组选择使用共享的表示法——单个索引、闭区间范围,以及可选的数组声明下界,置于类型之前。参见数组寻址。

直接地址以十进制或十六进制显式指定索引组和索引偏移,并携带数据类型:

{IndexGroup}/{IndexOffset}:{TYPE}
{IndexGroup}/{IndexOffset}[{selection}]:{TYPE}

直接地址不需要符号表,因此无论 load-symbol-and-data-type-tables 设置如何都能正常工作。

直接字符串地址是一种类型为 STRING 或 WSTRING 的直接地址,此外还携带该字符串的固定长度:

{IndexGroup}/{IndexOffset}:STRING({length})
{IndexGroup}/{IndexOffset}:WSTRING({length})
{IndexGroup}/{IndexOffset}[{selection}]:STRING({length})

符号地址使用 PLC 程序中已知的变量名,数组索引可以出现在路径中的任意位置,而不仅限于末尾:

{symbol}
{symbol}[{selection}]
{symbol}.{member}

符号地址是根据符号表和数据类型表进行解析的,因此需要启用 load-symbol-and-data-type-tables(默认启用)。如果禁用该选项,将永远不会获取这些表,符号地址会被拒绝并返回相应的错误信息——此时请改用直接地址。订阅是例外:它在设备上解析符号句柄,无论该选项如何设置都能工作。选择器中只有最后一维可以是范围;内部区段只能使用裸索引,因为在内部区段使用范围会同时指定多个不相连的元素,而不是一次连续的读取。

Java 将直接地址的索引组和索引偏移限制为 8 位十六进制数字或 10 位十进制数字;Go 移植版去掉了这一限制,因此位数超过 32 位值可能需要的数量的地址仍能匹配 Go 的模式,只会(如果会的话)在稍后才被拒绝——例如 0x123456789/0:BOOL 能被 Go 接受但被 Java 拒绝。另外,Java 要求符号地址的路径是由点号分隔的标识符区段组成的连续序列([a-zA-Z_]\w*,其后可选地跟有方括号索引);Go 的模式则接受任何不含 [ 的内容作为符号名——标点、空格、以数字开头等等都可以——因此例如 foo-bar 能被 Go 接受但被 Java 拒绝。本页记录的是 Java 语法;关于 Go 驱动程序接受哪些写法,请参阅其自身源码。

数据类型

直接地址中给出的 ADS 类型名称按如下方式映射到 PlcValueType:

ADS 类型PlcValueType
BOOLBOOL
BYTE, BIT8, BITARR8BYTE
WORD, BITARR16WORD
DWORD, BITARR32DWORD
SINT, INT8SINT
USINT, UINT8USINT
INT, INT16INT
UINT, INT16UINT
DINT, INT32DINT
UDINT, UINT32UDINT
LINT, INT64LINT
ULINT, UINT64ULINT
REAL, FLOATREAL
LREAL, DOUBLELREAL
CHARCHAR
WCHARWCHAR
STRINGSTRING
WSTRINGWSTRING
TIMETIME
LTIMELTIME
DATEDATE
TIME_OF_DAY, TODTIME_OF_DAY
DATE_AND_TIME, DTDATE_AND_TIME

符号地址本身不携带类型;其类型是从设备的数据类型表中解析出来的,因此符号地址不受此列表的限制。

示例

地址含义
16448/1234:DINT索引组 16448、偏移 1234 处的单个 DINT
0x4040/0xFF[0..4]:LREAL从偏移 0xFF 开始的五个十六进制 LREAL
100/200:STRING(80)索引组 100、偏移 200 处的 80 字符 STRING
0x10/0x20[0..2]:WSTRING(40)三个 40 字符的十六进制 WSTRING
Main.value符号地址
MAIN.g_arr[1..8]符号数组的第 1 至 8 个元素

表 1. 示例

协议详情

AMS/TCP 数据包结构

ADS(Automation Device Specification,自动化设备规范)是 TwinCAT 通信协议,用于规定两个 ADS 设备之间的交互。例如,它定义了可以对另一台 ADS 设备执行哪些操作、执行这些操作需要哪些参数,以及执行后返回什么值。

AMS(Automation Message Specification,自动化报文规范)规定了 ADS 数据的交换方式。该通信协议的一个重要组成部分是 AmsNetId。它在 AMS/ADS 数据包中为源设备和目标设备指定。通过 AmsNetId 可以显式寻址一台 ADS 设备。来源 https://infosys.beckhoff.com/english.php?content=../content/1033/ams_nat/4275563275.html&id=](访问日期:2022 年 8 月 7 日)

数据部分大小描述
AMS/TCP 头部6 字节包含数据包的长度。
AMS 头部32 字节AMS 头部包含发送方和接收方的地址,此外还包含 AMS 错误码、ADS 命令 ID 以及其他一些信息。
ADS 数据n 字节ADS 数据区域包含单条 ADS 命令的参数。数据部分的结构取决于具体的 ADS 命令。某些 ADS 命令不需要额外数据。

更多信息

有关该协议的详细信息,请参阅:http://www.beckhoff.com/](德语手册:https://download.beckhoff.com/download/Document/automation/twincat3/TwinCAT_3_ADS_INTRO_DE.pdf])

评论

登录后参与评论

正在加载评论…