EA HMI070LM · Goal 1 · What to change in HMIDesigner

Purpose: make the PQube3 (Modbus slave) IP address settable over USB with one command, no HMIDesigner in the field. For the Powerside HMI070 project. Last updated: 2026-09-18 15:12 PDT.

Summary. Today the slave IP is a compile-time constant in the Modbus Register editor, and IP_SLAVE is a String define (also compile-time). The change: create a string register for the slave IP, bind the Modbus master's slave address to that register, and add two tiny macros so the value survives power cycles via a flash file. After one rebuild and one deploy, every panel accepts a new IP over USB with #VSS, forever.
Will it work? Honest answer. Transport, framing, and live command execution over USB are already proven on your panel (the backlight dimmed). The single unknown is Step 1: whether HMIDesigner 2.6 lets the master's slave-address field reference a register instead of a literal. Evidence it does: the firmware's plcN(typ, adress) calculation documents slaves addressed by "MDNS (Stringregister Id)", so the master can resolve a slave from a string register. That's why I lean yes, roughly two chances in three. If Step 1 shows a literal-only field, no runtime path exists on this firmware and the answer is Goal 2 (rebuild + push), plus one email to DISPLAY VISIONS asking for register-bound slave addresses.

The change, step by step

1
Verify the binding exists (5 minutes, do this first).
Open the Powerside project in HMIDesigner 2.6. Go to Tools → Modbus Master (the master/slave definitions) and Tools → Modbus Register (the per-register map). Click into the Slave address / IP field. Look for any way to reference a register instead of typing a literal: a dropdown of registers, a "variable" toggle, an S:/R: prefix, or a right-click "bind to register". Also check whether the slave is defined once (a named slave that the register rows reference) or per row.
Yes → continue. No → stop; Goal 1 at runtime is not possible on this firmware, use Goal 2 and ask the vendor.
2
Create the string register.
Register panel → String register → New. Name it S_SLAVE_IP. Default value: the bench PQube3, 10.0.0.22. Write down its numeric ID (shown in brackets, like S_temp0 [0]). That number is what the USB command uses. Pick an unused ID, e.g. [10].
3
Bind the master's slave address to S_SLAVE_IP.
In the Modbus Master definition (or in every register row's Slave address if it's per-row, using the bulk-change dialog you already know), replace the literal IP with the reference to S_SLAVE_IP. Leave port 502, unit ID 1, timeouts as they are.
4
Make it survive power cycles. String registers live in RAM and reset to the project default at boot. Two macros fix that.
Startup macro (runs at project start, before the master connects), reads the saved IP from a flash file into the register; if the file is missing, the default stays:
#FRO </slave_ip.txt>,0
#FRA 10
#FRC
Save macro (the USB utility triggers the same thing by sending these commands itself, so this macro is optional but handy behind a touch button):
#FWO </slave_ip.txt>,0,1,64
#FWS 10
#FWC
Replace 10 with your real ID from Step 2. #FRA reads up to a newline, so the file is written with a trailing newline. If the Register editor offers a "retain / persistent" flag for registers, use that instead and skip the file macros.
5
Add an "Update" button (vendor-recommended for master-mode panels).
Place a touch button on a service screen and connect it to the HMIDesigner-provided macro M_ProjUpdateStart. It opens the interface settings so the panel accepts a project upload without touching the boot menu. Needed for uploads over Modbus/LAN; over USB it may be unnecessary, but it costs nothing.
6
Turn on field-safe encryption.
Project settings → Encryption → Individual project key. Deploy the resulting .eup once per panel at the factory. From then on, field updates ship as .eus files, which contain no project source. The .eup never leaves Powerside.
7
Rebuild and deploy once.
Deploy from HMIDesigner over the COM port, or hand the .eup to Duma to push over USB with eup_push.py.

What the field utility then does (one command)

#VSS 10,"10.0.0.22";        set the register
#FWO </slave_ip.txt>,0,1,64  persist it
#FWA "10.0.0.22\n"
#FWC
#QSR 2000,3                 reconnect the master to the new slave

Already staged as tools/set_slave_ip.py --reg 10 --ip 10.0.0.22 --reconnect. Same code becomes the Windows .exe button.

Other parameters later (port, unit ID, timeouts)

Same pattern: if the Modbus Master fields for port, unit ID, response timeout, and reconnect timeout accept register references, bind each to a numeric register (#VRI to set, persisted the same way). Check this during Step 1 while you're in the dialog. If they're literal-only, they stay compile-time and change only via Goal 2.

Verification after the change

CheckExpected
Send #VSS 10,"10.0.0.22"; then #QSR over USBPanel's Voltage screen shows the PQube3 reading (~123 V on the bench unit); Duma reads the same value from the PQube3 directly with pymodbus
Send a wrong IP, then the right oneScreen loses data, then recovers
Power-cycle the panelIP survives (file macro worked)

Sources

Unlisted page. Prepared by Duma for Sahir Mathur, 2026-09-18.