Protocols

ADS (Automation Device Specification)

qianmoQqianmoQ· 更新于 2026-09-30· 阅读 26 分钟· 0 次阅读

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

banner

The ADS (automation device specification) describes a device-independent and fieldbus independent interface for communication between Beckhoff automation devices running TwinCAT and other devices implementing this interface. https://www.home-assistant.io/integrations/ads/ Source (accessed 7 August 2022)

ADS device concept: https://infosys.beckhoff.com/english.php?content=../content/1033/ams_nat/4275563275.html&id= Source (accessed 7 August 2022)

Specification for ADS devices: https://infosys.beckhoff.com/english.php?content=../content/1033/ams_nat/4275563275.html&id= Source (accessed 7 August 2022)

Supported Operations

NameValueDescription
readReads one or more tags, addressed directly, as a string, or symbolically.
writeWrites one or more tags, addressed directly, as a string, or symbolically.
subscribeSubscribes to a symbolic handle resolved on the device. Works whether or not load-symbol-and-data-type-tables is enabled.
browseLists the symbol table. Requires load-symbol-and-data-type-tables; with it disabled a browse request is answered with UNSUPPORTED.

Connection String

The ADS connection string has the following format:

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

tcp is the only supported transport. The port defaults to the ADS TCP port and normally does not need to be given. target-ams-net-id, target-ams-port, source-ams-net-id and source-ams-port are required options:

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

Connection String Options

Name

Type

Default Value

Required

Description

Name

Beckhoff TwinCat ADS

Code

ads

Maven Dependency

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

Default Transport

tcp

Supported Transports

  • tcp

Config options:

target-ams-net-id

STRUCT

required

AMS-Net-Id of the target. An AMS-Net-Id has the regular format of an IPv4 IP-Address, however with 6 segments instead of 4.

target-ams-port

INT

required

AMS port of the target.

source-ams-net-id

STRUCT

required

AMS-Net-Id of the source. An AMS-Net-Id has the regular format of an IPv4 IP-Address, however with 6 segments instead of 4.

source-ams-port

INT

required

AMS port of the source.

request-timeout-ms

INT

4000

Default timeout for all types of requests.

max-data-type-table-depth

INT

20

Maximum nesting depth accepted when parsing the data-type table uploaded from the device. An entry may contain further entries, so without a limit the depth of the tree is dictated by the device rather than by the driver, and a table of well under a megabyte can nest deeply enough to exhaust the parser’s stack. Real type hierarchies are only a handful of levels deep, so the default is already generous; raise it for a device that is known to need more. Note that the JVM’s own stack imposes a practical ceiling of a few thousand levels regardless of what is configured here.

load-symbol-and-data-type-tables

BOOLEAN

true

Configures, if when connecting the data-type- and symbol-table should be read. This is an optimization that can help in cases, where the PLC program is pretty large and downloading the full tables is causing problems. When disabled, reading and writing is limited to direct addresses ({IndexGroup}/{IndexOffset}:{TYPE}): symbolic addresses cannot be resolved without the tables and are rejected with a corresponding error. Browsing is unavailable for the same reason. Subscriptions are unaffected, as they resolve symbol handles on the device.

Transport config options:

tcp

tcp.connect-timeout-ms

INT

5000

Connection timeout in milliseconds.

tcp.read-timeout-ms

INT

0

Socket read timeout in milliseconds. 0 means no timeout.

tcp.write-timeout-ms

INT

0

Socket write timeout in milliseconds. 0 means no timeout.

tcp.no-delay

BOOLEAN

true

Enable TCP_NODELAY (disable Nagle’s algorithm).

tcp.keep-alive

BOOLEAN

false

Enable SO_KEEPALIVE.

tcp.send-buffer-size

INT

81920

Send buffer size in bytes. 0 uses system default.

tcp.receive-buffer-size

INT

81920

Receive buffer size in bytes. 0 uses system default.

tcp.local-address

STRING

Local address to bind to (optional). If not set, uses default.

tcp.local-port

INT

0

Local port to bind to (optional). 0 uses ephemeral port.

Tag Addresses

Addressing is implemented in Go and Java. See the protocol support matrix for what each implementation does.

General Format

The driver accepts three kinds of addresses.

Array selection uses the shared notation - a single index, an inclusive range, and optionally the array’s declared lower bound, placed before the type. See Addressing arrays.

Direct addresses name the index group and index offset explicitly, in decimal or hexadecimal, and carry the data type:

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

Direct addresses need no symbol table and therefore work regardless of the load-symbol-and-data-type-tables setting.

Direct string addresses are a direct address whose type is STRING or WSTRING, and additionally carry the fixed length of the string:

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

Symbolic addresses use the variable name as it is known in the PLC program, with array indices appearing at any position of the path, not only at the end:

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

Symbolic addresses are resolved against the symbol- and data-type-table, so they require load-symbol-and-data-type-tables to be enabled (the default). With that option disabled the tables are never fetched and a symbolic address is rejected with an error saying so - use a direct address instead. Subscriptions are the exception: they resolve symbol handles on the device and work either way. Only the last dimension of a selection may be a range; an interior segment may only carry a bare index, since a range there would name several disjoint elements at once rather than one contiguous read.

Java caps a direct address’s index group and index offset at 8 hex digits or 10 decimal digits; Go’s port dropped that cap, so an address with more digits than a 32-bit value could ever need still matches the Go pattern and is rejected only later, if at all - for example 0x123456789/0:BOOL is accepted by Go but rejected by Java. Separately, Java requires a symbolic address’s path to be a dotted run of identifier segments ([a-zA-Z_]\w*, each optionally followed by bracketed indices); Go’s pattern accepts anything containing no [ as the symbol name - punctuation, spaces, a leading digit, anything - so for example foo-bar is accepted by Go but rejected by Java. This page documents the Java syntax; consult the Go driver’s own source for what it accepts.

Data Types

The ADS type name given in a direct address maps to a PlcValueType as follows:

ADS typePlcValueType
BOOLBOOL
BYTE, BIT8, BITARR8BYTE
WORD, BITARR16WORD
DWORD, BITARR32DWORD
SINT, INT8SINT
USINT, UINT8USINT
INT, INT16INT
UINT, UINT16UINT
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

A symbolic address carries no type in the address itself; its type is resolved from the device’s data-type table, so a symbolic address is not restricted to this list.

Examples

AddressMeaning
16448/1234:DINTa single DINT at index group 16448, offset 1234
0x4040/0xFF[0..4]:LREALfive LREALs in hexadecimal, starting at offset 0xFF
100/200:STRING(80)an 80-character STRING at index group 100, offset 200
0x10/0x20[0..2]:WSTRING(40)three 40-character WSTRINGs in hexadecimal
Main.valuea symbolic address
MAIN.g_arr[1..8]elements 1 to 8 of a symbolic array

Table 1. Examples

Protocol Details

Structure AMS/TCP Packet

ADS (Automation Device Specification) is the TwinCAT communication protocol that specifies the interaction between two ADS devices. For example, it defines what operations can be executed on another ADS device, what parameters are necessary for that and what return value is sent after execution.

AMS (Automation Message Specification) specifies the exchange of the ADS data. A major component of the communication protocol is the AmsNetId. This is specified in the AMS/ADS package for the source and target device. An ADS device can be explicitly addressed using the AmsNetId. Source https://infosys.beckhoff.com/english.php?content=../content/1033/ams_nat/4275563275.html&id= (accessed 7 August 2022)

Data arraySizeDescription
AMS/TCP Header6 bytescontains the length of the data packet.
AMS Header32 bytesThe AMS/TCP-Header contains the addresses of the transmitter and receiver. In addition, the AMS error code , the ADS command Id and some other information.
ADS Datan bytesThe ADS data range contains the parameter of the single ADS commands. The structure of the data array depends on the ADS command. Some ADS commands require no additional data.

More Information

For details about the protocol look here: http://www.beckhoff.com/ & (German Handbook: https://download.beckhoff.com/download/Document/automation/twincat3/TwinCAT_3_ADS_INTRO_DE.pdf)

评论

登录后参与评论

正在加载评论…