EtherNet/IP Generic connects to standard EtherNet/IP devices that expose their data through the CIP object model rather than a controller tag namespace. It reads and writes CIP attributes by object path (class, instance, and attribute) using explicit messaging over TCP. This suits the wide range of field devices that speak EtherNet/IP without being programmable controllers: drives, valve islands, IO blocks, sensors, and third-party network adapters.
For Rockwell programmable controllers such as ControlLogix, CompactLogix, Micro800, MicroLogix, SLC500, and PLC-5, use the EthernetIP driver instead. That driver addresses controller tags by name. EtherNet/IP Generic addresses CIP objects by number and is the right choice when a device has no tag namespace to browse.
Each EtherNet/IP Generic device represents one connection to a device on its own IP address and port. Variables map individual CIP attributes into the project variable space. Configure the device first, then add variables to it.
Device Settings
Each EtherNet/IP Generic device represents one connection to a single device. Configure the connection endpoint and timing.
Create a new device with the Add button in the toolbar. The Add device dialog contains the device settings with default values already filled in. Enter at least the Name and IP Address and press Create.
The device row shows Enable, Name, IP Address, Port, Scan Rate, Timeout, Template, and Description directly and these values can be edited in place. Press the Settings icon on a device row to open the Edit device dialog, which contains all settings of the device. Press Save to apply the changes.
| Setting | Description | Example | Units / Format |
|---|---|---|---|
| Enable | Enables or disables this device. | true | Boolean |
| Simulation | Runs the device in simulation mode. The device does not open its real connection; its variables stay available and become read and write in memory like Local variables, with a Good status and a Channel State of Simulation, so the project can be tested without hardware. Written values are held in memory only and reset when the application restarts. | false | Boolean |
| Name | Unique name for this device. Used as the device name prefix in runtime variable references. | Drive1 | Text |
| IP Address | IP address of the device. | 192.168.1.40 | IP Address |
| Port | TCP port of the EtherNet/IP encapsulation session. The standard port is 44818 and is almost never changed. | 44818 | Integer |
| Scan Rate | Polling interval. All variables of the device are read once per scan cycle. | 1000 | Milliseconds |
| Timeout | Time allowed for each individual request to the device. Applied per request, not across the whole scan, so a device with many variables does not go offline as its variable count grows. | 3000 | Milliseconds |
| Template | Optional device template name. When set, this device uses a shared variable list from the named template device. | DriveTemplate | Text |
| Description | Free text description for documentation purposes. | Conveyor drive | Text |
| Verbose | Raises the amount of diagnostic detail written to the system log for this device. | 0 | Integer |
No rows match the filter.
Device Discovery
The Discover button in the toolbar finds EtherNet/IP devices on the local network. It sends a broadcast identity request and lists every device that answers, so a device can be added without knowing its address in advance.
Discovery relies on a broadcast and reaches only devices on the same subnet as the server. Devices behind a router do not answer.
Each result row shows the identity the device reports. Press Use on a row to open the Add device dialog with the IP Address, Port, and Name already filled in from the discovered device. Complete any remaining settings and press Create.
| Column | Description |
|---|---|
| IP Address | IP address the device answered from. |
| Port | EtherNet/IP port reported by the device, normally 44818. |
| Vendor | Vendor identifier assigned by ODVA. |
| Product Name | Product name text reported by the device. |
| Product Code | Vendor-specific product code. |
| Revision | Device revision, shown as major.minor. |
| Serial Number | Serial number reported by the device. |
No rows match the filter.
Variable Settings
Variables are added per device. Each variable maps one CIP attribute to the project variable space.
Create a new variable with the Add button in the toolbar. The Add variable dialog organizes all variable settings in the tabs General, Scaling, Historian, and Gateway, with default values already filled in. Enter at least the Name and Address on the General tab and press Create. When the variable is created on a template device, it is also created on all instance devices that use the template. On a template device, start the Name with the {Device} replacer, so that each instance device gets its own variable. The Name must resolve to a different variable on each device; this is checked for every instance device before anything is saved, when a variable is created and when it is renamed.
The variable row shows Enable, Name, Asset, Type, Address, and Description directly and these values can be edited in place. Press the Settings icon on a variable row to open the Edit variable dialog. Press Save to apply the changes. Changes made on a template device are also applied to the matching variable on all instance devices, while each instance keeps its own Modbus Address value. The Gateway tab settings Modbus Address, OPC UA, Writeable, MQTT Publisher, Kafka Device, Kafka Remap Device, and Kafka Remap Variable are also available as table columns, which are shown with Columns as described in the Configuration Tables article.
| Setting | Description | Example | Units / Format |
|---|---|---|---|
| Enable | Enables or disables this variable. | true | Boolean |
| Name | Full variable name. The {Device}. replacer prefix is optional: {Device} resolves to the device name when the device loads, so the variable follows a device rename automatically, while a literal name is used exactly as written and keeps working across device renames. The resolved name must be unique across the whole project. | {Device}.Speed_Actual | Text |
| Asset | Asset tag used to group and filter this variable. | ConveyorLine | Text |
| Type | Data type used to decode the attribute. BOOL, BYTE, INT, UINT, WORD, DINT, UDINT, DWORD, LINT, ULINT, REAL, LREAL, and STRING are supported. BYTE covers an unsigned 8-bit attribute. A bit selector on the address requires type BOOL. | REAL | Enum |
| Address | CIP object path in Class/Instance/Attribute notation. See the Addressing section for the full notation. | 0x64/1/3 | Text |
| Description | Free text description for documentation purposes. | Actual running speed | Text |
| User Groups | Comma-separated list of user groups that have access to this variable at runtime. | Operators,Supervisors | Text |
| Signature Required | Requires an electronic signature for each write to this variable from a page object, the Live Manager, the Runtime API or MCP while Part 11 compliance mode is enabled and Write variables marked Signature Required is selected under Signature Required Actions on the Parameters page. The write rights of the user and the value range are checked first, so a refused write does not open the Electronic Signature dialog. A variable created while Part 11 compliance mode is enabled starts with Signature Required selected. Writes by alarm, event and schedule actions, Python scripts and the gateways run without a signature. See the Electronic Signatures article. | true | Boolean |
| Recipe Targets | Recipe type name (target) this variable belongs to. Supports the {Device} placeholder, which resolves to the owning device name so one naming rule can spread a set of variables across several devices. | Line1 | Text |
| Recipe Parameter Name | Explicit name of the parameter this variable represents inside a recipe. Variables that fill the same role across different targets share the same Recipe Parameter Name, which is how values are matched on Apply and Snapshot. A variable takes part in recipes only when both Recipe Targets and Recipe Parameter Name are set. | Setpoint | Text |
| Trend Groups | Comma-separated list of trend group names this variable belongs to. A variable can be in several groups. The groups are the filter the Trend Analyst offers when picking variables. The names accept the {Device}, {DeviceName} and {VariableName} placeholders, so one UDT definition gives every instance its own group. | Pumps,{Device} | Text |
| Units | Engineering unit label displayed alongside the value. | rpm | Text |
| Format | Display format of the value on screens and in the Trend Analyst: the value of a Label or Input (unless the object uses its own Floating Point and Decimals), the value text of a Knob and a Slider, the Trend tooltip, a Data Grid Variable column, the right-click menu, Quick Trend, the current value in the Recipe Manager, variable tokens in alarm and event messages, and the Trend Analyst tooltip, summary and pen Format. An Input shows the plain value while it is being edited. 0 shows no decimals, 0.00 always shows two decimals, 0.0## shows one to three decimals and #,##0.00 adds a thousands separator, with up to 15 decimals. Values are rounded half away from zero for display only; alarms and expressions keep the full value, and so does the historian unless Round to Format is on. ReadVariable in the runtime API and MCP returns the Format beside the full value. Leave empty to show the value as received. | 0.00 | Text |
| Min Raw | Minimum raw value from the device, used for scaling. | 0 | Number |
| Max Raw | Maximum raw value from the device, used for scaling. | 32767 | Number |
| Min Scaled | Minimum engineering value corresponding to Min Raw. | 0 | Number |
| Max Scaled | Maximum engineering value corresponding to Max Raw. | 3000 | Number |
| Converter | Name of a Converter defined in the Converters configuration to apply a custom read/write expression. | RawToPressure | Text |
| Historian | Enables logging of this variable's values to the historian database. | true | Boolean |
| Round to Format | Stores the historian samples of this variable rounded to the decimals of its Format, as a plain number: with Format 0.00 the value 34.30487 is stored as 34.3. The deadband compares the rounded values, so with Deadband 0 a sample is written only when the rounded value changes. On a variable without scaling the Raw value is stored empty, since it equals the value. The live value, alarms, expressions and all interfaces keep the full value. Applies to new samples only; samples already stored keep their values. Requires a Format. | false | Boolean |
| Deadband | Minimum change in value required before a new historian record is written. | 0.5 | Number |
| Minimum Time (s) | Minimum time in seconds between historian records for this variable. | 0 | Seconds |
| Sample Group | Name of the Sample Group that controls the historian sampling rate for this variable. | Text | |
| History Source | Where the trends read the history of this variable: Project default (the History Source with Project default enabled on the History Sources page, or the EnvisionSCADA Historian when no source has it), EnvisionSCADA Historian (the samples recorded while Historian is on) or a History Source of the History Sources page (a query on a Database Connection or the fetch() function of a Python Module script). In the table, an empty History Source is Project default and Historian is the EnvisionSCADA Historian. Live values always come from the variable itself. Test reads the last 24 hours with the settings in the dialog. See the History Sources article. | Project default | Enum |
| History Reference | What the History Source reads for this variable: the reference passed to fetch(), or @Variable of the History Query. When empty, the History Reference of the source is used, by default the full name of the variable; the field shows it in italics. {Name} is replaced by the full name of the variable. Browse lists the references that a Script source offers. | CDT158 | Text |
| History Parameters | Shown for a Script source: optional key=value pairs separated by ;, added to the History Parameters of the source. A key set here replaces the same key of the source. The field shows the History Parameters of the source in italics. | scale=0.1 | Text |
| Modbus Address | Optional address on the built-in Modbus TCP and Modbus RTU servers where this variable is exposed. The servers are enabled in the Gateways section of the Parameters page. Each instance device keeps its own value. | %MW0 | See Modbus TCP Addressing |
| OPC UA | Exposes this variable as an OPC UA node. When Historize is also ticked, the Historian data of the variable is readable through OPC UA Historical Access. | true | Boolean |
| Writeable | Allows external systems to write this variable through the gateways: the OPC UA Server, the Modbus TCP and Modbus RTU servers, the MQTT publisher when Subscribe is enabled on the publisher, and Kafka when Consumer is enabled on the Kafka device. Writes from pages, actions, scripts and the API are independent of this setting. | false | Boolean |
| MQTT Publisher | Name of the MQTT publisher that publishes this variable, typed or chosen with the ... button. A variable is published by one publisher, and the name must match a publisher on the MQTT Publishers page. Leave empty to keep the variable unpublished. Writes from the broker need Subscribe on the publisher and Writeable on the variable. See the MQTT Publishers article. | CloudIoT | Text |
| Kafka Device | Name of the Kafka device this variable is linked to, typed or chosen with the ... button. Every value change of a linked variable is produced to the Producer Topic of the Kafka device while the device is enabled. Writes from the Consumer Topic need Consumer on the Kafka device and Writeable on the variable. Leave empty to keep the variable unlinked. See the Kafka Devices article. | KafkaBroker1 | Text |
| Kafka Remap Device | Device name used for this variable in Kafka messages instead of the name of the device that owns the variable. Inbound messages from the Consumer Topic are matched on this name as well. Leave empty to use the device name. | RemoteDrive1 | Text |
| Kafka Remap Variable | Variable name used for this variable in Kafka messages instead of its own name. Inbound messages from the Consumer Topic are matched on this name as well. Leave empty to use the variable name without the device name, for example Speed_Actual for Drive1.Speed_Actual on device Drive1. | Speed | Text |
No rows match the filter.
Addressing
A variable address is a CIP object path written as Class/Instance/Attribute. Each of the three parts is a number, written in decimal or with a 0x prefix for hexadecimal, so 0x64/1/3 and 100/1/3 are the same address. Instance 0 addresses the object class itself, which is how class-level attributes such as an object revision are read.
A single bit can be read from a packed attribute by adding a bit selector after the attribute, separated by a dot. For example 0x64/1/5.2 reads bit 2 of attribute 5. A bit selector requires type BOOL.
CIP transfers elementary types in little-endian byte order, so no byte or word swap setting is needed. STRING adapts to the length-prefix form the device reports, so the same STRING type reads a short string, a long string, or a fixed-length character array.
| Part | Description | Notation | Example |
|---|---|---|---|
| Class | CIP object class. Identifies the kind of object, such as the Assembly object (0x04) or a vendor-specific object. | Decimal or 0x hexadecimal | 0x64 |
| Instance | Object instance number. Instance 0 addresses the class itself. | Decimal or 0x hexadecimal | 1 |
| Attribute | Attribute number within the instance. | Decimal or 0x hexadecimal | 3 |
| Bit | Optional bit selector appended with a dot to read one bit of a packed attribute. Requires type BOOL. | Decimal | .2 |
No rows match the filter.
| Address | Meaning |
|---|---|
| 0x64/1/3 | Class 100, instance 1, attribute 3. |
| 100/1/3 | The same address written in decimal. |
| 0x04/100/3 | The data attribute of Assembly object instance 100. |
| 0x64/1/5.2 | Bit 2 of attribute 5 on class 100, instance 1. |
No rows match the filter.
Data Types
The Type setting decides how the attribute payload is decoded into a value. Choose the type that matches the attribute as documented by the device manufacturer.
| Type | Description | Size |
|---|---|---|
| BOOL | Boolean. Reads the whole byte as true or false, or a single bit when the address carries a bit selector. | 1 byte |
| BYTE | Unsigned 8-bit integer. | 1 byte |
| INT | Signed 16-bit integer. | 2 bytes |
| UINT | Unsigned 16-bit integer. | 2 bytes |
| WORD | Unsigned 16-bit value. | 2 bytes |
| DINT | Signed 32-bit integer. | 4 bytes |
| UDINT | Unsigned 32-bit integer. | 4 bytes |
| DWORD | Unsigned 32-bit value. | 4 bytes |
| REAL | IEEE 754 single precision floating point. | 4 bytes |
| LINT | Signed 64-bit integer. | 8 bytes |
| ULINT | Unsigned 64-bit integer. | 8 bytes |
| LREAL | IEEE 754 double precision floating point. | 8 bytes |
| STRING | Text. Adapts to the length-prefix form the device uses. | Variable |
No rows match the filter.
Writing Values and Scanning
A variable can be written from runtime pages, actions, scripts, and the API, and by external systems through the gateways when Writeable is enabled on the Gateway tab. A write encodes the value according to the variable Type and sends it to the CIP attribute with the Set_Attribute_Single service. Writing a single bit of a packed attribute reads the current attribute first and changes only the selected bit, so the surrounding bits are preserved.
On each scan cycle the device is polled once for every enabled variable. If a device stops responding it is marked offline and its variables report a connection loss until it answers again. If the device answers but rejects one request, for example because an attribute does not exist or is read-only, only that variable is marked while the rest of the device keeps scanning.