Overview
During Factory Acceptance Tests (FAT), Site Acceptance Tests (SAT), and controller commissioning, engineers frequently need to temporarily disable alarms on a PanelView Plus terminal running FactoryTalk View Machine Edition (ME) while keeping a clear visual indication that alarms are suppressed. A banner rendered on every HMI page — controlled by a single expression and a single tag — is the standard, audit-friendly way to do this without modifying the alarm log files or the controller's alarm logic.
This article documents the exact expression syntax required to evaluate a discrete or integer tag, how to bind that expression to a text object's Visibility animation, and how to deploy the banner to every display using a Global Object so that flipping one PLC bit or HMI tag shows the banner on the entire project. The guidance aligns with the FactoryTalk View Machine Edition User's Guide (publication VIEWME-UM004) from Rockwell Automation. Refer to the FactoryTalk View ME User's Guide (VIEWME-UM004) for full details on expression syntax and the Expression Editor.
TMS_PLC_Tags\ALM_INDIC sourced from a ControlLogix or CompactLogix controller. The same syntax applies to Micro800, SLC 500, PLC-5, and third-party controllers when the tag is exposed through a FactoryTalk Linx data server.
Prerequisites
- FactoryTalk View Studio for Machine Edition, version 11.00.00 or later (matches PanelView Plus 7 firmware 11). Earlier versions (8.0/9.0/10.0) follow the same expression syntax with minor dialog layout differences.
- An HMI project already configured with a working HMI Tag or a direct reference to a controller tag pointing at the alarm-suppression indicator. Example:
TMS_PLC_Tags\ALM_INDIC. - A
DINT,BOOL, orSINTtag in the controller that the application sets to1when alarms are disabled and resets to0when alarms are enabled. The expression grammar in FactoryTalk View ME treats1and0as integers, so use an integer tag if you want to evaluate== 1; a discrete (BOOL) tag can be used directly without comparison. - A FactoryTalk View ME runtime license (PanelView Plus) and a configured RSLinx Enterprise / FactoryTalk Linx shortcut.
FactoryTalk ME Expression Syntax Reference
Expressions in FactoryTalk View ME follow C-style boolean and arithmetic rules. The Expression Editor supports:
- Arithmetic:
+ - * / % ^ - Comparison:
== != > < >= <= - Boolean:
&& || !(and / or / not) - Bitwise:
& | << >>on integer tags - Parentheses for grouping
- Numeric constants as
123,0x1F, or0b1010 - String constants in double quotes:
"Running" - Tag references enclosed in braces:
{TagName}
Tag references substitute the tag's current value at evaluation time. When a tag is wrapped in braces inside a larger expression, the substitution is performed first and the resulting expression is parsed. Tags can be hierarchical, e.g. {TMS_PLC_Tags\ALM_INDIC} — the backslash separates the data server and folder from the tag name.
Common Syntax Pitfalls
| Pitfall | Symptom | Correction |
|---|---|---|
Quoted numeric literal: "1"
|
Type mismatch error or banner never shows | Use unquoted integer: 1
|
| Double-equal with parentheses mismatch | Expression invalid at compile | Match opening and closing parens: IF ({Tag} == 1) THEN 1 ELSE 0
|
Comparing a discrete (BOOL) tag with == 1
|
Unnecessary but not always an error | Use the tag by itself: {TMS_PLC_Tags\ALM_INDIC}
|
| Missing braces around tag | Token treated as identifier, undefined error | Wrap in braces: {TMS_PLC_Tags\ALM_INDIC}
|
Using = instead of ==
|
Assignment is not allowed in expressions | Always use == for comparison |
Building the Alarm-Disabled Expression
Three valid forms are commonly used in ME projects, depending on tag data type.
Form A — Discrete (BOOL) Tag
If TMS_PLC_Tags\ALM_INDIC is a BOOL, the expression is simply the tag itself. The result of evaluating a discrete tag is 1 (true) or 0 (false) and binds directly to the Visibility animation's True / False states.
{TMS_PLC_Tags\ALM_INDIC}
Form B — Integer Tag (DINT / SINT / INT)
The original expression in the source post contained a quoted literal. The correct form for an integer tag is:
IF ({TMS_PLC_Tags\ALM_INDIC} == 1) THEN 1 ELSE 0
Form C — Multi-State Suppression with Reason Code
Many commissioning procedures require not just a binary banner, but a reason code (e.g. 1 = disabled for test, 2 = disabled for maintenance, 3 = disabled for IO checkout). Use a CASE-style expression with nested IFs:
IF ({TMS_PLC_Tags\ALM_INDIC} == 1) THEN 1 ELSE IF ({TMS_PLC_Tags\ALM_INDIC} == 2) THEN 1 ELSE 0
For three or more states, the CASE construct is not directly supported in FactoryTalk View ME expressions; chain IFs or use a derived HMI tag that maps the integer to a boolean.
BOOL, use Form A. Avoid the IF/THEN/ELSE wrapper — it adds nothing and makes the expression harder to read. The IF/THEN/ELSE form is necessary only when comparing an integer to a constant or when chaining logical conditions.
Creating the Banner as a Text Object
- In FactoryTalk View Studio, open the graphic display where the banner will appear (start with the main overview screen).
- From the Objects palette, draw a Text object across the top of the display — for example, full width, 24 pixels tall, red background, white text reading
!! ALARMS DISABLED FOR TESTING !!. - Right-click the text object and select Animation > Visibility... to open the Visibility animation dialog.
- In the Expression field, enter the alarm-suppression expression (Form A, B, or C above).
- For State 0 (expression false), select Invisible. For State 1 (expression true), select Visible.
- Click OK to apply.
0 (false), State 1 to 1 (true). Reversing the states inverts the banner — verify with a test toggle before continuing.
Deploying the Banner to Every Page (Global Object)
Copying the banner into 30+ graphic displays is fragile — a single edit has to be repeated everywhere. FactoryTalk View ME provides a Global Object for exactly this case.
- With the banner text object selected on the test display, right-click and choose Create Global Object...
- Assign a meaningful name, e.g.
GObj_AlarmsDisabledBanner. The Global Object Definition editor opens. - Set the visibility animation inside the global object definition (not on the instance) so every instance evaluates
{TMS_PLC_Tags\ALM_INDIC}on its host display. - Click Save in the Global Object Definition editor.
- On each graphic display, drag
GObj_AlarmsDisabledBannerfrom the Global Objects panel onto the page at the same X/Y coordinates.
Once deployed, every page instance updates its visibility from the same tag read, and a single edit to the global object updates every instance across the project.
Wiring the PLC Tag
The HMI-side expression evaluates {TMS_PLC_Tags\ALM_INDIC}. Wire this tag from the controller as follows:
| Platform | Tag Definition | Notes |
|---|---|---|
| ControlLogix / CompactLogix (L8x) |
ALM_INDIC : BOOL; in controller scope |
Expose to HMI via FactoryTalk Linx; folder shown in HMI as PLC\ALM_INDIC
|
| SLC 500 / MicroLogix |
B3:0/0 or named bit |
Available natively in RSLinx Classic data server |
| Third-party (Modbus TCP, OPC UA) | HMI memory tag mapped to register | Use KEPServerEX or similar; bind to the HMI tag, not directly to the controller |
Suggested ladder snippet for a Logix Designer routine that sets the tag from an HMI pushbutton or from a maintenance-mode bit:
XIC(MaintMode) OTE(ALM_INDIC);
For an integer tag with a reason code:
BTD(MaintModeWord, 0, ReasonCode, 0, 4) MOV(ReasonCode, ALM_INDIC);
Verification
- Build the HMI project (Project > Build > Build All) and resolve any expression errors flagged in the output window.
- Download the runtime file to the PanelView Plus terminal.
- From the controller programming software (Studio 5000 Logix Designer, RSLogix 500, or Connected Components Workbench), force
ALM_INDIC = 1. - Cycle through every graphic display and confirm the banner appears in the same X/Y position on each page.
- Force
ALM_INDIC = 0and confirm the banner disappears on every page. - If the banner never shows: open the display in Test mode within FactoryTalk View Studio, select the text object, and inspect the visibility state in the Inspect window — it will display the current boolean state of the expression.
Troubleshooting Matrix
| Symptom | Likely Cause | Resolution |
|---|---|---|
| Banner never appears when tag = 1 | Visibility states inverted | Swap State 0 / State 1 assignments |
| Compile error: "Unexpected token" | Quoted numeric literal "1"
|
Replace with unquoted 1
|
| Banner appears on some pages only | Banner placed as local object, not Global Object | Convert to Global Object and re-instantiate |
| Tag value is always 0 on HMI | Data server shortcut not configured or device offline | Verify shortcut in RSLinx Enterprise / FactoryTalk Linx; check controller path |
| Expression evaluates but banner flickers | HMI tag poll rate too low or controller scan too slow | Increase HMI tag update rate to 100 ms; ensure the controller does not rapidly toggle the bit |
| Banner shows inverted (banner when enabled, hidden when disabled) | Logix tag is active-low | Invert the expression: IF ({Tag} == 0) THEN 1 ELSE 0
|
| Build error: "Tag not found" | Folder separator incorrect; ME uses backslash, not forward slash | Use {TMS_PLC_Tags\ALM_INDIC}
|
| Banner appears on panel but not in Test mode | Test mode uses a different data server | Open Communication Setup in Test mode and point to the same shortcut |
Best Practices for Commissioning Use
- Always log the alarm-disable state to the controller's event log, not just to the HMI banner, so that the audit trail persists past the HMI reboot.
- Use a separate, dedicated HMI tag for the banner; do not repurpose a controller tag whose primary purpose is something else. This avoids the "expression always evaluates true" failure mode when the upstream tag is set to a different non-zero value.
- Pair the banner with a maintenance-mode key-switch input wired to the controller, so that the alarm-disable state cannot be enabled from the HMI alone — a common cybersecurity review comment.
- Consider adding the suppression tag to the Alarm Status filter, so the banner also drives which alarms are routed to the alarm summary. This is done with an Alarm Condition expression in the alarm setup, not in the banner's visibility expression.
- Document the expression and the global object name in the project HMI design specification so that future engineers can locate and modify the banner without trial-and-error.
Reference
- FactoryTalk View Machine Edition User's Guide (VIEWME-UM004) — expression syntax, Expression Editor, visibility animation, and Global Objects reference.
FAQ
Why does my expression fail when I write == "1" with quotes?
FactoryTalk View ME's Expression Editor treats "1" as a string literal and rejects equality comparison against a numeric tag. Use the unquoted integer 1, or — for a discrete (BOOL) tag — drop the comparison entirely and reference the tag as {TMS_PLC_Tags\ALM_INDIC}.
Can I use a single banner across all 30+ graphic displays without copying it?
Yes. Create the banner as a Global Object in FactoryTalk View Studio, then drag an instance onto each display. Edits to the global object propagate to every instance on rebuild.
Do I need an IF/THEN/ELSE expression for a boolean alarm-disable tag?
No. A discrete tag substituted inside braces already evaluates to 1 (true) or 0 (false). Bind it directly to the Visibility animation's State 0 / State 1 and skip the wrapper.
How do I make the banner appear when the tag is a non-zero value (any reason code)?
Use IF ({TMS_PLC_Tags\ALM_INDIC} > 0) THEN 1 ELSE 0, or convert the reason-code integer to a boolean with a derived HMI tag and reference that derived tag in the visibility expression.
The expression compiles but the banner never shows during Test mode — what should I check?
Verify the FactoryTalk Linx / RSLinx Enterprise shortcut in Test mode points to the same controller, confirm the controller tag is not forced to 0, and use the Inspect window on the text object to read the live expression result. A common cause is the data server being in Design (local) mode during Test rather than Runtime.