Baseline: docker stack, provisioning tools, test-data, gateway-as-files (pre-PrimeBAT build)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
69
test-data/README.md
Normal file
69
test-data/README.md
Normal file
@@ -0,0 +1,69 @@
|
||||
# Test Data — Simulated Alarm Activity
|
||||
|
||||
Generates realistic alarm journal data for building/testing the alarm analysis dashboard.
|
||||
Everything here uses native Ignition features only (memory tags + tag alarms + Jython).
|
||||
|
||||
## Files
|
||||
|
||||
- `simulation_tags.json` — Ignition 8.3 tag export: a `BuildathonSim` folder with 49
|
||||
Boolean memory tags across 5 plant areas (`Intake`, `BoilerHouse`, `Packaging`,
|
||||
`Utilities`, `TankFarm`). Every tag has one Equality alarm (active when the tag is
|
||||
`true`) with priorities spread across Low / High / Critical.
|
||||
- `alarm_simulator.py` — Jython script that drives those tags. Full usage instructions
|
||||
are in the header comment.
|
||||
|
||||
## Setup (after the gateway + journal are configured per the main README)
|
||||
|
||||
### 1. Import the tags
|
||||
|
||||
Already done if you ran `python3 tools/provision.py provision` (it imports this file
|
||||
through the REST API; re-run `python3 tools/provision.py import-tags` after editing it).
|
||||
Manual alternative: Designer → Tag Browser → select the `default` tag provider root →
|
||||
right-click → **Import Tags** → choose `simulation_tags.json`. Either way you should see
|
||||
`BuildathonSim/<Area>/<Tag>` folders appear.
|
||||
|
||||
### 2. Install the simulator (gateway timer script — recommended)
|
||||
|
||||
1. Designer → **Project Library** → new script named `alarmsim` → paste the contents of
|
||||
`alarm_simulator.py`.
|
||||
2. **Project → Gateway Events → Timer** → add a script:
|
||||
- Delay: `5000` ms, Fixed Delay, Dedicated thread
|
||||
- Body: `alarmsim.tick()`
|
||||
3. Save the project. Alarm events start flowing into the journal immediately and keep
|
||||
running as long as the gateway is up (no Designer needed).
|
||||
|
||||
Alternative: paste the whole file into the Designer **Script Console** and call
|
||||
`run_console(minutes=30)` — simpler, but it blocks the console and stops when you close it.
|
||||
|
||||
### 3. Let it run
|
||||
|
||||
Give it 30-60 minutes for meaningful analytics. Roughly every 30-60 minutes one area gets
|
||||
a flood burst; to force one for a demo, call `alarmsim.force_flood()` (e.g. temporarily
|
||||
from the timer script, or from the console if using console mode). `alarmsim.reset()`
|
||||
clears all sim tags and state.
|
||||
|
||||
## Patterns generated (what your analytics should detect)
|
||||
|
||||
| Pattern | Tags | Behavior |
|
||||
| ---------- | ------------------- | ----------------------------------------------------------- |
|
||||
| Baseline | 40 tags, all areas | Random activations, active 30 s–5 min, ~3-4/min plant-wide |
|
||||
| Chattering | `*_Chatter` (3) | Re-trigger every 30–60 s, active 5–15 s each cycle |
|
||||
| Standing | `*_Standing` (2) | Active from first tick, never clear |
|
||||
| Fleeting | `*_Fleeting` (4) | Active < 10 s (2–8 s), ~1/min |
|
||||
| Flood | one random area | 15+ activations within 10 min in a single area |
|
||||
|
||||
## Querying the journal
|
||||
|
||||
Events land in MariaDB tables `PrimeControls_alarm_events` / `PrimeControls_alarm_event_data`
|
||||
(created automatically on first event). The **plant area is the folder in the alarm's
|
||||
source path** — e.g. `prov:default:/tag:BuildathonSim/TankFarm/T101_LevelHigh:/alm:...` —
|
||||
so area analytics can group on the path segment after `BuildathonSim/`. Priority is stored
|
||||
on the event; `eventtype` 0/1/2 = active/clear/ack.
|
||||
|
||||
Quick sanity check from your SQL client (localhost:3306, user `ignition`/`ignition`):
|
||||
|
||||
```sql
|
||||
SELECT source, displaypath, priority, eventtype, eventtime
|
||||
FROM PrimeControls_alarm_events
|
||||
ORDER BY eventtime DESC LIMIT 20;
|
||||
```
|
||||
179
test-data/alarm_simulator.py
Normal file
179
test-data/alarm_simulator.py
Normal file
@@ -0,0 +1,179 @@
|
||||
# alarm_simulator.py — Build-a-Thon alarm activity generator (Jython, Ignition 8.3)
|
||||
#
|
||||
# Drives the Boolean memory tags in [default]BuildathonSim/ (import
|
||||
# simulation_tags.json first). Designed to be called every 5 seconds:
|
||||
#
|
||||
# RECOMMENDED — Gateway timer script (survives Designer close):
|
||||
# 1. Designer > Project Library: create a script named "alarmsim", paste this file.
|
||||
# 2. Project > Gateway Events > Timer: new script, Delay 5000 ms,
|
||||
# Fixed Delay, Dedicated thread. Body: alarmsim.tick()
|
||||
# 3. Save the project. Alarm activity starts immediately and runs forever.
|
||||
#
|
||||
# ALTERNATIVE — Designer Script Console (blocks the console while running):
|
||||
# Paste this whole file, then add at the bottom:
|
||||
# run_console(minutes=30)
|
||||
#
|
||||
# Patterns produced (all timestamps land in the alarm journal):
|
||||
# - Baseline: random alarms across 5 areas / 3 priorities, active 30 s - 5 min,
|
||||
# averaging a few activations per minute
|
||||
# - Chattering: *_Chatter tags re-trigger every 30-60 s (short 5-15 s actives)
|
||||
# - Standing: *_Standing tags go active on the first tick and never clear
|
||||
# - Fleeting: *_Fleeting tags are active < 10 s
|
||||
# - Flood: roughly every 30-60 min (or on demand via force_flood()), one area
|
||||
# bursts 20-40 activations over 10 minutes
|
||||
#
|
||||
# Manual helpers (Script Console, gateway scope via system.util.sendRequest not
|
||||
# needed — just call from a console if running console mode, or temporarily from
|
||||
# the timer script):
|
||||
# alarmsim.force_flood() -> start a flood burst now
|
||||
# alarmsim.reset() -> clear all sim tags and internal state
|
||||
|
||||
import random
|
||||
import time
|
||||
|
||||
BASE = "[default]BuildathonSim"
|
||||
|
||||
BASELINE = {
|
||||
"Intake": ["Pump1_Fault", "Pump2_Fault", "ScreenDiffPressHigh", "InletFlowLow",
|
||||
"ValveV101_FailToOpen", "WetWellLevelHigh", "SampleTempHigh", "PowerMonitorAlarm"],
|
||||
"BoilerHouse": ["FeedPumpA_Fault", "FeedPumpB_Fault", "SteamPressHigh", "DrumLevelLow",
|
||||
"StackTempHigh", "FuelGasPressLow", "EconomizerDPHigh", "BlowdownConductivityHigh"],
|
||||
"Packaging": ["LabelerFault", "CapperTorqueLow", "FillerLevelDeviation", "ConveyorOverload",
|
||||
"CaseSealerJam", "PrinterInkLow", "RejectRateHigh", "GuardDoorOpen"],
|
||||
"Utilities": ["AirCompA_Fault", "AirHeaderPressLow", "ChillerTripped", "CoolingTowerVibration",
|
||||
"GlycolTempHigh", "N2PressLow", "UPSOnBattery", "WaterSoftenerFault"],
|
||||
"TankFarm": ["T101_LevelHigh", "T102_LevelHigh", "T103_TempHigh", "TransferPumpFault",
|
||||
"ContainmentSumpHigh", "VaporRecoveryFault", "T104_PressHigh", "ManifoldLeakDetect"],
|
||||
}
|
||||
|
||||
CHATTER = [
|
||||
"Intake/ConveyorJam_Chatter",
|
||||
"Packaging/ShrinkTunnelTemp_Chatter",
|
||||
"Utilities/AirDryerDewpoint_Chatter",
|
||||
]
|
||||
STANDING = [
|
||||
"BoilerHouse/DrumLevelXmtrFail_Standing",
|
||||
"TankFarm/T105_LevelXmtrFail_Standing",
|
||||
]
|
||||
FLEETING = [
|
||||
"Intake/CommsGlitch_Fleeting",
|
||||
"BoilerHouse/FlameScannerFlicker_Fleeting",
|
||||
"Packaging/EStopPulse_Fleeting",
|
||||
"TankFarm/PumpSealFlushLow_Fleeting",
|
||||
]
|
||||
|
||||
# Tuning (per 5 s tick)
|
||||
BASELINE_PROB = 0.30 # ~3-4 baseline activations/min across the plant
|
||||
FLEETING_PROB = 0.08 # ~1 fleeting alarm/min
|
||||
FLOOD_START_PROB = 0.0025 # expected flood every ~30-60 min
|
||||
FLOOD_DURATION = 600 # 10 minutes
|
||||
FLOOD_EVENT_PROB = 0.35 # per tick during flood -> ~25 activations / 10 min
|
||||
|
||||
|
||||
def _path(rel):
|
||||
return "%s/%s" % (BASE, rel)
|
||||
|
||||
|
||||
def _state():
|
||||
g = system.util.getGlobals()
|
||||
if "buildathon_alarmsim" not in g:
|
||||
g["buildathon_alarmsim"] = {
|
||||
"clears": {}, # tag path -> epoch seconds to write False
|
||||
"chatter_next": {}, # chatter path -> epoch seconds of next re-trigger
|
||||
"flood": None, # {"area": name, "until": epoch} while flooding
|
||||
"standing_set": False,
|
||||
}
|
||||
return g["buildathon_alarmsim"]
|
||||
|
||||
|
||||
def _write(pairs):
|
||||
if pairs:
|
||||
system.tag.writeBlocking([p for p, v in pairs], [v for p, v in pairs])
|
||||
|
||||
|
||||
def tick():
|
||||
st = _state()
|
||||
now = time.time()
|
||||
writes = []
|
||||
|
||||
# 1. Standing alarms: activate once, never clear
|
||||
if not st["standing_set"]:
|
||||
writes += [(_path(p), True) for p in STANDING]
|
||||
st["standing_set"] = True
|
||||
|
||||
# 2. Process scheduled clears
|
||||
for path in list(st["clears"].keys()):
|
||||
if now >= st["clears"][path]:
|
||||
writes.append((path, False))
|
||||
del st["clears"][path]
|
||||
|
||||
# 3. Baseline activity: random tag, active 30 s - 5 min
|
||||
if random.random() < BASELINE_PROB:
|
||||
area = random.choice(list(BASELINE.keys()))
|
||||
path = _path("%s/%s" % (area, random.choice(BASELINE[area])))
|
||||
if path not in st["clears"]:
|
||||
writes.append((path, True))
|
||||
st["clears"][path] = now + random.uniform(30, 300)
|
||||
|
||||
# 4. Chattering: re-trigger every 30-60 s, active 5-15 s each time
|
||||
for rel in CHATTER:
|
||||
path = _path(rel)
|
||||
nxt = st["chatter_next"].get(path, 0)
|
||||
if now >= nxt and path not in st["clears"]:
|
||||
writes.append((path, True))
|
||||
st["clears"][path] = now + random.uniform(5, 15)
|
||||
st["chatter_next"][path] = now + random.uniform(30, 60)
|
||||
|
||||
# 5. Fleeting: active 2-8 s
|
||||
if random.random() < FLEETING_PROB:
|
||||
path = _path(random.choice(FLEETING))
|
||||
if path not in st["clears"]:
|
||||
writes.append((path, True))
|
||||
st["clears"][path] = now + random.uniform(2, 8)
|
||||
|
||||
# 6. Flood burst: one area, 15+ activations inside 10 minutes
|
||||
if st["flood"] is None:
|
||||
if random.random() < FLOOD_START_PROB:
|
||||
_start_flood(st, now)
|
||||
elif now >= st["flood"]["until"]:
|
||||
st["flood"] = None
|
||||
else:
|
||||
if random.random() < FLOOD_EVENT_PROB:
|
||||
area = st["flood"]["area"]
|
||||
path = _path("%s/%s" % (area, random.choice(BASELINE[area])))
|
||||
# During a flood, alarms clear fast and may re-trigger, inflating the
|
||||
# event rate the way a real upset does. Overwrite any pending clear.
|
||||
writes.append((path, True))
|
||||
st["clears"][path] = now + random.uniform(10, 45)
|
||||
|
||||
_write(writes)
|
||||
|
||||
|
||||
def _start_flood(st, now):
|
||||
area = random.choice(list(BASELINE.keys()))
|
||||
st["flood"] = {"area": area, "until": now + FLOOD_DURATION}
|
||||
system.util.getLogger("alarmsim").info("Flood burst started in area: %s" % area)
|
||||
|
||||
|
||||
def force_flood():
|
||||
"""Start a flood burst immediately (handy for demo/testing)."""
|
||||
_start_flood(_state(), time.time())
|
||||
|
||||
|
||||
def reset():
|
||||
"""Clear all simulation tags and internal state."""
|
||||
g = system.util.getGlobals()
|
||||
g.pop("buildathon_alarmsim", None)
|
||||
paths = []
|
||||
for area, names in BASELINE.items():
|
||||
paths += [_path("%s/%s" % (area, n)) for n in names]
|
||||
paths += [_path(p) for p in CHATTER + STANDING + FLEETING]
|
||||
system.tag.writeBlocking(paths, [False] * len(paths))
|
||||
|
||||
|
||||
def run_console(minutes=30):
|
||||
"""Script Console runner: calls tick() every 5 s for `minutes`. Blocks the console."""
|
||||
end = time.time() + minutes * 60
|
||||
while time.time() < end:
|
||||
tick()
|
||||
time.sleep(5)
|
||||
820
test-data/simulation_tags.json
Normal file
820
test-data/simulation_tags.json
Normal file
@@ -0,0 +1,820 @@
|
||||
{
|
||||
"name": "BuildathonSim",
|
||||
"tagType": "Folder",
|
||||
"tags": [
|
||||
{
|
||||
"name": "Intake",
|
||||
"tagType": "Folder",
|
||||
"tags": [
|
||||
{
|
||||
"name": "Pump1_Fault",
|
||||
"tagType": "AtomicTag",
|
||||
"valueSource": "memory",
|
||||
"dataType": "Boolean",
|
||||
"value": false,
|
||||
"alarms": [
|
||||
{
|
||||
"name": "Pump1_Fault",
|
||||
"label": "Intake Pump 1 Fault",
|
||||
"mode": "Equality",
|
||||
"setpointA": 1.0,
|
||||
"priority": "High"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Pump2_Fault",
|
||||
"tagType": "AtomicTag",
|
||||
"valueSource": "memory",
|
||||
"dataType": "Boolean",
|
||||
"value": false,
|
||||
"alarms": [
|
||||
{
|
||||
"name": "Pump2_Fault",
|
||||
"label": "Intake Pump 2 Fault",
|
||||
"mode": "Equality",
|
||||
"setpointA": 1.0,
|
||||
"priority": "High"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "ScreenDiffPressHigh",
|
||||
"tagType": "AtomicTag",
|
||||
"valueSource": "memory",
|
||||
"dataType": "Boolean",
|
||||
"value": false,
|
||||
"alarms": [
|
||||
{
|
||||
"name": "ScreenDiffPressHigh",
|
||||
"label": "Intake Screen Diff Press High",
|
||||
"mode": "Equality",
|
||||
"setpointA": 1.0,
|
||||
"priority": "Low"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "InletFlowLow",
|
||||
"tagType": "AtomicTag",
|
||||
"valueSource": "memory",
|
||||
"dataType": "Boolean",
|
||||
"value": false,
|
||||
"alarms": [
|
||||
{
|
||||
"name": "InletFlowLow",
|
||||
"label": "Intake Inlet Flow Low",
|
||||
"mode": "Equality",
|
||||
"setpointA": 1.0,
|
||||
"priority": "Low"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "ValveV101_FailToOpen",
|
||||
"tagType": "AtomicTag",
|
||||
"valueSource": "memory",
|
||||
"dataType": "Boolean",
|
||||
"value": false,
|
||||
"alarms": [
|
||||
{
|
||||
"name": "ValveV101_FailToOpen",
|
||||
"label": "Valve V-101 Fail To Open",
|
||||
"mode": "Equality",
|
||||
"setpointA": 1.0,
|
||||
"priority": "High"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "WetWellLevelHigh",
|
||||
"tagType": "AtomicTag",
|
||||
"valueSource": "memory",
|
||||
"dataType": "Boolean",
|
||||
"value": false,
|
||||
"alarms": [
|
||||
{
|
||||
"name": "WetWellLevelHigh",
|
||||
"label": "Wet Well Level High-High",
|
||||
"mode": "Equality",
|
||||
"setpointA": 1.0,
|
||||
"priority": "Critical"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "SampleTempHigh",
|
||||
"tagType": "AtomicTag",
|
||||
"valueSource": "memory",
|
||||
"dataType": "Boolean",
|
||||
"value": false,
|
||||
"alarms": [
|
||||
{
|
||||
"name": "SampleTempHigh",
|
||||
"label": "Sample Temp High",
|
||||
"mode": "Equality",
|
||||
"setpointA": 1.0,
|
||||
"priority": "Low"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "PowerMonitorAlarm",
|
||||
"tagType": "AtomicTag",
|
||||
"valueSource": "memory",
|
||||
"dataType": "Boolean",
|
||||
"value": false,
|
||||
"alarms": [
|
||||
{
|
||||
"name": "PowerMonitorAlarm",
|
||||
"label": "Intake Power Monitor Alarm",
|
||||
"mode": "Equality",
|
||||
"setpointA": 1.0,
|
||||
"priority": "Low"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "ConveyorJam_Chatter",
|
||||
"tagType": "AtomicTag",
|
||||
"valueSource": "memory",
|
||||
"dataType": "Boolean",
|
||||
"value": false,
|
||||
"alarms": [
|
||||
{
|
||||
"name": "ConveyorJam_Chatter",
|
||||
"label": "Intake Conveyor Jam",
|
||||
"mode": "Equality",
|
||||
"setpointA": 1.0,
|
||||
"priority": "High"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "CommsGlitch_Fleeting",
|
||||
"tagType": "AtomicTag",
|
||||
"valueSource": "memory",
|
||||
"dataType": "Boolean",
|
||||
"value": false,
|
||||
"alarms": [
|
||||
{
|
||||
"name": "CommsGlitch_Fleeting",
|
||||
"label": "Intake RIO Comms Glitch",
|
||||
"mode": "Equality",
|
||||
"setpointA": 1.0,
|
||||
"priority": "Low"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "BoilerHouse",
|
||||
"tagType": "Folder",
|
||||
"tags": [
|
||||
{
|
||||
"name": "FeedPumpA_Fault",
|
||||
"tagType": "AtomicTag",
|
||||
"valueSource": "memory",
|
||||
"dataType": "Boolean",
|
||||
"value": false,
|
||||
"alarms": [
|
||||
{
|
||||
"name": "FeedPumpA_Fault",
|
||||
"label": "Boiler Feed Pump A Fault",
|
||||
"mode": "Equality",
|
||||
"setpointA": 1.0,
|
||||
"priority": "High"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "FeedPumpB_Fault",
|
||||
"tagType": "AtomicTag",
|
||||
"valueSource": "memory",
|
||||
"dataType": "Boolean",
|
||||
"value": false,
|
||||
"alarms": [
|
||||
{
|
||||
"name": "FeedPumpB_Fault",
|
||||
"label": "Boiler Feed Pump B Fault",
|
||||
"mode": "Equality",
|
||||
"setpointA": 1.0,
|
||||
"priority": "High"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "SteamPressHigh",
|
||||
"tagType": "AtomicTag",
|
||||
"valueSource": "memory",
|
||||
"dataType": "Boolean",
|
||||
"value": false,
|
||||
"alarms": [
|
||||
{
|
||||
"name": "SteamPressHigh",
|
||||
"label": "Steam Header Pressure High",
|
||||
"mode": "Equality",
|
||||
"setpointA": 1.0,
|
||||
"priority": "Critical"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "DrumLevelLow",
|
||||
"tagType": "AtomicTag",
|
||||
"valueSource": "memory",
|
||||
"dataType": "Boolean",
|
||||
"value": false,
|
||||
"alarms": [
|
||||
{
|
||||
"name": "DrumLevelLow",
|
||||
"label": "Drum Level Low",
|
||||
"mode": "Equality",
|
||||
"setpointA": 1.0,
|
||||
"priority": "High"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "StackTempHigh",
|
||||
"tagType": "AtomicTag",
|
||||
"valueSource": "memory",
|
||||
"dataType": "Boolean",
|
||||
"value": false,
|
||||
"alarms": [
|
||||
{
|
||||
"name": "StackTempHigh",
|
||||
"label": "Stack Temp High",
|
||||
"mode": "Equality",
|
||||
"setpointA": 1.0,
|
||||
"priority": "Low"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "FuelGasPressLow",
|
||||
"tagType": "AtomicTag",
|
||||
"valueSource": "memory",
|
||||
"dataType": "Boolean",
|
||||
"value": false,
|
||||
"alarms": [
|
||||
{
|
||||
"name": "FuelGasPressLow",
|
||||
"label": "Fuel Gas Pressure Low",
|
||||
"mode": "Equality",
|
||||
"setpointA": 1.0,
|
||||
"priority": "Low"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "EconomizerDPHigh",
|
||||
"tagType": "AtomicTag",
|
||||
"valueSource": "memory",
|
||||
"dataType": "Boolean",
|
||||
"value": false,
|
||||
"alarms": [
|
||||
{
|
||||
"name": "EconomizerDPHigh",
|
||||
"label": "Economizer Diff Press High",
|
||||
"mode": "Equality",
|
||||
"setpointA": 1.0,
|
||||
"priority": "Low"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "BlowdownConductivityHigh",
|
||||
"tagType": "AtomicTag",
|
||||
"valueSource": "memory",
|
||||
"dataType": "Boolean",
|
||||
"value": false,
|
||||
"alarms": [
|
||||
{
|
||||
"name": "BlowdownConductivityHigh",
|
||||
"label": "Blowdown Conductivity High",
|
||||
"mode": "Equality",
|
||||
"setpointA": 1.0,
|
||||
"priority": "Low"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "DrumLevelXmtrFail_Standing",
|
||||
"tagType": "AtomicTag",
|
||||
"valueSource": "memory",
|
||||
"dataType": "Boolean",
|
||||
"value": false,
|
||||
"alarms": [
|
||||
{
|
||||
"name": "DrumLevelXmtrFail_Standing",
|
||||
"label": "Drum Level Transmitter Failed",
|
||||
"mode": "Equality",
|
||||
"setpointA": 1.0,
|
||||
"priority": "High"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "FlameScannerFlicker_Fleeting",
|
||||
"tagType": "AtomicTag",
|
||||
"valueSource": "memory",
|
||||
"dataType": "Boolean",
|
||||
"value": false,
|
||||
"alarms": [
|
||||
{
|
||||
"name": "FlameScannerFlicker_Fleeting",
|
||||
"label": "Flame Scanner Flicker",
|
||||
"mode": "Equality",
|
||||
"setpointA": 1.0,
|
||||
"priority": "High"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Packaging",
|
||||
"tagType": "Folder",
|
||||
"tags": [
|
||||
{
|
||||
"name": "LabelerFault",
|
||||
"tagType": "AtomicTag",
|
||||
"valueSource": "memory",
|
||||
"dataType": "Boolean",
|
||||
"value": false,
|
||||
"alarms": [
|
||||
{
|
||||
"name": "LabelerFault",
|
||||
"label": "Labeler Fault",
|
||||
"mode": "Equality",
|
||||
"setpointA": 1.0,
|
||||
"priority": "High"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "CapperTorqueLow",
|
||||
"tagType": "AtomicTag",
|
||||
"valueSource": "memory",
|
||||
"dataType": "Boolean",
|
||||
"value": false,
|
||||
"alarms": [
|
||||
{
|
||||
"name": "CapperTorqueLow",
|
||||
"label": "Capper Torque Low",
|
||||
"mode": "Equality",
|
||||
"setpointA": 1.0,
|
||||
"priority": "Low"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "FillerLevelDeviation",
|
||||
"tagType": "AtomicTag",
|
||||
"valueSource": "memory",
|
||||
"dataType": "Boolean",
|
||||
"value": false,
|
||||
"alarms": [
|
||||
{
|
||||
"name": "FillerLevelDeviation",
|
||||
"label": "Filler Level Deviation",
|
||||
"mode": "Equality",
|
||||
"setpointA": 1.0,
|
||||
"priority": "Low"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "ConveyorOverload",
|
||||
"tagType": "AtomicTag",
|
||||
"valueSource": "memory",
|
||||
"dataType": "Boolean",
|
||||
"value": false,
|
||||
"alarms": [
|
||||
{
|
||||
"name": "ConveyorOverload",
|
||||
"label": "Conveyor Motor Overload",
|
||||
"mode": "Equality",
|
||||
"setpointA": 1.0,
|
||||
"priority": "High"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "CaseSealerJam",
|
||||
"tagType": "AtomicTag",
|
||||
"valueSource": "memory",
|
||||
"dataType": "Boolean",
|
||||
"value": false,
|
||||
"alarms": [
|
||||
{
|
||||
"name": "CaseSealerJam",
|
||||
"label": "Case Sealer Jam",
|
||||
"mode": "Equality",
|
||||
"setpointA": 1.0,
|
||||
"priority": "High"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "PrinterInkLow",
|
||||
"tagType": "AtomicTag",
|
||||
"valueSource": "memory",
|
||||
"dataType": "Boolean",
|
||||
"value": false,
|
||||
"alarms": [
|
||||
{
|
||||
"name": "PrinterInkLow",
|
||||
"label": "Date Coder Ink Low",
|
||||
"mode": "Equality",
|
||||
"setpointA": 1.0,
|
||||
"priority": "Low"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "RejectRateHigh",
|
||||
"tagType": "AtomicTag",
|
||||
"valueSource": "memory",
|
||||
"dataType": "Boolean",
|
||||
"value": false,
|
||||
"alarms": [
|
||||
{
|
||||
"name": "RejectRateHigh",
|
||||
"label": "Reject Rate High",
|
||||
"mode": "Equality",
|
||||
"setpointA": 1.0,
|
||||
"priority": "Critical"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "GuardDoorOpen",
|
||||
"tagType": "AtomicTag",
|
||||
"valueSource": "memory",
|
||||
"dataType": "Boolean",
|
||||
"value": false,
|
||||
"alarms": [
|
||||
{
|
||||
"name": "GuardDoorOpen",
|
||||
"label": "Guard Door Open",
|
||||
"mode": "Equality",
|
||||
"setpointA": 1.0,
|
||||
"priority": "Low"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "ShrinkTunnelTemp_Chatter",
|
||||
"tagType": "AtomicTag",
|
||||
"valueSource": "memory",
|
||||
"dataType": "Boolean",
|
||||
"value": false,
|
||||
"alarms": [
|
||||
{
|
||||
"name": "ShrinkTunnelTemp_Chatter",
|
||||
"label": "Shrink Tunnel Temp Deviation",
|
||||
"mode": "Equality",
|
||||
"setpointA": 1.0,
|
||||
"priority": "Low"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "EStopPulse_Fleeting",
|
||||
"tagType": "AtomicTag",
|
||||
"valueSource": "memory",
|
||||
"dataType": "Boolean",
|
||||
"value": false,
|
||||
"alarms": [
|
||||
{
|
||||
"name": "EStopPulse_Fleeting",
|
||||
"label": "E-Stop Circuit Pulse",
|
||||
"mode": "Equality",
|
||||
"setpointA": 1.0,
|
||||
"priority": "Critical"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Utilities",
|
||||
"tagType": "Folder",
|
||||
"tags": [
|
||||
{
|
||||
"name": "AirCompA_Fault",
|
||||
"tagType": "AtomicTag",
|
||||
"valueSource": "memory",
|
||||
"dataType": "Boolean",
|
||||
"value": false,
|
||||
"alarms": [
|
||||
{
|
||||
"name": "AirCompA_Fault",
|
||||
"label": "Air Compressor A Fault",
|
||||
"mode": "Equality",
|
||||
"setpointA": 1.0,
|
||||
"priority": "High"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "AirHeaderPressLow",
|
||||
"tagType": "AtomicTag",
|
||||
"valueSource": "memory",
|
||||
"dataType": "Boolean",
|
||||
"value": false,
|
||||
"alarms": [
|
||||
{
|
||||
"name": "AirHeaderPressLow",
|
||||
"label": "Instrument Air Pressure Low",
|
||||
"mode": "Equality",
|
||||
"setpointA": 1.0,
|
||||
"priority": "Critical"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "ChillerTripped",
|
||||
"tagType": "AtomicTag",
|
||||
"valueSource": "memory",
|
||||
"dataType": "Boolean",
|
||||
"value": false,
|
||||
"alarms": [
|
||||
{
|
||||
"name": "ChillerTripped",
|
||||
"label": "Chiller Tripped",
|
||||
"mode": "Equality",
|
||||
"setpointA": 1.0,
|
||||
"priority": "High"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "CoolingTowerVibration",
|
||||
"tagType": "AtomicTag",
|
||||
"valueSource": "memory",
|
||||
"dataType": "Boolean",
|
||||
"value": false,
|
||||
"alarms": [
|
||||
{
|
||||
"name": "CoolingTowerVibration",
|
||||
"label": "Cooling Tower Fan Vibration",
|
||||
"mode": "Equality",
|
||||
"setpointA": 1.0,
|
||||
"priority": "Low"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "GlycolTempHigh",
|
||||
"tagType": "AtomicTag",
|
||||
"valueSource": "memory",
|
||||
"dataType": "Boolean",
|
||||
"value": false,
|
||||
"alarms": [
|
||||
{
|
||||
"name": "GlycolTempHigh",
|
||||
"label": "Glycol Supply Temp High",
|
||||
"mode": "Equality",
|
||||
"setpointA": 1.0,
|
||||
"priority": "Low"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "N2PressLow",
|
||||
"tagType": "AtomicTag",
|
||||
"valueSource": "memory",
|
||||
"dataType": "Boolean",
|
||||
"value": false,
|
||||
"alarms": [
|
||||
{
|
||||
"name": "N2PressLow",
|
||||
"label": "Nitrogen Pressure Low",
|
||||
"mode": "Equality",
|
||||
"setpointA": 1.0,
|
||||
"priority": "Low"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "UPSOnBattery",
|
||||
"tagType": "AtomicTag",
|
||||
"valueSource": "memory",
|
||||
"dataType": "Boolean",
|
||||
"value": false,
|
||||
"alarms": [
|
||||
{
|
||||
"name": "UPSOnBattery",
|
||||
"label": "UPS On Battery",
|
||||
"mode": "Equality",
|
||||
"setpointA": 1.0,
|
||||
"priority": "High"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "WaterSoftenerFault",
|
||||
"tagType": "AtomicTag",
|
||||
"valueSource": "memory",
|
||||
"dataType": "Boolean",
|
||||
"value": false,
|
||||
"alarms": [
|
||||
{
|
||||
"name": "WaterSoftenerFault",
|
||||
"label": "Water Softener Fault",
|
||||
"mode": "Equality",
|
||||
"setpointA": 1.0,
|
||||
"priority": "Low"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "AirDryerDewpoint_Chatter",
|
||||
"tagType": "AtomicTag",
|
||||
"valueSource": "memory",
|
||||
"dataType": "Boolean",
|
||||
"value": false,
|
||||
"alarms": [
|
||||
{
|
||||
"name": "AirDryerDewpoint_Chatter",
|
||||
"label": "Air Dryer Dewpoint High",
|
||||
"mode": "Equality",
|
||||
"setpointA": 1.0,
|
||||
"priority": "Low"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "TankFarm",
|
||||
"tagType": "Folder",
|
||||
"tags": [
|
||||
{
|
||||
"name": "T101_LevelHigh",
|
||||
"tagType": "AtomicTag",
|
||||
"valueSource": "memory",
|
||||
"dataType": "Boolean",
|
||||
"value": false,
|
||||
"alarms": [
|
||||
{
|
||||
"name": "T101_LevelHigh",
|
||||
"label": "Tank 101 Level High",
|
||||
"mode": "Equality",
|
||||
"setpointA": 1.0,
|
||||
"priority": "High"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "T102_LevelHigh",
|
||||
"tagType": "AtomicTag",
|
||||
"valueSource": "memory",
|
||||
"dataType": "Boolean",
|
||||
"value": false,
|
||||
"alarms": [
|
||||
{
|
||||
"name": "T102_LevelHigh",
|
||||
"label": "Tank 102 Level High",
|
||||
"mode": "Equality",
|
||||
"setpointA": 1.0,
|
||||
"priority": "High"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "T103_TempHigh",
|
||||
"tagType": "AtomicTag",
|
||||
"valueSource": "memory",
|
||||
"dataType": "Boolean",
|
||||
"value": false,
|
||||
"alarms": [
|
||||
{
|
||||
"name": "T103_TempHigh",
|
||||
"label": "Tank 103 Temp High",
|
||||
"mode": "Equality",
|
||||
"setpointA": 1.0,
|
||||
"priority": "Low"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "TransferPumpFault",
|
||||
"tagType": "AtomicTag",
|
||||
"valueSource": "memory",
|
||||
"dataType": "Boolean",
|
||||
"value": false,
|
||||
"alarms": [
|
||||
{
|
||||
"name": "TransferPumpFault",
|
||||
"label": "Transfer Pump Fault",
|
||||
"mode": "Equality",
|
||||
"setpointA": 1.0,
|
||||
"priority": "High"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "ContainmentSumpHigh",
|
||||
"tagType": "AtomicTag",
|
||||
"valueSource": "memory",
|
||||
"dataType": "Boolean",
|
||||
"value": false,
|
||||
"alarms": [
|
||||
{
|
||||
"name": "ContainmentSumpHigh",
|
||||
"label": "Containment Sump Level High",
|
||||
"mode": "Equality",
|
||||
"setpointA": 1.0,
|
||||
"priority": "Critical"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "VaporRecoveryFault",
|
||||
"tagType": "AtomicTag",
|
||||
"valueSource": "memory",
|
||||
"dataType": "Boolean",
|
||||
"value": false,
|
||||
"alarms": [
|
||||
{
|
||||
"name": "VaporRecoveryFault",
|
||||
"label": "Vapor Recovery Unit Fault",
|
||||
"mode": "Equality",
|
||||
"setpointA": 1.0,
|
||||
"priority": "Low"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "T104_PressHigh",
|
||||
"tagType": "AtomicTag",
|
||||
"valueSource": "memory",
|
||||
"dataType": "Boolean",
|
||||
"value": false,
|
||||
"alarms": [
|
||||
{
|
||||
"name": "T104_PressHigh",
|
||||
"label": "Tank 104 Pressure High",
|
||||
"mode": "Equality",
|
||||
"setpointA": 1.0,
|
||||
"priority": "Low"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "ManifoldLeakDetect",
|
||||
"tagType": "AtomicTag",
|
||||
"valueSource": "memory",
|
||||
"dataType": "Boolean",
|
||||
"value": false,
|
||||
"alarms": [
|
||||
{
|
||||
"name": "ManifoldLeakDetect",
|
||||
"label": "Manifold Leak Detected",
|
||||
"mode": "Equality",
|
||||
"setpointA": 1.0,
|
||||
"priority": "Low"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "T105_LevelXmtrFail_Standing",
|
||||
"tagType": "AtomicTag",
|
||||
"valueSource": "memory",
|
||||
"dataType": "Boolean",
|
||||
"value": false,
|
||||
"alarms": [
|
||||
{
|
||||
"name": "T105_LevelXmtrFail_Standing",
|
||||
"label": "Tank 105 Level Transmitter Failed",
|
||||
"mode": "Equality",
|
||||
"setpointA": 1.0,
|
||||
"priority": "Low"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "PumpSealFlushLow_Fleeting",
|
||||
"tagType": "AtomicTag",
|
||||
"valueSource": "memory",
|
||||
"dataType": "Boolean",
|
||||
"value": false,
|
||||
"alarms": [
|
||||
{
|
||||
"name": "PumpSealFlushLow_Fleeting",
|
||||
"label": "Pump Seal Flush Flow Low",
|
||||
"mode": "Equality",
|
||||
"setpointA": 1.0,
|
||||
"priority": "Low"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user