CIP Service Codes Complete Reference: Common Services and Object-Specific Codes

By | June 17, 2026

Every CIP message starts with a one-byte service code. That byte tells the target device what to do — read an attribute, write an attribute, open a connection, reset, save configuration. This page is the authoritative reference for every CIP service code defined by ODVA’s CIP Networks Library Volume 1, Appendix A.

If services are the verbs of CIP, this article is the verb dictionary. If you’re decoding a Wireshark capture and need to know what service code 0x0A does, or you’re reading a Studio 5000 error log that mentions service 0x4B, this is your reference.

For broader context on how CIP works, see our CIP Protocol Complete Guide. For the error codes services return when they fail, see our CIP General Status Codes Reference.

Quick jump — the services you’ll actually see

  • 0x01 Get_Attributes_All
  • 0x02 Set_Attributes_All
  • 0x05 Reset
  • 0x0A Multiple_Service_Packet
  • 0x0E Get_Attribute_Single
  • 0x10 Set_Attribute_Single
  • 0x4B Forward_Open
  • 0x4E Forward_Close
  • 0x52 Unconnected_Send
  • 0x54 Large_Forward_Open

What CIP service codes are

A CIP request message has a clean structure:

| Service Code (1 byte) | Request Path Size (1 byte) | Request Path (variable) | Service Data (variable) |

The service code is always the first byte. Everything else describes which object the service acts on and what data the service needs.

The reply mirrors the request with one critical change — the reply service code is the request service code with bit 7 (MSB) set. So:

  • Request Get_Attribute_Single = 0x0E
  • Reply Get_Attribute_Single = 0x8E

This bit-7 convention lets a receiver immediately distinguish requests from replies on a single wire. When you see service code 0x8E in Wireshark, it’s a reply to a Get_Attribute_Single request.

How CIP services are organized

The service code space is divided into ranges:

RangeCategoryPurpose
0x00–0x31CIP Common ServicesDefined by Volume 1 Appendix A — work on most object classes
0x32–0x4AObject class-specificEach object class defines its own services in this range
0x4B–0x7FObject class-specific (continued)Includes Connection Manager services like Forward_Open
0x80–0xFFReply service codesThese are responses to the corresponding request codes (with bit 7 set)

So when you see 0x0E in a CIP message, it’s Get_Attribute_Single (a Common Service). When you see 0x4B, it’s a Connection Manager-specific service (Forward_Open). When you see 0x8E, it’s a Get_Attribute_Single reply.

This division means a vendor designing a new object class can define their own custom services in the 0x32–0x7F range without colliding with Common Services. The Common Services range is owned by ODVA; the object-specific range is owned by whoever owns the object class.

CIP Common Services — complete table

From ODVA Volume 1 Appendix A Table A-3.1, the complete list of CIP Common Service codes:

CodeService NamePurpose
0x00(Reserved)Reserved for future use
0x01Get_Attributes_AllRead every attribute of an instance or class in one transaction
0x02Set_Attributes_AllWrite all attributes of an instance or class in one transaction
0x03Get_Attribute_ListRead a list of selected attributes by ID
0x04Set_Attribute_ListWrite a list of selected attributes by ID
0x05ResetReset the object — typically returns to default state
0x06StartStart the object’s behavior
0x07StopStop the object’s behavior
0x08CreateCreate a new instance of the object class
0x09DeleteDelete an instance
0x0AMultiple_Service_PacketBundle several services into one transaction
0x0B–0x0C(Reserved)Reserved for future use
0x0DApply_AttributesApply pending attribute changes
0x0EGet_Attribute_SingleRead one specific attribute
0x0F(Reserved)Reserved for future use
0x10Set_Attribute_SingleWrite one specific attribute
0x11Find_Next_Object_InstanceLocate the next instance of an object
0x12–0x13(Reserved)Reserved for future use
0x14Error ResponseDeviceNet-only — used in error replies on DeviceNet
0x15RestoreRestore previously saved attribute data
0x16SaveSave current attribute data to non-volatile storage
0x17No Operation (NOP)No-op — used for testing or keep-alive
0x18Get_MemberRead a member of a structured attribute
0x19Set_MemberWrite a member of a structured attribute
0x1AInsert_MemberInsert a new member into a structured attribute
0x1BRemove_MemberRemove a member from a structured attribute
0x1CGroupSyncGroup synchronization service
0x1D–0x31(Reserved)Reserved for additional Common Services

The four bolded services — Get_Attribute_Single, Set_Attribute_Single, Get_Attributes_All, Set_Attributes_All — handle the vast majority of CIP configuration and diagnostic traffic in production systems. Multiple_Service_Packet is the go-to optimization when a client needs to do many small operations efficiently. Reset is the most common state-machine service.

Deep dive on the services you’ll actually use

0x01 Get_Attributes_All

Spec: Returns the contents of the instance or class attributes defined in the object definition.

What it does: Reads every attribute of an instance (or class) in a single transaction. The device packs all its attributes into one response in the order defined by the object specification.

Request structure: Just the service code and the path. No service data.

Response structure: Object-defined byte stream containing all attributes in spec-defined order.

When to use it: Initial device inventory, populating a configuration tool, getting a snapshot of an object’s state. Far more efficient than reading attributes one at a time.

Watch out for: If the device implements only some attributes, the response is shorter than expected. The spec says clients should assume default values for missing attributes at the end. If a missing attribute lands in the middle of the response, the response data is in error and should be discarded.

Common usage: Reading the Identity Object (Class 0x01) Instance 1 with Get_Attributes_All returns Vendor ID, Device Type, Product Code, Revision, Status, Serial Number, Product Name, and State — everything you need to identify the device in one transaction.

0x02 Set_Attributes_All

Spec: Modifies the contents of the instance or class attributes defined in the object definition.

What it does: Writes all attributes of an instance in a single transaction. The data must be in the exact order and format defined by the object specification.

Request structure: Object-defined byte stream containing all settable attributes.

Response structure: Status only — no data.

When to use it: Bulk configuration write where you want to set everything in one shot.

Watch out for: All settable attributes must be present in the request — if any are missing, the request fails. If any single attribute value fails validation, the entire Set_Attributes_All is rejected and returns Status 0x09 (Invalid attribute value) with the Additional Code identifying which attribute failed first.

0x05 Reset

Spec: Invokes the Reset service of the specified Class/Object. Typically this would cause a transition to a default state or mode.

What it does: Forces the object (or device) into its default state. On the Identity Object (Class 0x01), Reset reboots the entire device.

Request structure: Optional object-specific parameters. Some Reset services accept a parameter indicating the type of reset (e.g., 0 = reset state, 1 = reset to factory defaults).

Response structure: Status only.

Important behavior from the spec: If the Reset will leave the object in a state where it cannot respond, the device must respond before executing the reset. This is how a “reboot the device” Reset works — the device sends the reply, then reboots. The reply confirms the command was received, even though the device goes offline immediately afterward.

Common usage: Reset on Identity Object Instance 1 to reboot the device. Reset on the Identity Object with parameter 1 to factory-default the device. Reset on a Connection Object to drop a stuck connection.

0x0A Multiple_Service_Packet

Spec: Service that bundles several other services into a single transaction.

What it does: The Message Router Object (Class 0x02) implements this service. The request contains a count of embedded services and the offset to each one. The response contains the corresponding individual replies.

Why this matters: Network round-trip time often dominates configuration performance. Reading 50 separate attributes with 50 separate Get_Attribute_Single calls takes 50 round-trips. Bundling them into one Multiple_Service_Packet takes one round-trip. Studio 5000, RSLinx, and most configuration tools use this aggressively under the hood.

Watch out for: The response gets large fast. Hit Status 0x11 (Reply data too large) if you bundle too much. The size limit is the smaller of the device’s connection size and the encapsulation packet limit.

0x0E Get_Attribute_Single

Spec: The Get_Attribute_Single service shall return the contents of a single attribute.

What it does: Reads one attribute. The path identifies Class, Instance, and Attribute. The response carries just that attribute’s value.

Request structure: Service code + path to Class/Instance/Attribute. No service data.

Response structure: Just the attribute’s value as a byte stream.

When to use it: Almost always. Get_Attribute_Single is the workhorse of CIP. Almost every configuration tool’s “read this value” operation issues a Get_Attribute_Single underneath.

Example: Service 0x0E, Class 0x01, Instance 1, Attribute 7 reads the Product Name of any CIP device.

0x10 Set_Attribute_Single

Spec: The Set_Attribute_Single service shall modify the contents of a single attribute.

What it does: Writes one attribute. The path identifies Class, Instance, and Attribute. The service data carries the new value.

Request structure: Service code + path + new value.

Response structure: Status only.

When to use it: Almost always for writes. Like its Get sibling, Set_Attribute_Single is the workhorse. Configuration tools use it for “change this value” operations.

Common errors:

  • 0x0E (Attribute not settable) — read-only attribute
  • 0x09 (Invalid attribute value) — value out of range or wrong type
  • 0x14 (Attribute not supported) — Attribute ID doesn’t exist
  • 0x10 (Device state conflict) — device won’t accept changes in its current state

Critical object-specific services

The Common Services above are defined by ODVA in Appendix A. Below this range, individual object classes define their own services. The Connection Manager Object (Class 0x06) defines the most commonly seen object-specific services.

0x4B Forward_Open

What it does: Establishes a CIP connection. This is the service every I/O connection starts with. The originator sends Forward_Open to the target’s Connection Manager Object (Class 0x06) specifying connection parameters. If the target accepts, a Connection ID is returned and cyclic exchange begins.

Request carries: Connection priority, transport class, trigger type, RPI (Requested Packet Interval), timeout multiplier, network connection parameters (size, type, redundant owner), connection path (which Assembly objects to use), electronic keying segment.

Response carries: OT (originator-to-target) Connection ID, TO (target-to-originator) Connection ID, OT API (Actual Packet Interval), TO API.

Why it matters: Forward_Open is the most-watched service in any EtherNet/IP capture. Every cyclic I/O connection starts here. Every connection failure shows up as a Forward_Open returning General Status 0x01 with an Extended Status that explains why.

0x4E Forward_Close

What it does: Closes a CIP connection. The originator sends Forward_Close to the same Connection Manager that received the Forward_Open. The connection is torn down, resources are freed, and no further cyclic data flows.

Request carries: Connection serial number, originator vendor ID and serial number, connection path.

Response carries: Status only.

Common usage: Issued when a PLC is removed from a configuration, when a tool finishes its session, or when a connection is being reconfigured. Issuing Forward_Close cleanly is preferable to letting connections time out — the latter takes longer to free resources on the target.

0x52 Unconnected_Send

What it does: Sends a CIP message through the network without first opening a connection. The Connection Manager uses this for explicit messaging across multiple network hops — for example, a ControlLogix PLC on EtherNet/IP reading a parameter from a DeviceNet drive through a 1756-DNB scanner.

Request carries: Timeout, embedded service request (the actual CIP message being sent), route path (the network hops to reach the destination).

Response carries: The reply from the destination, returned through the same route.

When to use it: Cross-network explicit messaging. For same-network unconnected messaging, the simpler UCMM mechanism is used at the encapsulation layer.

0x54 Large_Forward_Open

What it does: Same as Forward_Open but with larger fields to support data sizes beyond the standard Forward_Open’s 16-bit limit. Used when a connection’s data size exceeds 511 bytes.

Why it exists: Original Forward_Open used 16-bit network connection parameters with a 9-bit size field — limiting connections to 511 bytes. Large_Forward_Open uses 32-bit parameters supporting much larger connections, which is necessary for modern PLCs that exchange large structured data over single I/O connections.

When to use it: Generally handled automatically by the engineering tool. If your tool reports “connection size exceeds Forward_Open limit,” it will switch to Large_Forward_Open internally.

Request and reply service codes — bit 7

This is the rule worth memorizing. Every CIP reply has the same service code as the corresponding request, but with bit 7 set:

RequestReplyDescription
0x010x81Get_Attributes_All
0x020x82Set_Attributes_All
0x050x85Reset
0x0A0x8AMultiple_Service_Packet
0x0E0x8EGet_Attribute_Single
0x100x90Set_Attribute_Single
0x4B0xCBForward_Open
0x4E0xCEForward_Close
0x520xD2Unconnected_Send
0x540xD4Large_Forward_Open

When you see service code 0xCB in Wireshark, it’s a Forward_Open reply. When you see 0x8E, it’s a Get_Attribute_Single reply. The bit-7 convention works for every service code in the protocol.

The reply tells the receiver:

  • Status 0x00 → Success, the response service data carries the requested information
  • Status non-zero → Failure, the response service data carries the error information

Services by use case

Different jobs call for different services. Here’s a cheat sheet:

Device discovery and identification

  • 0x01 Get_Attributes_All on Identity Object — full device info in one shot
  • 0x0E Get_Attribute_Single on Identity Object Attribute 7 — Product Name only
  • 0x0E Get_Attribute_Single on Identity Object Attribute 6 — Serial Number only

Configuration

  • 0x10 Set_Attribute_Single — change one parameter
  • 0x02 Set_Attributes_All — bulk parameter set
  • 0x16 Save — commit configuration to non-volatile storage
  • 0x15 Restore — load previously saved configuration

I/O connection establishment

  • 0x4B Forward_Open — open standard I/O connection
  • 0x54 Large_Forward_Open — open large I/O connection (>511 byte data)
  • 0x4E Forward_Close — close I/O connection

Cross-network explicit messaging

  • 0x52 Unconnected_Send — send a one-shot CIP message across network boundaries

Bulk efficient operations

  • 0x0A Multiple_Service_Packet — bundle many small operations into one round-trip

Device control

  • 0x05 Reset — reset object or device
  • 0x06 Start — start object behavior
  • 0x07 Stop — stop object behavior

Structured attribute access

  • 0x18 Get_Member — read one member of a structured attribute
  • 0x19 Set_Member — write one member of a structured attribute
  • 0x1A Insert_Member — add a member to a structured attribute
  • 0x1B Remove_Member — remove a member from a structured attribute

Reading service codes in Wireshark

Wireshark’s CIP dissector decodes service codes automatically. Useful filters:

cip                                  # All CIP traffic
cip.service == 0x01                  # Get_Attributes_All requests
cip.service == 0x0E                  # Get_Attribute_Single requests
cip.service == 0x10                  # Set_Attribute_Single requests
cip.service == 0x4B                  # Forward_Open requests
cip.service == 0x4E                  # Forward_Close requests
cip.service == 0x52                  # Unconnected_Send
cip.service == 0xCB                  # Forward_Open replies
cip.service == 0x8E                  # Get_Attribute_Single replies
cip.service == 0x0A                  # Multiple_Service_Packet

A useful diagnostic pattern: filter on cip.service == 0x4B to find every connection-open attempt in a capture. Each one will be followed by a cip.service == 0xCB reply. If the reply carries cip.genstat != 0, that connection failed and the Extended Status carries the reason.

For broader EtherNet/IP capture workflows, see our Wireshark for EtherNet/IP guide.

Common errors associated with each service

When a service fails, it returns a General Status Code. Some failures are tied to specific services:

ServiceCommon errorWhat it usually means
0x0E Get_Attribute_Single0x14 (Attribute not supported)Attribute ID doesn’t exist on this object
0x10 Set_Attribute_Single0x0E (Attribute not settable)Attribute is read-only
0x10 Set_Attribute_Single0x09 (Invalid attribute value)Value out of range or wrong type
0x01 Get_Attributes_All0x08 (Service not supported)Object doesn’t implement this service
0x4B Forward_Open0x01 + Extended 0x0106Connection ownership conflict
0x4B Forward_Open0x01 + Extended 0x0111RPI not supported
0x4B Forward_Open0x01 + Extended 0x0113Out of connections
0x4B Forward_Open0x01 + Extended 0x0114-0x0116Electronic keying failure
0x05 Reset0x10 (Device state conflict)Device can’t reset from its current state
0x02 Set_Attributes_All0x14 (Attribute not supported)Some required settable attribute isn’t implemented
0x16 Save0x19 (Store operation failure)NVRAM write failed
0x0A Multiple_Service_Packet0x11 (Reply data too large)Bundled responses exceed buffer

Frequently asked questions

What is a CIP service code?

A CIP service code is a one-byte value in every CIP request and reply that identifies which operation is being performed. Examples include 0x0E (Get_Attribute_Single), 0x10 (Set_Attribute_Single), and 0x4B (Forward_Open). Codes 0x00–0x31 are CIP Common Services defined by ODVA in Volume 1 Appendix A. Codes 0x32 and above are object class-specific.

What is the difference between Get_Attribute_Single and Get_Attributes_All?

Get_Attribute_Single (0x0E) reads one specific attribute identified by Class, Instance, and Attribute ID. Get_Attributes_All (0x01) reads every attribute of an instance in one transaction, returning them in the order defined by the object specification. Get_Attributes_All is more efficient for snapshot operations; Get_Attribute_Single is preferred when you only need one value.

What service code is Forward_Open?

Forward_Open is service code 0x4B. It is implemented by the Connection Manager Object (Class 0x06). The reply service code is 0xCB (0x4B with bit 7 set). Every CIP I/O connection begins with a Forward_Open request, making it one of the most important services in the protocol.

What does service code 0x4B mean?

Service code 0x4B is Forward_Open — the service used to establish a CIP connection. The request includes the connection parameters (RPI, transport class, electronic keying, connection size, application path). If accepted, the response carries the assigned Connection IDs for cyclic I/O exchange.

What is the difference between request and reply service codes?

The reply service code is the request service code with bit 7 (the most significant bit) set. So Get_Attribute_Single request 0x0E becomes reply 0x8E. Forward_Open request 0x4B becomes reply 0xCB. This convention lets receivers immediately distinguish requests from replies on a single wire.

What is Multiple_Service_Packet?

Multiple_Service_Packet is service code 0x0A, implemented by the Message Router Object (Class 0x02). It lets a client bundle multiple CIP service requests into a single transaction, dramatically reducing network round-trip overhead. Studio 5000 and RSLinx use it heavily to optimize configuration access.

What does service code 0x0E do?

Service code 0x0E is Get_Attribute_Single — it reads one attribute from a CIP object. The request specifies the Class ID, Instance ID, and Attribute ID. The response carries the attribute’s current value. This is the most common service in CIP traffic — almost every “read a value” operation uses it.

What service code is Set_Attribute_Single?

Set_Attribute_Single is service code 0x10. It writes a value to a single CIP attribute identified by Class, Instance, and Attribute ID. The reply service code is 0x90. Common errors include 0x0E (Attribute not settable) for read-only attributes and 0x09 (Invalid attribute value) for out-of-range values.

What is the difference between Forward_Open and Large_Forward_Open?

Forward_Open (0x4B) supports connections with data sizes up to 511 bytes. Large_Forward_Open (0x54) uses larger network connection parameter fields to support connections with much larger data sizes. Modern PLCs exchanging large structured data over single I/O connections typically use Large_Forward_Open. The engineering tool selects which one to use automatically based on the configured connection size.

Where can I find the official CIP service codes specification?

The CIP Common Services are defined in ODVA’s CIP Networks Library Volume 1: Common Industrial Protocol (CIP) Specification, Appendix A: Explicit Messaging Services. Object-specific services (codes 0x32 and above) are defined in Chapter 5 of the same volume under each object class definition. The current edition is 3.3 (2007). ODVA members can access the full specification at odva.org.

Are CIP service codes the same across EtherNet/IP, DeviceNet, and ControlNet?

Yes. CIP is media-independent, and service codes are part of the CIP common specification (Volume 1), not the network-specific adaptations (Volumes 2, 3, 4, 6). A Get_Attribute_Single request (0x0E) issued to a DeviceNet drop, a ControlNet device, or an EtherNet/IP I/O block all mean the same thing.

What does service code 0xCB mean in Wireshark?

0xCB is the reply to a Forward_Open request (0x4B with bit 7 set). When you see 0xCB in Wireshark, you’re looking at a Forward_Open reply. If the General Status field is 0x00, the connection opened successfully and the response carries the assigned Connection IDs. If General Status is non-zero (typically 0x01), the connection failed and Extended Status carries the reason.

Author: Zakaria El Intissar

I'm an automation and industrial computing engineer with 12 years of experience in power system automation, SCADA communication protocols, and electrical protection. I build tools and write guides for Modbus, DNP3, IEC 101/103/104, and IEC 61850 on ScadaProtocols.com to help engineers decode, analyze, and troubleshoot real industrial communication systems.