ADS(自动化设备规范)

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 |
|---|---|
| BOOL | BOOL |
| BYTE, BIT8, BITARR8 | BYTE |
| WORD, BITARR16 | WORD |
| DWORD, BITARR32 | DWORD |
| SINT, INT8 | SINT |
| USINT, UINT8 | USINT |
| INT, INT16 | INT |
| UINT, INT16 | UINT |
| DINT, INT32 | DINT |
| UDINT, UINT32 | UDINT |
| LINT, INT64 | LINT |
| ULINT, UINT64 | ULINT |
| REAL, FLOAT | REAL |
| LREAL, DOUBLE | LREAL |
| CHAR | CHAR |
| WCHAR | WCHAR |
| STRING | STRING |
| WSTRING | WSTRING |
| TIME | TIME |
| LTIME | LTIME |
| DATE | DATE |
| TIME_OF_DAY, TOD | TIME_OF_DAY |
| DATE_AND_TIME, DT | DATE_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])
评论
登录后参与评论
KnowForge