Validation
The configuration-health page: what the station scans in procedures, logic and dashboards, every finding it can report and how it is worded, what a row opens, the rail badge, and why nothing is repaired here.
The Validation page lists what the station cannot stand on: a channel binding, an interlock, an automation field, a Logic expression, script or condition, or a dashboard component that points at a tag, variable, procedure or address the station no longer has, a Process action whose paperwork a run could not emit as configured, and a procedure a run start would refuse. It is the Validation entry at the foot of the navigation rail, opens for an identity holding the View validation permission, and answers at /validation. It is a scrolling page, drawn at the full width because every finding is a sentence. It is the sibling of the runtime health in the status bar: that one says whether the station is reading, this one says whether the configuration still resolves.
The page reports; it never repairs. A row opens the editor that owns the fault, on the entity that holds it, and the repair is your edit there.
The status card
The card at the top is the page's whole answer about the configuration, and the only place a clean station is announced:
| State | Dot | Title | Detail |
|---|---|---|---|
| Clean | Green | Nothing to repair | Every reference in procedures, logic and dashboards resolves, every procedure would start, and every action has what it needs to come out. |
| Findings | Amber | N items to repair ("1 item" for one) | Nothing is repaired here. A row opens the editor that owns the fault, on the entity that holds it. |
The card carries the one command of the page, Rescan (tooltip: "Check the whole configuration again now. The list also refreshes on its own whenever something changes."). It is greyed while a scan runs. Because a scan that finds the same thing leaves the list exactly as it was, the outcome is reported in the status bar's action feed: "Rescan complete: nothing to repair.", "Rescan complete: N items to repair.", or "Rescan failed: reason".
You rarely need Rescan. The validator is always on, on the station, and rescans by itself 750 milliseconds after any burst of changes on any of the surfaces it reads: Connector devices, lines and tags; Process models; the assets; Logic variables, actions and alarms; dashboards; label templates; report layouts. The page and the rail badge follow the result. A scan that the Connector crosses while it is moving devices in or out (a driver refresh, a device being added) is retaken once the Connector settles, so a reference is never called broken merely because its device is in flight.
The groups
Findings are grouped by the surface that owns them, in a fixed order. A group with nothing in it is not drawn, so a station with one dashboard fault shows one group.
| Group | Kinds of finding | The line under the title |
|---|---|---|
| Process | Bindings (channel bindings, interlocks, automation), procedures and the occurrences they arm, and action paperwork | N items. Channel bindings, interlocks and unit automation naming a tag, variable or procedure the station no longer has, procedures a run start would refuse, and actions whose paperwork a run could not emit as configured. |
| Logic | Expression variables, actions, alarms | N items. Expressions, action scripts and alarm conditions reading an address that no longer resolves. |
| Dashboards | Components | N items. Components whose properties point at an address that no longer resolves. They render, but read nothing. |
A row
Every row is one finding, and it says what it is about without opening anything:
- A glyph for the kind: a unit for a Process binding, a printing mark for action paperwork, the written-composition mark for a procedure, a flag for an occurrence, the variable, action and alarm marks of the Logic tree, the dashboard mark for a component.
- The name of the entity, then its type when the type says something the name does not (a component the integrator never named falls back to its kind, and the row does not read "Gauge Gauge"), then "in location" where there is one.
- The finding: for a field that names a target, "Field points at
reference, which no longer exists." with the reference set in monospace; for a field the runtime cannot use, "Field: what is wrong." - A chevron on the right: the row opens something. The row's tooltip and its accessible name are the whole sentence plus where the click lands ("Open the unit in Process.", "Open the action in Process.", "Open the procedure in Process.", "Open the occurrence in Process.", "Open the component in the editor.", "Open the variable in Logic.", "Open the action in Logic.", "Open the alarm in Logic.").
Every finding the scan can produce
The wording below is the page's own. A reference shown as tag:… or var:… is the stored identity of a tag or variable that no longer exists; a key shown as text is the stored key of a binding.
Process: channel bindings
Type "Channel binding"; name: the channel's name (or "(removed channel)"); location: "Model · Unit". Opens the model's Channels screen on the unit.
| Field | Wording |
|---|---|
| Tag | points at the stored tag key, which no longer exists |
| Variable | points at the stored variable key, which no longer exists |
Process: interlocks
Type "Interlock"; name: the unit's name; location: "Model · Unit". A unit is judged on what it actually observes: its own source, or the model's default when it follows the model. Opens the model's Automation screen on the unit.
| Field | Wording |
|---|---|
| Source | it follows the model, whose default names no Boolean source. |
| Source | no Boolean source is configured. |
| Source | a Tag and a Variable are both selected. |
| Tag | points at tag:…, which no longer exists |
| Tag | a DateTime tag is not Boolean-convertible. (also Guid and ByteString tags) |
| Variable | points at var:…, which no longer exists |
| Variable | a DateTime variable is not Boolean-convertible. (also Image, Icon and Color variables) |
The first three are only reported while the model's stop interlock is enabled.
Process: automation
Type "Automation"; name: the unit's name; location: "Model · Unit". Only an enabled automation is judged: one switched off drives nothing and retires from the list. Opens the model's Automation screen on the unit.
| Field | Wording |
|---|---|
| Commands | no Start source is configured. |
| Procedure | the fixed Procedure is not available. (fixed selection) |
| Selector | a source finding (below), for an integer source |
| Selector code n | it selects a Procedure that was removed. |
| Start source, Stop source, and so on, one per command source | a source finding, for a Boolean source |
| Metadata | a mapping fills a Procedure or a field that was removed. |
| Metadata "field" | a source finding (numeric for a numeric field; Boolean, integer, real, text or date for the others), or: this field does not support automatic generation. |
| Return Ready, Return Active, Return SelectedCode, Return CommandResult | points at tag:…, which no longer exists; or: the Tag it writes is not writable. / it requires a Boolean Tag. (Ready, Active) / it requires an integer Tag. (SelectedCode, CommandResult) |
A source finding is one of: "no source is configured.", "a Tag and a Variable are both selected.", "the Tag it reads was removed (tag:…).", "the Tag it reads is not readable." (the tag is disabled or write-only), "a type tag is not compatible here.", "the Variable it reads was removed (var:…).", "a type variable is not compatible here.". Compatibility follows the role of the field: a Boolean source needs a Boolean tag or variable; an integer source an integer type; a numeric source an integer or real type; a metadata source any Boolean, integer, real, text or date type.
Process: procedures
Type "Procedure"; name: the procedure's name; location: the model's name. The judgement is the same gate the start of a run passes through, so a procedure this list calls runnable is one the bench accepts. Opens the procedure's own page.
The gate writes these refusals in English, and the row quotes them as they come, whatever language the station is set to.
| Field | Wording |
|---|---|
| Composition | An evaluation judges over recorded rows. This procedure carries one but no datalog. |
| Composition | Occurrence 'name' watches recorded samples. This procedure arms it but has no datalog. |
| Composition | Nothing to run: this procedure references neither a datalog nor a recipe. |
| Composition | Instant mode needs an instant recipe (or none). A temporal profile has no single tick. |
| Composition | Controlled mode needs an instant recipe (or none). Setpoints apply at Start, safe-state at Stop. |
| Composition | Temporal mode needs a duration. Set one. |
| Composition | Temporal mode needs a temporal recipe (or none). An instant set has no timeline. |
| Composition | The recipe profile (N ms) is longer than the temporal window (M ms). |
| Composition | Occurrence 'name' watches 'Channels.channel', which this procedure's datalog does not record. |
| Composition | A refusal about what a completed run contributes to production, or about a recipe value that cannot reach the channel it is aimed at, in the words of the editor that owns it. |
Process: occurrences
Type "Occurrence"; name: the occurrence's name; location: the model's name. Only an occurrence a procedure arms is read, and it is read once however many procedures arm it, because the condition is one and so is the repair. Opens the occurrence's own page.
| Field | Wording |
|---|---|
| Condition | The condition's own refusal, in the words the occurrence editor uses: a channel reference this model does not have, a condition that does not parse, one that returns something other than a Bool, or two channels that come down to the same name. It is written in English too. |
A condition that stands on its own and still cannot be judged, because the procedure's datalog leaves out the channel it watches, is a finding on that procedure instead: the datalog is the procedure's choice.
Process: action paperwork
Type "Action"; name: the action's name; location: the model's name. The judgement is the same one the action's own page draws its "Needs review" notice from, so an action called ready there is ready here. Opens the action's own page.
| Field | Wording |
|---|---|
| Commands | Add a command: this action emits nothing yet. |
| Command n · Label at Start, Command n · Report at Completion, and so on | The first remark about that command, then "(k more on this command)" when there are more. A command with several remarks is still one repair, made on one page, so it is one row. |
The remarks a command can carry, in the order they are repaired:
- Select at least one completion verdict. (a command at Completion with no verdict ticked)
- Choose a report. / The selected report no longer exists.
- Choose a label template. / The template was cleared or deleted; stored mappings are preserved. / The selected global template no longer exists.
- The selected template has no printer commands yet; write or import them before a run reaches this command.
- Template markers cannot be read: error
{{marker}}needs a source. /{{marker}}is mapped more than once.{{marker}}: choose a source / this source is not available at Start / select a field of this model's metadata catalogue / select a criterion from one of this model's evaluations / set an explicit zero-based cycle from 0 to n / remove decimal places from this date/time source / use the default format for this numeric source / decimal places must be between 0 and 9 / remove numeric/date formatting from this text source{{marker}}was removed from the current template; remove its stored mapping.
Logic
No location: the Logic kinds are top level. One row per distinct address that does not resolve, with the address written as the expression writes it. Only expression variables are scanned; a memory variable has no expression to read.
| Type | Field | Wording |
|---|---|---|
| Expression variable | Expression | points at address, which no longer exists |
| Action | Script | points at address, which no longer exists |
| Alarm | Condition | points at address, which no longer exists |
Dashboards
Type: the component's kind as the editor names it (Gauge, Line chart, Value…); name: the name typed for the component, else its caption, else what the editor derives; location: the dashboard's name. One row per address field, so a component whose value and whose colour read two removed points is two repairs.
| Field | Wording |
|---|---|
| Address, Accent address, Series 2 › Address, and every other address field of the kind (a nested list reads as its path) | points at address, which no longer exists |
Only address fields are read, and only a value that parses as a rooted address with at least one segment: a label holding "Process.Press 1.Temperature" is text, not a reference, and is never reported. The same address in the same field is one finding. Screens defined on a Process model are skipped: they bind channels through a unit placeholder, and no point answers those addresses until a unit opens the screen.
What a row opens
| Kind | Opens | Where it lands |
|---|---|---|
| Component | The dashboard in edit mode (/d/{dashboard}?edit=true&focus={component}) |
With the component selected and its properties showing, where the address is retyped. Editing needs the Edit dashboards permission; without it the dashboard opens for viewing. |
| Channel binding | The Process workspace (/process?focus={unit}&screen=channels) |
The model's Channels screen, with that unit's row picked and every folder above it expanded. |
| Interlock, Automation | The Process workspace (/process?focus={unit}&screen=automation) |
The model's Automation screen, with that unit's row picked. |
| Action paperwork | The Process workspace (/process?focus={action}&screen=action) |
The action's own page in the column. |
| Procedure | The Process workspace (/process?focus={procedure}&screen=procedure) |
The procedure's own page in the column. |
| Occurrence | The Process workspace (/process?focus={occurrence}&screen=occurrence) |
The occurrence's own page in the column. |
| Expression variable, Action, Alarm | The Logic page (/logic?focus={id}) |
The entity selected in its editor, with its section of the address space expanded. |
Opening lands you on the fault; the destination page then applies its own permissions to the edit (Manage process on the Process screens, Configure logic in Logic). An entity that no longer resolves when the page arrives (deleted meanwhile) is ignored, and the page opens where it normally would.
The rail badge
The Validation entry on the rail wears a caution pill with the number of items to repair, "99+" past ninety-nine, and no pill while the configuration is clean. The count is the validator's own, kept current in the background by the same rescan the page follows, so it moves as you edit on any page, without this page being open.
What the page never does
- It repairs nothing: no rebind, no delete, no rename. Every row is an "open"; there is no other action on a row, and no bulk action.
- It never judges the runtime: a device that is not communicating is the status bar's health, not a finding here. A reference to a tag that exists but reads bad quality resolves.
- It never reports a disabled automation, a screen defined on a model, free text that looks like an address, a memory variable, or a second and later remark of the same action command (the count says how many more wait on that page).
- It never reads an occurrence no procedure arms, and never lists the same armed occurrence twice however many procedures arm it: one condition is one repair.
- It never scans while the Connector is mid-transition; it waits and measures once.
- It is the same list on every screen, the station's window and a browser alike, and the same for every identity that may open it: the permission gates the page, not its rows.
- While the runtime is stopped the page gives way to the paused notice like every page; the badge keeps its last count.