Validation

The configuration-health page: what the station scans in procedures, logic, dashboards and the lists its servers and brokers hand out, every finding it can report and how it is worded, what a row opens, the rail badge, and why nothing is repaired here.

View as Markdown

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 Logic expression, script or condition written in a way its editor refuses, 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.

It also lists a row of a list the station hands its data out by (the OPC UA server's list, the Modbus server's register map or an MQTT broker's publication list) whose source was deleted: such a row stays in its list and serves or publishes nothing.

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, dashboards and what the station serves and publishes 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 three lists the station hands its data out by are read as well: a row added, edited or deleted on the OPC UA server, on the Modbus server or on a broker's Publish card rescans the same way, and so does the deletion of the tag, variable, alarm or command a row names.

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, or written in a way their editor refuses.
Dashboards Components N items. Components whose properties point at an address that no longer resolves. They render, but read nothing.
Connector Rows of the OPC UA server's list, of the Modbus server's register map and of the MQTT brokers' publication lists N items. Rows of the OPC UA server's list, the Modbus server's register map and the MQTT brokers' publication lists whose source was deleted. They stay in their list, but serve or publish 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.").
  • For a row of a server list, the glyph is the mark the Connector tree draws for what holds the list (the OPC UA server, the Modbus server, the MQTT broker), and the click lands where the tooltip ends ("Open the row in the OPC UA server.", "Open the row in the Modbus server.", "Open the row on the MQTT broker's page.").

Every finding the scan can produce

The wording below is the page's own. A channel binding stores the key of its source, so its row names the key that no longer resolves; an interlock, an automation source and a return store an identity the operator never reads, so their rows say that the tag or variable was removed instead of printing it.

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 the Tag it was set to was removed.
Tag a tag of type DateTime is not Boolean-convertible. (also Guid and ByteString tags)
Variable the Variable it was set to was removed.
Variable a variable of type date and time is not Boolean-convertible. (also image, icon and color)

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 command source, Stop command 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 “Selected code”, Return “Command result” the Tag it writes was removed. / the Tag it writes is not writable. / it requires a Boolean Tag. (Ready, Active) / it requires an integer Tag. (Selected code, Command result)

A source finding is one of: "no source is configured.", "a Tag and a Variable are both selected.", "the Tag it reads was removed.", "the Tag it reads is not readable." (the tag is disabled or write-only), "a tag of type type is not compatible here.", "the Variable it reads was removed.", "a variable of type type 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.

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 Boolean, 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. Where every address of a text resolves, the text is also judged as its editor judges it, and a text the editor refuses is one row, with the editor's own sentence as its wording: an alarm saved as !Variables.Start reads "'Variables.Start' is the point itself, not its value: as a condition it always counts as true. Read its value with Variables.Start.ValueToBool()." The judgment leaves out the editor's trial evaluation over the current values, so a row never comes and goes with a reading, and an empty text is not listed: it is a definition not written yet.

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
Expression variable Expression the sentence its editor refuses the text with (What validation refuses)
Action Script the sentence its editor refuses the text with (What validation refuses)
Alarm Condition the sentence its editor refuses the text with (What validation refuses)

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, Color point, Series 2 › Address, and every other address field of the kind, each under the label the editor's properties panel gives it (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.

Connector

A row of the OPC UA server's list, of the Modbus server's register map or of an MQTT broker's publication list holds its source (a tag, a variable, an alarm, and on the OPC UA server also a device command) by its identity: a rename never breaks it, and a deletion leaves the row standing, naming what it lost. Such a row is listed here, the same row its own table shows as missing. A source the station still has and does not offer (a disabled tag, a tag of a disabled device, a variable of a type no register carries) is not listed: the row's own fields say what keeps it out. The row stores an identity the operator never reads, so it says which kind of source went instead of printing it.

Type Name Location Field Wording
Served node Missing Tag, Missing Variable, Missing Alarm or Missing Command OPC UA server Source the Tag it serves was removed. / the Variable it serves was removed. / the Alarm it serves was removed. / the Command it serves was removed.
Register map row the row's place as the map reads it (its register class and its register) Modbus server Source the Tag it serves was removed. / the Variable it serves was removed. / the Alarm it serves was removed.
Published topic the row's topic the broker's name Source the Tag it publishes was removed. / the Variable it publishes was removed. / the Alarm it publishes was removed.

The page deletes and changes nothing, and each server goes on doing with the row what it did: the OPC UA server serves nothing for it, the Modbus server answers a client reading its registers with exception 04, and the broker keeps the last message it retained on the topic. The repair is made on the row's card: another source picked, or the row deleted.

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.
Served node, Register map row, Published topic The Connector (/connector?focus={row}) The OPC UA server, the Modbus server or the broker selected in the tree, with the row selected in its Served nodes, Register map or Publish card and its fields open under the table, where another source is picked or the row deleted.

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, Configure connector on the Connector). 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. Opening this page and rescanning on it update the count as well, so the badge never reads a different number from the list.

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.
  • It never deletes a row of a server list or changes what a server does with it, and never lists a source the station still has but does not offer (a disabled tag, a variable of a type no register carries): the row's own card says that.