Hundreds of "A binding with target ... already exists! XML syntax error" messages when opening project with multiple visualizations (multi-client) — build is clean

Hello,

IDE: Automation Studio 6.7.0.187, mapp View 6.7.0

Every time I open my project, the Output Results window fills with ~840 errors like:

A binding with target brease.St25ManualsContent.Manual_MomentaryPushButton17.style already exists!XML syntax error. The object cannot be loaded.
A binding with target brease.St25ManualsContent.Manual_MomentaryPushButton17.value already exists!XML syntax error. The object cannot be loaded.
...

As soon as I rebuild the configuration, the build completes with 0 errors and 0 warnings, and the errors are gone — until the next time I open the project, when all of them come back.

Project structure

The machine has 3 HMI clients that must be able to operate manual functions independently. Following the usual multi-client pattern, I have:

  • One set of shared contents/pages (e.g. St25ManualsContent with momentary push buttons).
  • Three visualizations (vis_1, vis_2, vis_service), one per physical client.
  • Three binding set variants per content (St25ManualsContent, St25ManualsContent_Hmi2, St25ManualsContent_Hmi3), each binding the same widget targets to a different PV index, e.g.:
<!-- Bindings/Hmi1/St25/St25ManualsContent.binding  (BindingsSet id="St25ManualsContent") -->
<Binding mode="twoWay">
  <Source xsi:type="opcUa" refId="::AsGlobalPV:PanelCom.HMI[1].HandFunctions.Button[17].cmd" attribute="value" />
  <Target xsi:type="brease" contentRefId="St25ManualsContent" widgetRefId="Manual_MomentaryPushButton17" attribute="value" />
</Binding>

<!-- Bindings/Hmi2/St25/St25ManualsContent_Hmi2.binding  (BindingsSet id="St25ManualsContent_Hmi2") -->
<Binding mode="twoWay">
  <Source xsi:type="opcUa" refId="::AsGlobalPV:PanelCom.HMI[2].HandFunctions.Button[17].cmd" attribute="value" />
  <Target xsi:type="brease" contentRefId="St25ManualsContent" widgetRefId="Manual_MomentaryPushButton17" attribute="value" />
</Binding>

Each .vis file references exactly one of the three binding sets:

<!-- vis_1.vis -->  <BindingsSet refId="St25ManualsContent" />
<!-- vis_2.vis -->  <BindingsSet refId="St25ManualsContent_Hmi2" />
<!-- vis_service.vis --> <BindingsSet refId="St25ManualsContent_Hmi3" />

So within any single visualization every binding target is unique — which is exactly why the build is clean.

What I found

  • Each of my three binding set folders contains 841 bindings; the targets (content + widget + attribute) are identical across the three variants by design. The number of errors at project open matches almost exactly the number of targets that exist in more than one binding set (~840).
  • The compiler validates bindings per visualization → no errors at build time.
  • The check at project open apparently loads all binding sets of the configuration into one global registry (design-time cache in Temp\Objects\<Config>\<PLC>\.mappView\), so every target that exists in more than one binding set variant is flagged as a duplicate — even though the sets are never active in the same visualization.
  • Deleting the Temp folder only helps for a single open; after the next build the cache is regenerated and the errors return on the following open.

Questions

  1. Is this a known issue in AS 6.x? It looks like the project-open validation ignores the visualization scoping that the compiler correctly applies.
  2. Is there a way to suppress or correctly scope this design-time check, so the Output window is not flooded with false positives at every project open? With ~840 spurious errors it is easy to miss a real one.
  3. Is there a recommended project structure for multi-client HMIs (same contents, per-client PVs) that avoids duplicate binding targets across binding sets? I’m aware of the session-variable / clientInfo.slotId list-binding approach, but for a machine with fixed clients the per-visualization binding sets are much simpler to maintain — and they do build cleanly.

Thanks in advance!

I think here we need really senior mappView user or expert. Maybe @hobi72 can help here?

Not sure if I can really help here.

There is one thing, which should be kept in mind:
The .vis file itself does - unfortunately - not define “the HMI” … it describes more or less a “HMI package” of files, belonging together.

For that reason, if you open a project, the internal object model is created, performing some basic checks … one of these checks is the validity of the bindings. These checks are done on file basis, not on “HMI package” basis … for that reason, if you have bindings, with the same target, this will be considered as issue.

I’m not saying that this is the correct behavior. I would recommend to contact support and open a ticket for further investigation.

CHH

Thanks Christian, this is very helpful answer. So it is clear that is “expected” or maybe better to say “known” behavior of AS. And needs to be handled by standard support and R&D channels.

Hi Luca @lucacm26

I think you have the right Q&A in your question #3.

Using listElement bindings should be the way to go, the tricky part is the assign the correct HMI_ID to the right client. The slotId seems the obvious choice BUT that doesn’t guarantee the same client gets the same ID one every system start.
I have used the IP-Address instead. After setting up each client with a fixed IP-Address you can clearly identify each client and assign the proper HMI_ID.

Now you can use the same binding file for all HMI clients, don’t generate the errors on project open and as a bonus don’t have to maintain 3 or more binding files for each HMI

<Binding mode="twoWay">
   <Source xsi:type="listElement">
   	<Selector xsi:type="session" refId="HMI_ID" attribute="value" />
   	<be:List xsi:type="be:opcUa" attribute="value" >
   		<bt:Element index="0" refId="::AsGlobalPV:PanelCom.HMI[1].HandFunctions.Button[17].cmd" />
   		<bt:Element index="1" refId="::AsGlobalPV:PanelCom.HMI[2].HandFunctions.Button[17].cmd" />
   		<bt:Element index="2" refId="::AsGlobalPV:PanelCom.HMI[3].HandFunctions.Button[17].cmd" />
   	</be:List>
   </Source>
   <Target xsi:type="brease" contentRefId="St25ManualsContent" widgetRefId="Manual_MomentaryPushButton17" attribute="value" />
</Binding>

Implemented the listElement + session variable approach

There is a single source of truth, no more duplicate-target errors at project open and adding content is now one edit instead of three.

con = listElement bindings are XML-text-only editing, and the HMI_ID assignment happens at runtime per-visu event binding on opcUaSystem Connected, so it’s one extra mechanism to verify on the real panels but it should work

It would be nice if mapp View offered a more native way to handle multi-client HMIs, e.g. a per-visualization constant/parameter (so each .vis could set HMI_ID directly, without an event binding), or binding sets scoped per visualization without triggering the duplicate-target check at project open.

Thank you very much @marcel.voigt!