Skip to main content
Version: 3.0 (next)

EtherNet/IP Integration Guide

Connect MaestroHub to Allen-Bradley controllers over EtherNet/IP and work with their tags — the named variables of a controller program, such as Motor1_Speed or Program:Main.BatchCount. This guide covers everything you need: creating the connection, the controller families, every function type with its exact inputs and outputs, the tag picker, data types, limits, troubleshooting, and how to configure the connector through the API or an AI agent.

Overview​

The EtherNet/IP connector provides:

  • Tag reads and writes by name — controller-scoped and program-scoped tags, array elements, bits of integers (read), structure members, and whole structures (UDTs)
  • Batch reads and writes — many tags in one call, each tag with its own result, so one bad tag never hides the others' values
  • Automatic data types — read a tag as the controller types it, without knowing its type in advance
  • Tag discovery — list the controller's tags with their types, and the members of every structure
  • A tag picker in the function editor — browse the controller, or load a Studio 5000 export (.L5X) to pick tags without a live connection
  • Keep-alive, request deadlines, and a Test Connection that tells you what to fix

Supported controllers​

Controller familyModelsSetting
LogixControlLogix (1756), CompactLogix (1769, 5370, 5380, 5480) and other Logix 5000 controllersController Family Logix, and the CPU's slot
Micro800Micro820, Micro850, Micro870Controller Family Micro800 (no slot)
Not supported

Older Allen-Bradley controllers that speak PCCC rather than Logix tag services — SLC 500, MicroLogix and PLC-5 — are not supported by this connector. Cyclic (implicit, class 1) I/O connections are not used: the connector reads and writes tags on request.

Before you start​

  • Network: MaestroHub must reach the controller's IP address on TCP port 44818 (the EtherNet/IP standard). For a ControlLogix, the address is the Ethernet module's (for example a 1756-EN2T) — the connector then routes to the CPU through the chassis.
  • Tag names: you address tags by the names in the controller program. You can find them with Browse Tags, the tag picker, or a Studio 5000 export.
  • External Access: in Studio 5000, a tag whose External Access is None cannot be read or written by any client, and Read Only refuses writes. Constants refuse writes too.
  • Micro800: only global variables are reachable over the network; a program's local variables are not. A Micro800 does not describe its structures to network clients, so structures (UDTs) and BOOL arrays are not listed by Browse and cannot be read whole with data type udt.

Connection Configuration​

Creating an EtherNet/IP Connection​

From Connections → New Connection → EtherNet/IP, fill in the fields below, then click Test Connection and Create Connection.

FieldDefaultDescription
Profile Name–A descriptive name for this connection (required, up to 100 characters)
Description–Optional free text
Labels–Key–value pairs to organise connections (up to 10), for example plant: north, line: packaging
PLC Host–IP address or hostname of the controller, or of the ControlLogix Ethernet module (required)
Port44818TCP port. Change it only if your network maps EtherNet/IP to another port
Controller FamilyLogixLogix (ControlLogix, CompactLogix) or Micro800 (Micro820, Micro850, Micro870) — see below
PLC Slot0Slot of the CPU in the chassis, 0–16 (Logix only). Disabled for a Micro800, which takes no slot
Timeout (ms)5000How long to wait for the controller to answer one request, 1000–60000 in the form (the API accepts up to 300000). A request that is not answered in time fails, and the connection is re-opened for the next one
Keep-AliveonSend a small request every keep-alive interval while no function runs, so the controller does not close an idle connection
Keep-Alive Interval (ms)10000Time between keep-alive requests, 1000–60000 in the form

Controller Family and slot​

The controller family decides how the connection reaches the CPU and how batches are sent:

LogixMicro800
Route to the CPUThrough the chassis to the slot you setNone — the controller answers directly
PLC SlotThe CPU's slot (0 for a CompactLogix, whose CPU is always slot 0)Not used
Read/Write Multiple TagsAs many tags per request as fitOne tag per request, with the same per-tag results
Program-scoped tagsProgram:<Program>.<Tag>Not reachable (global variables only)
Structures (UDTs)Listed by Browse with their members; readable whole (udt)Not listed; not readable whole
Connections the controller acceptsMany (depends on the controller)Up to 16 at a time — keep the number of MaestroHub connections and other clients to one controller small

A connection saved without a controller family is a Logix connection — every connection created before this setting existed keeps working unchanged.

Choosing the slot (Logix)

ControllerSlot
CompactLogix (1769, 5370, 5380, 5480)0
ControlLogix (1756)The physical slot of the CPU module, counting from 0 at the left of the chassis

Test Connection​

Test Connection opens a real connection to the controller, runs the keep-alive check, asks the controller what it is, and closes the connection. It passes when the controller answers, and adds a note — without failing — when something deserves attention:

NoteWhat to do
The controller identifies itself as 1756-L83E/B, which is not a Micro800, but the controller family is micro800 …Set the Controller Family to Logix and enter the CPU's slot
The controller identifies itself as 2080-…, a Micro800, but the controller family is logix …Set the Controller Family to Micro800
Keep-alive is on, but the controller refused the keep-alive request …Nothing required: the connection runs without keep-alive, and the controller may close it after a quiet period; the next request reconnects
The slot (N) is not used: a Micro800 takes no route.Nothing required; the slot is ignored
The controller did not say what it is …The family could not be checked; the connection itself works

When the controller refuses the connection, the error says what to check:

  • on a Logix connection: "… the connection was routed to the CPU in slot N: check the slot; a Micro800 (Micro820/850/870) takes no route: set controllerFamily to micro800"
  • on a Micro800 connection: "… the connection was opened without a route, as a Micro800 takes it; for a ControlLogix or CompactLogix set controllerFamily to logix and the CPU's slot"

When nothing answers at all, the error names the host and port it tried: check the address, the port, and that the network lets MaestroHub reach the controller.

Keep-alive​

A controller closes a connection on which nothing has been sent for a while (roughly a minute and a half). With Keep-Alive on, the connector sends one small request every Keep-Alive Interval while no function runs, so the connection stays open and a pipeline that runs every few minutes does not reconnect each time. The setting is checked once when the connection opens: a controller that refuses the keep-alive request keeps its connection, runs without keep-alive, and Test Connection says so. If a keep-alive request goes unanswered, the connection is re-opened, as it would be for any unanswered request.

Timeouts​

Three limits can end a request, and the shortest applies:

LimitWhere it is setDefault
Timeout (ms) of the connectionThe connection form5 s — how long to wait for each answer from the controller
Request timeout of a functionrequestTimeout in the function's configuration (API) — a duration such as "10s", 1s–1h30 min
Node deadline of a pipelineThe pipeline node's settingsThe pipeline's

When a limit is reached, the request fails with a message saying so and the connection is re-opened; requests made in the few seconds while it re-opens fail with "not connected" and succeed again once it is back. Raise the connection timeout for controllers on slow links and for very large arrays or structures.

Tags and addressing​

Tag names are not case-sensitive: Temperature, TEMPERATURE and temperature are the same tag.

WhatSyntaxExample
Controller-scoped tag<Tag>Motor1_Speed
Program-scoped tag (Logix)Program:<Program>.<Tag>Program:MainProgram.BatchCount
Array element<Tag>[i]Temperature[3]
Element of a multi-dimensional array<Tag>[i,j]Matrix[1,2]
Structure (UDT) member<Tag>.<Member>Motor1.Speed
Nested member<Tag>.<Member>.<Member>Line1.Drive.Speed
Member of an array element<Tag>[i].<Member>Motors[2].Speed
Bit of an integer (read only)<Tag>.<bit>StatusWord.3 (DINT bits 0–31, INT 0–15, SINT 0–7)
Whole arraythe tag name + LengthTemperature with Length 10
Part of an arraythe first element + LengthTemperature[4] with Length 3 reads elements 4, 5 and 6
A parameter((name)) anywhere in the name((line)).Speed, Motors[((index))]

Data types​

Every read and write names a data type. Use the lowercase names below (the connector also accepts them in upper case).

Data TypeController typeValuesReadWrite
boolBOOLtrue / false✓✓
sintSINT−128 to 127✓✓
intINT−32,768 to 32,767✓✓
dintDINT−2,147,483,648 to 2,147,483,647✓✓
lintLINT64-bit signed✓✓
usintUSINT0 to 255✓✓
uintUINT0 to 65,535✓✓
udintUDINT0 to 4,294,967,295✓✓
ulintULINT64-bit unsigned✓✓
realREAL32-bit floating point✓✓
lrealLREAL64-bit floating point✓✓
stringSTRING (string types of your own read as text too)Text; a STRING write stores up to 82 characters✓✓
udtAny structure: a user-defined type, an Add-On Instruction, a TIMER…An object of the structure's members✓–
autoWhatever the tag isAs the controller types it; the result names the type✓–

BOOL arrays. A Logix controller stores a BOOL array 32 bits to a DWORD, and reports it that way: Browse lists a BOOL[64] as a DWORD array of 2 elements, a BOOL array inside a structure appears as DWORD members, and auto reads them as unsigned 32-bit words (udint), bit 0 of the first word being element 0.

The type must match the tag. A Read Tag whose data type is not the tag's is refused with the tag's real type — "failed to read tag 'Motor1_Speed': the tag is REAL; the function reads it as dint" — so change the data type, or use auto. In Read Multiple Tags each value is returned as the controller types it, whatever the entry says.

udt — a whole structure​

Reads a structure tag in one call and returns it as an object keyed by member name — nested structures as nested objects, array members as lists, BOOL members as true/false, STRING members as text. Members Studio 5000 keeps hidden are left out. The result carries udtName, the structure's name in the controller.

{ "tagName": "Motor1", "dataType": "udt", "udtName": "MotorUDT", "quality": "good",
"value": { "Running": true, "Faulted": false, "Speed": 1234.5, "Count": 77, "Label": "Conveyor A" } }
  • An array of structures reads with a Length (up to 1000) and returns a list of objects.
  • A structure is written member by member: write Motor1.Speed as real, Motor1.Running as bool. A write with data type udt is refused.
  • To read a single member, address it: Motor1.Speed with data type real.

auto — the controller's type​

Reads the tag and returns the value as the controller types it; the result's dataType names what it found — dint, real, string, bool for a bit, udt (with udtName) for a structure. BYTE, WORD, DWORD and LWORD tags read as usint, uint, udint and ulint. Use it when you do not know a tag's type, or when a function reads tags of different types through a parameter. Writes always name a type: auto is refused there.

Function Builder​

After saving the connection, create functions — reusable, named operations — from the connection's Functions tab → New Function, then pick the function type:

Function typeIDPurpose
Read Tagethernetip.readRead one tag, array or structure
Write Tagethernetip.writeWrite one tag or array
Read Multiple Tagsethernetip.read_tagsRead many tags in one call, each with its own result
Write Multiple Tagsethernetip.write_tagsWrite many tags in one call, each with its own result
Browse Tagsethernetip.browseList the controller's tags and the members of its structures

Every function has a Test Function button that runs it against the controller before you save.

The tag picker​

The Browse Tags panel beside the Read Tag, Write Tag, Read Multiple Tags and Write Multiple Tags forms lets you pick tags instead of typing them:

  • Browse lists the controller's tags (the connection must be able to reach it).
  • Load L5X reads the tags from a Studio 5000 export (.L5X) — no connection to the controller needed. The file is read in your browser and never uploaded; exports up to 100 MB are accepted. To export, open the project in Studio 5000 (Logix Designer) and choose File → Save As… with the file type Logix Designer XML File (*.L5X). For a very large project, export a part of it instead — right-click a program and choose Export Program… — and load that.

In the list:

  • a structure expands into its members, an array into its elements (the first 1000; type any other index by hand);
  • the filter box narrows the list by tag name, type or description;
  • clicking a row fills the form exactly as typing would: the tag name, its data type, and — for a whole array — its Length. In Read/Write Multiple Tags a click fills the first empty row, or adds one;
  • a row that the form cannot take stays visible, greyed out, with the reason — a structure in a write form (written member by member — expand it and pick a member), a whole array in a Multiple Tags form (one element per tag), an array longer than a read or write takes, and, from an L5X, a tag whose External Access is None or Read Only, a constant, or an alias in a write form;
  • a tag whose type the form does not name (for example a DWORD) is picked with data type auto in a read form.

The last list you loaded stays available for that connection while the page is open, so you can create several functions in a row without browsing again; reloading the page clears it.

Read Tag​

Purpose: read one tag — a single value, an array or a part of one, a bit, a structure member, or a whole structure.

FieldRequiredDefaultDescription
Tag NameYes–The tag's address — see Tags and addressing. Supports ((parameters))
Data TypeYesdintAny type of the table, including udt and auto
LengthNo1Number of elements: 1 for a single value; more for an array, starting at the element in Tag Name. Up to 10000, or 1000 for udt

Output — a single value:

{ "tagName": "Motor1_Speed", "dataType": "real", "value": 1500.5, "quality": "good" }

An array (Length > 1) adds length and isArray, and value is a list:

{ "tagName": "Temperature", "dataType": "real", "value": [20, 21, 22], "length": 3, "isArray": true, "quality": "good" }

A whole structure adds udtName (see udt). With auto, dataType is the type the controller gave.

Use cases: process variables, equipment status, a whole equipment structure in one read, historian collection of an array.

Write Tag​

Purpose: write one tag, one element, a structure member, or a run of array elements.

FieldRequiredDefaultDescription
Tag NameYes–The tag's address; for an array, the first element to write
Data TypeYesdintThe tag's type — one of the 12 writable types (not udt or auto)
ValueYes–The value to write; supports ((parameters))
LengthNo1Number of elements to write, starting at Tag Name (up to 10000)

Values

Data typeAccepted values
booltrue / false, 1 / 0, yes / no, on / off
integersWhole numbers within the type's range (25.5 is refused for a dint)
real, lrealNumbers
stringText; up to 82 characters are stored, longer text is cut to 82
An array (Length > 1)A list: [1, 2, 3], or the elements separated by commas: 1, 2, 3. For STRING elements that contain a comma use the bracketed form: ["a,b", "c"]

The list may hold fewer elements than Length; only the elements given are written.

Output:

{ "tagName": "Setpoint1", "dataType": "real", "value": 25.5 }

An array write adds length and isArray.

Not writable: a bit of an integer (StatusWord.3) — write the whole integer, or a BOOL tag; a whole structure — write its members; a tag whose External Access is Read Only or None, and constants — the controller refuses them ("the controller refused access: the tag is read-only or its External Access forbids it").

Safety First

Writes change a running process. Validate values before writing to industrial equipment — for example with a condition node that checks a value is within a safe range — and restrict who can create and run write functions.

Read Multiple Tags​

Purpose: read many tags in one call. The connector sends them in as few requests as the connection allows (on a Micro800, one per tag), and every tag gets its own result: a tag the controller refuses is marked bad with its reason, and every other tag still delivers its value.

FieldRequiredDescription
TagsYesA list of entries, each with a Tag Name and a Data Type (udt and auto included). Each entry reads one element — use Temperature[3], not a Length

Output:

{
"tags": [
{ "tagName": "ProductCount", "dataType": "dint", "success": true, "value": 42, "quality": "good" },
{ "tagName": "Motor1", "dataType": "udt", "udtName": "MotorUDT", "success": true, "value": { "Running": true, "Speed": 1234.5 }, "quality": "good" },
{ "tagName": "NoSuchTag", "dataType": "dint", "success": false, "error": "not found on the controller (CIP status 0x04: path segment error)", "quality": "bad" }
],
"count": 3,
"quality": "bad"
}
  • quality of the whole result is bad when any tag failed, good otherwise.
  • When some tags fail, the function reports a summary — "1 of 3 tags failed (NoSuchTag: not found on the controller …)" — the Test dialog shows it in red, and in a pipeline the node still completes with every tag's result, so the next nodes can use the values that were read and branch on the ones that were not.

Write Multiple Tags​

Purpose: write many tags in one call, each tag with its own result.

FieldRequiredDescription
TagsYesA list of entries, each with Tag Name, Data Type (one of the 12 writable types) and Value. One element per entry

Output:

{
"tags": [
{ "tagName": "Setpoint1", "dataType": "real", "success": true },
{ "tagName": "Setpoint2", "dataType": "dint", "success": false, "error": "value conversion failed: cannot parse string '25.5' to int32 …" }
],
"count": 2,
"successCount": 1,
"failureCount": 1
}
  • A tag whose value does not convert to its type is refused before anything is sent; the others are written.
  • A tag the controller refuses carries the controller's reason; the others are written.
  • As with reads, a partial failure is summarised ("1 of 2 tags failed (Setpoint2: …)") and a pipeline node completes; branch on failureCount or on each tag's success.

Browse Tags​

Purpose: list the controller's tags — controller-scoped and every program's — with their types, and the members of every structure they hold.

FieldRequiredDescription
FilterNoKeep only tags whose name or address starts with this text (not case-sensitive), for example Motor or Program:Main.. Leave empty to list everything

Output:

{
"tags": [
{ "name": "Temperature", "address": "Temperature", "dataType": "REAL", "dimensions": [10], "isArray": true, "isStruct": false },
{ "name": "Motor1", "address": "Motor1", "dataType": "UDT", "udtName": "MotorUDT", "dimensions": [], "isArray": false, "isStruct": true },
{ "name": "program:MainProgram.BatchCount", "address": "Program:MainProgram.BatchCount", "dataType": "DINT", "dimensions": [], "isArray": false, "isStruct": false, "program": "MainProgram" }
],
"tagCount": 3,
"types": {
"MotorUDT": [
{ "name": "Running", "dataType": "BOOL", "dimensions": [], "isArray": false, "isStruct": false },
{ "name": "Speed", "dataType": "REAL", "dimensions": [], "isArray": false, "isStruct": false },
{ "name": "Label", "dataType": "STRING", "dimensions": [], "isArray": false, "isStruct": true }
]
}
}
KeyMeaning
addressThe tag name to use in a read or write — for a program tag, Program:<Program>.<Tag>
nameThe tag's listed name (for a program tag, program:<Program>.<Tag>)
dataTypeThe controller's type name in upper case (DINT, REAL, …), STRING for a string, UDT for a structure
udtNameFor a structure: its type's name
dimensions, isArrayAn array's size per dimension
isStructtrue for a structure, a STRING included
programFor a program-scoped tag: the program's name
typesEvery structure the listed tags hold, nested ones included, by name: each member's name, dataType, dimensions, isArray, isStruct, and udtName when the member is itself a structure. A member is read as <address>.<member name>

Browse lists the tags a client can use: controller system entries, hidden tags (names starting with __) and module-defined I/O tags (names with a colon, such as Local:1:I) are not listed, and programs themselves are not listed as tags. On a Micro800 it lists the global variables, except structures and BOOL arrays, which a Micro800 does not list.

Using Parameters​

Any Tag Name or Value can contain parameters with the ((parameterName)) syntax. They appear in the function editor's Function Parameters panel and are filled in when the function runs — from a pipeline, or from the Test dialog.

SettingDescriptionExample
TypeThe type the value is given innumber, string, boolean
RequiredWhether a value must be givenRequired / Optional
Default ValueUsed when no value is given0, false, 100.0
DescriptionWhat the parameter is for"Target temperature in °C"

Examples:

  • Write Tag, Tag Name Setpoint, Data Type real, Value ((target)) — one function writes any setpoint a pipeline computes.
  • Read Tag, Tag Name ((tag)), Data Type auto — one function reads any tag by name.
  • Write Tag, Tag Name Recipe, Length 4, Value ((steps)) — a parameter holding 10, 20, 30, 40 writes four elements.

Quick Add: Bulk Function Creation​

To create many functions at once — onboarding a controller, converting a tag list — use Quick Add Functions on the connection's Functions tab: enter rows in a table or import a CSV.

Columns

ColumnRequired ForDescriptionExample
Function NameAllUnique name within the connectionRead_Temperature
TypeAllethernetip.read, ethernetip.write, ethernetip.read_tags, ethernetip.write_tags, ethernetip.browse (or the short form read, write, read_tags, write_tags, browse)ethernetip.read
Tag NameAll except browseThe tag's addressTemperature, Program:Main.Speed, DataArray[0]
Data TypeAll except browseA type from Data types; udt and auto only on read rowsreal, dint, udt
ValueWritesThe value, or a ((parameter))75.5, ((targetTemp))
FilterBrowseOptional prefixMotor
LabelsOptionalkey=value;key=value, up to 10area=process;env=prod

Quick Add creates single-element functions (Length 1); set a Length afterwards in the function editor for arrays.

Automatic grouping: rows of type read_tags or write_tags that share a Function Name become one Read/Write Multiple Tags function with one entry per row; their labels are merged. Single-tag and browse rows never group; duplicate names get _2, _3, … Validation flags duplicate tags within a group, conflicting label values across a group's rows, missing values on write rows, unknown data types, and udt/auto on write rows — before anything is created.

CSV format — the header must match the column keys (not case-sensitive); note functionType, not type:

name,functionType,tagName,dataType,value,filter,labels
Read_Temperature,ethernetip.read,Temperature,real,,,area=process;env=prod
Read_MotorStatus,ethernetip.read,Motor1_Running,bool,,,area=motors
Read_Motor,ethernetip.read,Motor1,udt,,,area=motors
Write_Setpoint,ethernetip.write,Setpoint,real,75.5,,team=automation
Write_TargetFromParam,ethernetip.write,Setpoint,real,((targetTemp)),,team=automation;priority=high
Process_Readings,ethernetip.read_tags,Temperature,real,,,area=process
Process_Readings,ethernetip.read_tags,Pressure,real,,,area=process
Process_Readings,ethernetip.read_tags,FlowRate,real,,,area=process
Recipe_Setpoints,ethernetip.write_tags,Setpoint,real,75.5,,team=recipe
Recipe_Setpoints,ethernetip.write_tags,Tank1_Setpoint,real,50.0,,team=recipe
Browse_MotorTags,ethernetip.browse,,,,Motor,

The Example CSV button in the Quick Add dialog downloads this template. Files saved by Excel on Windows (with a byte-order mark) are accepted. Test All and Create build exactly the same functions, so what passes the test is what is created.

Pipeline Integration​

Use the functions as nodes in the Pipeline Designer.

EtherNet/IP Node​

The EtherNet/IP node runs one function of a connection: pick the connection and the function, bind its parameters to upstream outputs or constants, and set retries or an error branch. The function decides the operation. The node's output is the function's result under result — see the EtherNet/IP node reference for every key.

  • A Read/Write Multiple Tags node completes even when some tags failed: branch on result.quality, result.failureCount or each result.tags[i].success.
  • An error that cannot succeed on a retry — a tag that does not exist, a wrong data type, a refused value, a read-only tag — is reported as permanent, so store-and-forward does not retry it; a lost connection or an unanswered request is reported as temporary.

EtherNet/IP Read Group Node​

The EtherNet/IP Read Group node runs several read functions in one node and returns each function's result under its name — convenient for collecting a set of values at once.

ApproachUse Case
EtherNet/IP NodeOne function: a read, a write, a batch or a browse
Read Group NodeSeveral read functions, results side by side
Read Multiple Tags functionMany tags of one controller read together in as few requests as possible

Configuring through the API or an AI agent​

Connections and functions can also be created through the REST API or by an AI agent using MaestroHub's MCP tools. They take the same configuration the forms save.

Connection (type: "ethernetip"):

{
"host": "192.168.1.10",
"port": 44818,
"controllerFamily": "logix",
"slot": 0,
"timeout": 5000,
"keepAlive": true,
"keepAliveInterval": 10000
}
KeyTypeNotes
hoststringRequired
portintegerDefault 44818
controllerFamily"logix" or "micro800"Default logix; any other value is refused
slotinteger0–16; ignored for micro800
timeoutinteger, msDefault 5000
keepAlivebooleanDefault true
keepAliveIntervalinteger, msDefault 10000

Functions — functionType plus functionConfig:

{ "functionType": "ethernetip.read", "functionConfig": { "tagName": "Motor1_Speed", "dataType": "real" } }
{ "functionType": "ethernetip.read", "functionConfig": { "tagName": "Temperature", "dataType": "real", "length": 10 } }
{ "functionType": "ethernetip.read", "functionConfig": { "tagName": "Motor1", "dataType": "udt" } }
{ "functionType": "ethernetip.read", "functionConfig": { "tagName": "((tag))", "dataType": "auto" } }
{ "functionType": "ethernetip.write", "functionConfig": { "tagName": "Setpoint1", "dataType": "real", "value": "25.5" } }
{ "functionType": "ethernetip.write", "functionConfig": { "tagName": "Temperature[7]", "dataType": "real", "length": 3, "value": [71.5, 81.5, 91.5] } }
{ "functionType": "ethernetip.read_tags", "functionConfig": { "tags": [ { "tagName": "ProductCount", "dataType": "dint" }, { "tagName": "Motor1", "dataType": "auto" } ] } }
{ "functionType": "ethernetip.write_tags", "functionConfig": { "tags": [ { "tagName": "Setpoint1", "dataType": "real", "value": "1.5" }, { "tagName": "Mode", "dataType": "usint", "value": "2" } ] } }
{ "functionType": "ethernetip.browse", "functionConfig": { "filter": "Motor" } }
  • dataType is required on every read and write entry; use auto when the type is unknown (reads only).
  • value may be a number, a boolean, text, or — for an array — a list or its text form ("[1, 2, 3]", "1, 2, 3").
  • length is optional (default 1); requestTimeout is optional, a duration such as "10s" (1s–1h, default 30m).
  • A good first step for an agent is a Browse Tags call: its address values are the tag names to use, its dataType (in lower case) the data types, and types the members of each structure.

Limits​

WhatLimit
Elements in one read or write (Length)10,000
Elements in one read of whole structures (udt)1,000
Characters stored by a STRING write82
Nesting depth of a structure read whole8 levels
Array elements listed by the tag pickerthe first 1,000 (type any other index)
Size of an L5X file loaded in the tag picker100 MB

Troubleshooting​

MessageMeaningWhat to do
failed to read tag 'X': not found on the controller (CIP status 0x04 …)No tag of that name — or a program tag without its Program: prefixCheck the spelling and scope; use Browse Tags or the tag picker
the tag is REAL; the function reads it as dintThe data type does not match the tagSet the data type the message names, or use auto
the controller refused access: the tag is read-only or its External Access forbids itExternal Access is Read Only or None, or the tag is a constantChange External Access in Studio 5000, or write another tag
the position is beyond the end of the tag / the elements asked for reach beyond the end of the tagAn index or a Length past the end of the arrayLower the index or the Length
writing a single bit of an integer is not supportedA write to Tag.3Write the whole integer, or use a BOOL tag
dataType udt reads a whole structure and cannot be writtenA write with data type udtWrite the members, each with its own type
a read of whole UDTs takes at most 1000 elementsA udt read with Length above 1000Read fewer, or the members you need
value must be an array when length > 1 / value is not a list …An array write whose value is not a listGive [1, 2, 3] or 1, 2, 3
value conversion failed: cannot parse string '25.5' to int32The value does not fit the data typeFix the value or the data type
… the connection was routed to the CPU in slot N: check the slot …The controller refused the connectionCheck the slot; for a Micro800 set Controller Family to Micro800
not connectedThe connection is being re-opened after a failureRetry after a few seconds; it reconnects by itself
A request fails at its deadlineThe controller did not answer within the timeoutCheck the network; raise the connection Timeout or the function's request timeout
the controller's keyswitch position prevents the request / the controller is in upload or download modeThe controller is not in a state to serve requestsRetry once the controller is back in Run or Remote Run