6.2 defines additional codes and rules that apply to the StatusCode when used for HistoricalDataNodes.
The general structure of the StatusCode is specified in OPC 10000-4. It includes a set of common operational result codes which also apply to historical data and/or Events.
In OPC UA Historical Access the StatusCode is used to indicate the conditions under which a Value or Event was stored, and thereby can be used as an indicator of its usability. Due to the nature of historical data and/or Events, additional information beyond the basic quality and call result code needs to be conveyed to the Client, for example, whether the value is actually stored in the data repository, whether the result was Interpolated, whether all data inputs to a calculation were of good quality, etc.
In the following, Table 25 contains codes with Bad severity indicating a failure; Table 26 contains Good (success) codes.
It is important to note that these are the codes that are specific for OPC UA Historical Access and supplement the codes that apply to all types of data and are therefore defined in OPC 10000-4, OPC 10000-8 and OPC 10000-13.
Table 25 – Bad operation level result codes
Symbolic Id |
Description |
Bad_NoData |
No data exists for the requested time range or Event filter. |
Bad_BoundNotFound |
No data found to provide upper or lower bound value. |
Bad_BoundNotSupported |
Bounding Values are not applicable or the Server has reached its search limit and will not return a bound. |
Bad_DataLost |
Data is missing due to collection started/stopped/lost. |
Bad_DataUnavailable |
Expected data is unavailable for the requested time range due to an un-mounted volume, an off-line historical collection, or similar reason for temporary unavailability. |
Bad_EntryExists |
The data or Event was not successfully inserted because a matching entry exists. |
Bad_NoEntryExists |
The data or Event was not successfully updated because no matching entry exists. |
Bad_TimestampNotSupported |
The Client requested history using a TimestampsToReturn the Server does not support. For example requested ServerTimestamp when Server only supports SourceTimestamp. |
Bad_InvalidArgument |
One or more arguments are invalid or missing. |
Bad_AggregateListMismatch |
The list of Aggregates does not have the same length as the list of operations. |
Bad_AggregateConfigurationRejected |
The Server does not support the specified AggregateConfiguration for the Node. |
Bad_AggregateNotSupported |
The specified Aggregate is not valid for the specified Node. |
Bad_ArgumentsMissing |
See OPC 10000-4 for the description of this result code. |
Bad_TypeDefinitionInvalid |
See OPC 10000-4 for the description of this result code. |
Bad_SourceNodeIdInvalid |
See OPC 10000-4 for the description of this result code. |
Bad_OutOfRange |
See OPC 10000-4 for the description of this result code. |
Bad_NotSupported |
See OPC 10000-4 for the description of this result code. |
Bad_IndexRangeInvalid |
See OPC 10000-4 for the description of this result code. |
Bad_NotWritable |
See OPC 10000-4 for the description of this result code. |
Table 26 – Good operation level result codes
Symbolic Id |
Description |
Good_NoData |
No data exists for the requested time range or Event filter. |
Good_EntryInserted |
The data or Event was successfully inserted into the historical database |
Good_EntryReplaced |
The data or Event field was successfully replaced in the historical database |
Good_DataIgnored |
The Event field was ignored and was not inserted into the historical database. |
It may be noted that there are both Good and Bad Status codes that deal with cases of no data or missing data. In general, Good_NoData is used for cases where no data was found when performing a simple ‘Read’ request. Bad_NoData is used in cases where some action is requested on an interval and no data could be found. The distinction exists if users are attempting an action on a given interval where they would expect data to exist, or would like to be notified that the requested action could not be performed.
Good_NoData is returned for cases such as:
- ReadEventDetails where startTime =endTime
- ReadEventDetails data is requested and does not exist
- ReadRawModifiedDetails where data is requested and does not exist
Bad_NoData is returned for cases such as:
- ReadEventDetails data is requested and underlying historian does not support the requested field
- ReadProcessed where data is requested and does not exist
- Any Delete requests where data does not exist
The above use cases are illustrative examples. Detailed explanations on when each status code is returned are found in 6.5 and 6.8.
The StatusCode in addition contains an informational bit called Semantics Changed (see OPC 10000-4).
UA Servers that implement OPC UA Historical Access should not set this bit; rather they should propagate the StatusCode which has been stored in the data repository. The Client should be aware that the returned data values may have this bit set.