# ArchestrA Attribute Categories

An attribute’s category determines which namespaces an attribute appears in, whether the attribute can be written to, and what type of client (users, scripts, etc.) can write to it.

You should only allow as much access to an attribute as necessary. For example:

- An attribute that is used only by config time logic to add or remove Virtual Primitives should be given a category that prevents it from becoming part of the run time namespace (for example, PackageOnly).
- An attribute that doesn’t make sense to configure in an editor should be given a category (for example, Calculated) that prevents it from becoming part of the config time namespace (and the custom object editor).
- An attribute that needs to be configured and deployed but is not allowed to be modified at runtime should be given a category that prevents users or other objects from writing to it (for example, Writeable_C_Lockable).

Some attribute categories allow an attribute to be *locked*. This means that IDE users can lock the attribute in a template to protect its configured value from being changed in derived instances or templates. The value of a locked attribute cannot be modified, not even internally by the object’s code.

In general, you should make attributes lockable whenever possible. Lockable attributes allow users to enforce standards and can simplify system maintenance. Locking data also helps minimize the size of a system’s configuration database, which improves the speed of configuration tasks.

> **Note** 
> An exception is raised if an object’s logic attempts to modify a locked attribute. Therefore, before modifying a lockable attribute in your code, check whether it is locked.

The following table describes each attribute category.

| Category Name | Description |
| --- | --- |
| PackageOnly | Only exists at config time. Not deployed. |
| PackageOnly_Lockable | Only exists at config time. Not deployed. Can be locked. |
| Calculated | Only exists at run time. Not externally writeable by users or other objects. Run time changes are not persisted to disk by the AppEngine. |
| Calculated_Retentive | Only exists at run time. Not externally writeable by users or other objects. Run time changes are persisted to disk by the AppEngine. |
| Constant | Defined by an object developer. Never changes. Exists at config time and run time. |
| Writeable_U | Exists at config time and run time, but only the Security Classification is configurable. Only externally writeable by users at run time. |
| Writeable_S | Only exists at run time. Only externally writeable by other objects at run time. |
| Writeable_US | Exists at config time and run time, but only Security Classification is configurable. Externally writeable by users or other objects at run time. |
| Writeable_UC | Exists at config time and run time. Only externally writeable by users at run time. |
| Writeable_UC_Lockable | Exists at config time and run time. Only externally writeable by users at run time. Can be locked. |
| Writeable_USC | Exists at config time and run time. Externally writeable by users or other objects at run time. |
| Writeable_USC_Lockable | Exists at config time and run time. Externally writeable by users or other objects. Can be locked. |
| Writeable_C_Lockable | Exists at config time and run time. Not writeable at run time, even by the object itself. Can be locked. |

An attribute’s category also determines whether the attribute supports various other options, such as a default value or historization. See the following table for details.

| Attribute Category | Can set security classification | Can have config time set handler | Can have run time set handler | Can be marked as “Frequently Accessed” | Supports “Calculated Quality and Time” | Default value can be set | Supports alarms and history1 | Supports “Advise Only Active” |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| PackageOnly | N | Y | N | N | N | Y | N | N |
| PackageOnly_Locakable | N | Y | N | N | N | Y | N | N |
| Constant | N | N | N | Y | N | Y | N | N |
| Writeable_C_Lockable | N | Y | N | Y | N | Y | N | N |
| Writeable_UC | Y | Y | Y | Y | Y | Y | Y | Y |
| Writeable_UC_Lockable | Y | Y | Y | Y | Y | Y | Y | Y |
| Writeable_USC | Y | Y | Y | Y | Y | Y | Y | Y |
| Writeable_USC_Lockable | Y | Y | Y | Y | Y | Y | Y | Y |
| Calculated | N | N | Y | Y | Y | N | Y | Y |
| Calculated_Retentive | N | N | Y | Y | Y | N | Y | Y |
| Writeable_S | N | N | Y | Y | Y | N | Y | Y |
| Writeable_U | Y | N | Y | Y | Y | N | Y | Y |
| Writeable_US | Y | N | Y | Y | Y | N | Y | Y |
| SystemInternal | N | N | Y | N | N | Y | N | N |
| SystemSetsOnly | N | N | Y | N | N | N | N | N |
| SystemWriteable | N | N | Y | N | Y | Y | Y | Y |

1 Only non-array Boolean attributes can be alarmed. Only non-array attributes of the following types can be historized: Double, Float, Integer, Boolean, String, Custom Enumeration, and ElapsedTime,
