A PAC program that must know which I/O bit is forced has no per-tag force status to read. The only force information the logic can see is the system tag Forces Enabled, which is ON when any force is active. The force table itself is internal to the CPU. The rest of this note covers the detection tricks that fail, the interlock that works, and the point where you stop and ask the manufacturer. The platform details come from a 2012-era record, so check them against the release notes of your current software and firmware before relying on them.
Drop the fixes that look like force detection but are not
Each of these is the usual first move. None of them gives the logic a reliable answer to 'is this bit forced, and to what value?'
| Quick fix | What it actually tells you | Why it fails as force detection |
|---|---|---|
| Compare the output state to the internal memory bit that drives it | A force on an output whose forced value differs from what the logic is commanding | A bit forced to the same value the logic already commands looks normal. It gives no information for inputs, and a one-scan mismatch is also a normal transient. It is a heuristic, not a safe or 100% reliable method. |
Read the Forces Enabled system tag |
At least one force is active somewhere in the project | It does not identify which tag is forced or the forced state (on/off). |
| Check Dataview or the forces-enabled indicator at the bottom right of the programming window | A person online sees that forces exist and which tags carry them | The information is for a human at the screen. The running logic cannot read it. |
| Wait for the force icon on ladder contacts and coils | A planned display aid that highlights forced elements in the editor | It is a visual feature. It does nothing for a program that needs to branch on force state. |
| Look for an instruction that queries the force table | Nothing. No such instruction is documented in the source record; it was raised as a feature request and forwarded to development. | Confirm against current release notes before designing around it. |
Understand what the PAC exposes and where the limit sits
The controller keeps an internal force table that holds the forced tags and their values. It applies them, and the runtime obviously has to know them. That table is not mapped to tags, and no instruction returns a per-tag forced flag or forced value. Up to 64 tags can be forced at one time. So the visibility is:
- Human, online: Dataview and the programming-window indicator.
-
Logic, any project:
Forces Enabled(one BOOL, any force active). - Logic, per tag: none documented. A proposed fix is a query instruction that takes an I/O tag and returns two BOOLs (is forced, forced value), or a CPU-memory list of forced discrete tags. Both remain feature requests.
The problem is worst when several I/O tags map to one real-world circuit, such as a command output plus its related bits. Forcing one bit for debug while the logic acts on another gives behavior that is hard to trace from the ladder alone. That is the case where a force can produce unexpected machine motion.
Interlock production on the Forces Enabled tag
You cannot identify the bit, but you can guarantee that a project running with any force active is never treated as a released, production-ready state. Build it in the program:
- Create a BOOL such as
Commissioning_Modethat you set deliberately when debugging. Choose your own tag name. - Add a rung that sets an alarm when
Forces Enabledis ON. Latch it if you want it to survive a force being cleared and re-applied. - Block automatic start, recipe run, or any 'production' permissive while that alarm is set. Use a normally-closed contact of the alarm bit in the permissive chain.
- Drive a beacon, HMI banner, or stack-light element from the same alarm so operators see it at a glance.
- Allow the alarm to be cleared only by removing forces, not by an operator acknowledgment. Acknowledging without unforcing leaves the hazard in place.
This handles the 'bite me in the backside' scenario at the level the platform allows: the logic knows that some force is active and refuses to run as if the machine were in a known state.
Reduce the places a force can hide
When several bits belong to one circuit, structure the logic so that circuit has a single decision point:
- Route every physical output through one mapping rung or subroutine that copies an internal command bit to the I/O tag. Everything else in the program talks to the internal bit only.
- Read physical inputs into internal bits in one place, then use the internal bits everywhere else.
- Keep a written list of the bits you intend to force during a test. With a 64-tag ceiling, the list stays short enough to audit against Dataview.
A force at the mapping layer is then easy to spot in Dataview and unlikely to conflict silently with a second bit on the same circuit. It also gives you a single place for the output-versus-command comparison below.
Use the output-versus-command comparison as an alarm only
The comparison the source describes is worth keeping as a diagnostic, with clear limits. Put it in the mapping layer:
IF (Output_Tag <> Command_Bit) AND scan-stable for your chosen debounce
THEN set Force_Suspect alarm
Treat it as advisory. It misses a forced value equal to the commanded one, it does not cover inputs, and it can false-trip during normal transitions. Do not tie a safety function to it. Safety functions belong on safety-rated hardware, and a force in a standard PAC must never be the mechanism that permits or denies a hazardous motion.
Add real feedback where a wrong force is dangerous
If a forced output could move something dangerous, detection through the force table is the wrong layer. Wire an independent physical confirmation, such as a limit switch, contactor auxiliary contact, or pressure switch, to a separate input. Then compare commanded state to confirmed state. That check detects a wrong output regardless of how it got there, including force, wiring fault, or a failed output point. Decide the fault reaction before commissioning.
Separate the temporary restore from the permanent repair
| Goal | Action |
|---|---|
| Temporary: get a running machine back to a known state tonight | Open Dataview, review every forced tag, unforce them, and confirm Forces Enabled goes OFF. |
| Permanent: stop this from recurring | Install the Forces Enabled alarm and production permissive, the single mapping layer, and a commissioning checklist item that requires forces cleared before release. |
Do not release with the alarm bypassed. If a force must remain during a special test, record which tag, which value, who approved it, and when it will be removed.
Prove the interlock catches a force before release
- Force one non-hazardous bit. Confirm
Forces Enabledturns ON, the alarm sets, and the production permissive drops. - Force a bit to the same value the logic already commands. Confirm the output-versus-command comparison stays silent while
Forces Enabledstill trips. This proves why the comparison cannot be your only check. - Force an input bit and confirm the same result, since the comparison method has no input coverage.
- Remove all forces and confirm
Forces Enabledgoes OFF and the permissive can be re-established. - After a download, a mode change, and a power cycle, look in Dataview for forced tags and check
Forces Enabled. Record how your firmware behaves, then document it. Retention behavior is defined by the manufacturer's documentation for your version. - If you rely on physical feedback, break the feedback circuit deliberately and confirm the fault reaction fires.
Stop and ask the manufacturer when the workaround is not enough
Stop and contact the manufacturer's official support when a process requires per-tag force status in logic, when your firmware or software version documents behavior different from this note, or when a hazard analysis says a force on a specific bit could injure someone. Ask whether the current release adds a per-tag force query, a force-status system tag, or a force-table read instruction, and quote your software and firmware versions. Until support confirms such a feature in writing, design as if only Forces Enabled exists.
FAQ
Can I read which specific tag is forced from ladder logic?
Not through any documented per-tag instruction. The logic can read the Forces Enabled system tag, which is ON if any force is active, and a per-tag query was a feature request. Check current release notes for changes.
Does the Forces Enabled tag tell me the forced value?
No. It is a single BOOL that reports whether any force is active. It does not identify the tag or the forced on/off state.
Can I detect a forced output by comparing it to the memory bit that drives it?
Only when the forced value differs from the commanded value. A force matching the commanded state looks normal, and inputs have no equivalent check, so use the comparison as an advisory alarm and never as a safety function.
Does the force icon on ladder contacts and coils help my program detect forces?
No. It is an editor display aid on the manufacturer's improvement list and is visible only to a person online. The running logic cannot read it.
Can I force more than 64 tags at once?
The source record states a maximum of 64 forceable tags. Verify the current limit in your software's documentation before planning a test that needs more.