This section focuses on the general comparison to ICONICS AlarmWorX64 Server and focuses on the differences in the client AP and how it maps to the Hyper Alarm Server.
AlarmWorX64 Server |
Hyper Alarm Server |
Configuration for multiple servers can be stored in a single database |
One configuration database per server |
Flat list of alarm sources |
Alarm sources initially organized in areas |
Alarm sources can be linked to multiple areas |
Currently not supported directly. If using AssetWorX integration, it is possible to use the AssetWorX links at the Equipment level to achieve similar functionality. |
Templates |
Alarm groups and alarm types – similar concept, but different from templates; AssetWorX Equipment Classes |
Only real-time data input |
Real time and historical data input (e.g. from HH) |
RoC not working as people need it to |
It is possible to use historical reads (e.g. from HH) to compute a RoC over a specific time period. |
Runtime can change configuration database |
Currently not supported. There are plans to support configured adjustable set points that behave similarly to cached Equipment Properties from AssetWorX. |
Only 20 related values |
Unlimited related values |
C++/ATL |
C# (portable to .NET Core, IoT, containers) |
OPC AE |
Fwx API (no OPC AE) |
Integrated with AssetWorX through the Bulk Asset Configurator |
Integrated with AssetWorX natively, Bulk Asset Configurator configures the Hyper Alarm Server through AssetWorX. |
Under each Area, the AlarmWorX64 exposes a fixed list of counters. Each of them comes in two variants: a recursive one, that includes alarms in the current and in any nested area, and a non-recursive variant. Hyper Alarm Server can define only recursive counters.
The following table lists the counters of AlarmWorX64 (only the non-recursive ones for brevity, although these can’t be implemented at all) together with the bits of BaseConditionType.NewState that the counter expression of Hyper Alarm Server needs to check in order to implement the same functionality.
The bit checks must not check for an exact match of the NewState field but must only check the bits specified. That means for example that to check for Active,Unacked the expression would look like this: x=({{BaseConditionType.NewState}} & 6) == 2.
Also, some of the counters are writable, and writing a zero to them has the effect of acknowledging all alarms under the area (recursively or on a single level) or to cause other state transitions to a set of alarms. This behavior is not supported by the Hyper Alarm Server at all currently.
Bits to Check |
True/False 1) |
Simple Count |
Maximum Severity |
Acked |
X |
Area_Acked 2) |
X |
Unacked |
Area_UnAcked |
Area_UnAcked_Count |
X |
Active |
Area_Active |
Area_Active_Count |
Area_MaxSeverity |
Clear |
X |
Area_Clear_Count 3) |
Area_MaxSeverity_Clear |
Disabled |
X |
Area_Disabled_Count 4) |
X |
LatchAck |
X |
Area_LatchAck_Count |
Area_MaxSeverity_LatchAck |
LatchUnack |
X |
Area_LatchUnack_Count |
Area_MaxSeverity_LatchUnack |
OutOfService |
X |
Area_OutOfService_Count |
Area_MaxSeverity_OutOfService |
Shelve |
X |
Area_Shelve_Count |
Area_MaxSeverity_Shelve |
Supress |
X |
Area_Supress_Count |
Area_MaxSeverity_Supress |
Active,Acked |
X |
X |
Area_MaxSeverity_Ack |
Active,Unacked |
X |
X |
Area_MaxSeverity_Alarm |
Inactive,Unacked |
X |
X |
Area_MaxSeverity_ |
1) Hyper Alarm Server only supports the Simple count and Maximum severity counters. Simple true/false counters that only tell whether there is any alarm that matches the definition are not supported.
2) Area_Acked, Recusive_Acked - Not possible to implement. These counters include alarms in the Inactive Acknowledged state, which aren't trackable by alarm counters.
3) Hyper Alarm Server does not support the Clear state and the associated functionality. The Clear state in AlarmWorX64 Server works similarly to the Latch state defined in ISA 18.2.
4) Area_Disabled_Count, Recursive_Area_Disabled_Count – these counters can’t be implemented, as the Hyper Alarm Server does not work with disabled alarms the same way as the AlarmWorX64 Server does.
5) The table is missing Area_TagInput_Quality, Recursive_Area_TagInput_Quality – these tags are no counters and thus can’t be implemented using the Hyper Alarm Server Counters.
Because each alarm source in AlarmWorX64 is a combination of individual conditions that can activate and clear individually, like the Alarm Limit, Digital, Alarm Deviation and the other, alarm sources expose counters, that tell how many of those conditions are active currently (Active_Count) or inform about the state of individual conditions (LIM_Active, DIG_Active, DEV_Active, …) and also exposes other tags that relate to just a specific condition (LIM_ActiveTime, …).
For brevity, this documentation will not list all the tag names, but replace the name of the condition with just condition and names of sub-conditions with subcondition_. That means that LIM_Active, DIG_Active, DEV_Active will collectively be referred to as condition_Active.
The Hyper Alarm Server does not combine individual conditions into the same Alarm source and for this reason does not need to and does not support counters on a single Alarm source. Here is an abbreviated list of such counters in AlarmWorX64 Server.
AlarmWorX64 Server |
Hyper Alarm Server Approximate Equivalent Example |
Active |
x=({{alms:/Area1.Source1@NewState}} & 1) == 1 |
Active_Count |
The same as Active |
Clear_Count |
The Clear functionality is not supported. Use Latch instead: x=({{alms:/Area1.Source1@NewState}} & 128) == 128 |
UnAcked_Count |
x=({{alms:/Area1.Source1@NewState}} & 5) == 1 |
condition_Active |
The same as Active |
condition_Clear |
The same as Clear_Count |
condition_LatchAck |
x=({{alms:/Area1.Source1@NewState}} & 132) == 132 |
condition_LatchUnack |
x=({{alms:/Area1.Source1@NewState}} & 132) == 128 |
condition_UnAcked |
The same as UnAcked_Count |
subcondition_Active |
Incorporate the evaluation of the @SubConditionName tag into the expression. |
The Hyper Alarm Server exposes all event fields as real-time points, whereas AlarmWorX64 server only exposes this limited subset:
Tag Name |
Notes |
condition_ActiveTime |
See next field. |
condition_ActiveTimeUTC |
Roughly corresponds to the BaseConditionType.ActiveTime (exposed as @ActiveTime) with some differences (the AlarmWorX64 DA tag resets (sets itself to year 1899) when the alarm is not active, while the event field keeps its value when the alarm is not active and not acknowledged.) |
condition_Alarm_State |
This is similar to the BaseConditionType.NewState, but the meaning of individual bits are different. |
condition_Time_In_Alarm |
Corresponds to the AlarmWorX64 specific TIME_IN_ALARM Field. It gets filled once the alarm changes to norm or to ack and shows how long it was active. Not supported by the Hyper Alarm Server, the client needs to compute this value as a difference between now and the @ActiveTime point. |
condition_Time_To_Respond |
Corresponds to the AlarmWorX64 specific TIME_TO_RESPOND Field. It gets filled once the alarm changes to active+ack and shows how long it was not acked. Not supported by the Hyper Alarm Server, but similar information could be extracted as a difference between now and the @AckTime point. |
These tags expose the configuration of an AlarmWorX64 alarm source. Some of the tags are writable, making it possible to configure AlarmWorX64 from within GraphWorX64 or other clients.
The Hyper Alarm Server does not support configuring through its real-time client interface and there are currently no plans. It is still planned to enhance the Hyper Alarm Server with user adjustable set points though, which would work similarly to AssetWorX cached Equipment Properties.
These are the configuration tags exposed by AlarmWorX64.
Tag name |
RO/RW |
Notes |
AutoAck |
RW |
Not configurable through Workbench, but seems to be writable through DA. |
BaseText |
RW |
|
Delay |
RW |
|
HelpText |
RO |
|
Input1 |
RO |
|
Name |
RO |
|
Off Delay |
RW |
|
ReAlarm |
RW |
|
ReAlarm Time |
RW |
|
Related Value XX |
RW |
|
Shelve Time |
RW |
|
condition_Deadband |
RW |
|
subcondition_Enabled |
RW |
0 writes an empty string into the limit field of the sub-condition, 1 writes the original value back |
subcondition_Limit |
RW |
|
subcondition_RequiresAck |
RW |
|
subcondition_MsgText |
RW |
|
subcondition_Severity |
RW |
|
These are tags that do not fall into any of the other categories.
Tag name |
RO/RW |
Notes |
ConfigurationLoaded |
RO |
No equivalent. |
Input_Tag_Quality |
RO |
No equivalent. |
Server Started |
RO |
No equivalent. |
condition_Acked |
RW |
For reading, this information can be inferred from the @NewState point.
|
condition_OutOfService |
RW |
|
condition_Shelve |
RW |
|
condition_Supress |
RW |
|
condition_Latch_Reset |
RW |
This section describes event fields exposed by the AlarmWorX64 Server Alarms & Events Subscriptions (these fields are called Event Attributes per OPC AE specification).
Field Name |
Alarm Types |
Data Type |
Notes |
ACK_COMMENT |
All |
String |
Comment from the regular “Acknowledge" operation. Gets reset only when alarm goes from normal to active. Implemented by AlmsBaseType.AckComment |
ALARM_COUNT |
All |
Single |
How many times the alarm went normal->active, this counter gets reset by acknowledging. Not implemented by the Hyper Alarm Server |
ALARM_STATE |
All |
Int32 |
This is similar to the BaseConditionType.NewState, but the meaning of individual bits is different. |
AREA |
All |
String array |
Array of areas. Not implemented by the Hyper Alarm Server this way. The BaseEventType.Soruce name identifies the primary location of the alarm, e.g. "/Area1.Source1" |
CALCULATED_CURRENT_VALUE |
Deviation |
Double |
Specific to the Deviation alarm, computed as (Data Source) - (Data Source2), updates when the alarm sub-condition changes. 1) |
CFS_ASSIGNEDUSER |
All |
String |
|
CFS_COMMENT |
All |
String |
|
CFS_LATCHSTATE |
All |
Int32 |
|
CFS_LATCHSTATECOMMENT |
All |
String |
|
CFS_LATCHSTATEUSER |
All |
String |
|
CFS_STATE |
All |
Int32 |
|
CLEARED |
All |
Boolean |
(not implemented) |
CV |
All |
Double |
Current Value (OPC Input 1 or 2). 1) |
DEADBAND |
All |
Double |
Alarm detection Deadband. 1) |
DEFAULT_DISPLAY |
All |
String |
1) |
DIGITAL_LIMIT_VALUE_EXCEEDED |
Digital |
Double |
Specific to the Digital alarm, contains the threshold value that was exceeded and caused the alarm. This value is kept even when the alarm returns to the normal state and is reset only when the alarm enters the Inactive Acknowledged state. 1) |
HELP_TEXT |
All |
String |
1) |
LIMIT_VALUE_EXCEEDED |
LIM, DEV, ROC, TLA |
Double |
Contains the threshold value that was exceeded and caused the alarm. This value is kept even when the alarm returns to the normal state and is reset only when the alarm enters the Inactive Acknowledged state. 1) |
LOOP_DESC |
All |
String |
Contains the text of the Base Text field. 1) |
NEXT_LIM |
LIM, DEV, RLM |
Double |
Contains the HiHi limit, when the alarm is in the Hi sub-condition, and LoLo if in Lo. Keeps its value when transitioning to normal. 1) |
NORMAL_STATE |
Digital |
Boolean |
Specific to the Digital alarm, contains the value of the normal state (just true or false). 1) |
PREV_LIM |
LIM, DEV, RLM |
Double |
Contains the Hi limit, when the alarm is in the HiHi sub-condition, and Lo if in LoLo. Keeps its value when transitioning to normal. 1) |
PREVIOUS_VALUE |
TLA |
Double |
Specific to the Trigger alarm, contains the previous value of the Data Source, updates every time the Data Source changes. This behavior can't be implemented by the Hyper Alarm Server Custom Fields. |
PROGRESS |
All |
String |
Comment from the "Report progress" acknowledge type. Not implemented by the Hyper Alarm Server. |
RELATED_VALUE_01-20 |
All |
Object |
1) |
REQUIRES_CLEAR |
All |
Boolean |
1) |
RLIM_LIMIT_VALUE_EXCEEDED |
RLM |
Double |
Similar to LIMIT_VALUE_EXCEEDED, but specific to the Rate Limit alarms. 1) |
SP |
Deviation |
Double |
Specific to the Deviation alarm, contains the value of Data Source 2, updates when the alarm sub-condition changes. 1) |
TIME_IN_ALARM |
All |
Double |
Gets filled once the alarm changes to norm or to ack and shows how long it was active. Not supported by the Hyper Alarm Server, the client needs to compute this value as a difference between now and the BaseConditionType.ActiveTime field. |
TIME_TO_RESPOND |
All |
Double |
Gets filled once the alarm changes to active+ack and shows how long it was not acked. Not supported by the Hyper Alarm Server, but similar information could be extracted as a difference between now and the AlmsBaseType.AckTime field. |
1) These fields can be fully or at least sufficiently replaced by Custom Fields in the Hyper Alarm Server.
See Also: