Skip to content

Configuration file

Almost everything you need day to day is reachable from the viewer: interfaces, signals, profiles, recording. This page is for the rest — the settings that only exist in the configuration file, and the exact field names and defaults behind the dialogs.

CONNECT reads two files:

FileLocationHolds
connect-config.json%PROGRAMDATA%\realvirtual\CONNECT\Everything about your plant: interfaces, signals, bridges, profiles, recording, update preference
appsettings.jsonnext to the executableHow the process itself is hosted: port binding, API key, allowed origins, log level

The split matters when you move an installation: connect-config.json is the one worth backing up and carrying over. appsettings.json belongs to the machine it runs on.

Not everything needs a restart, and knowing which is which saves a lot of unnecessary downtime.

ChangeTakes effect
Interface, signal, bridge and profile changesImmediately — the affected worker restarts on its own
InfluxDb settingsImmediately
McpAllowWrite, McpClientRemoteAllowedImmediately — both are read per tool call
McpEnabledAt the next gateway start — it decides whether the endpoints are served at all
WebSocket portAt the next gateway start
Anything in appsettings.jsonAt the next gateway start

These sit at the top level of connect-config.json.

FieldDefaultWhat it does
WebSocket.Port5100Port for the REST API, the WebSocket and the MCP endpoint. Change it if 5100 is taken.
WebSocket.PublishIntervalMs10How often changed signals are pushed to connected viewers. Raising it lowers network load at the cost of a less smooth picture.
McpEnabledtrueServes the MCP and WebViewer bridge endpoints, which is what lets realvirtual WEB and AI clients talk to the gateway.
McpAllowWritetrueLets those clients change signals rather than only read them.
McpClientRemoteAllowedfalseAllows non-loopback clients on the MCP endpoint. Leave it off unless you deliberately want remote tool access — see Remote access.
ActiveProfile(empty)Name of the profile the current live configuration came from.
SchemaVersion(set by CONNECT)Tells CONNECT which config generation this file is. Do not set it by hand.
Update.EnabledtrueWhether this installation offers updates at all. When off, the update endpoints refuse — it is a real switch, not a hidden button.
Update.Channel(empty)stable or beta. Empty means the channel this build came from, which is what keeps an installed beta from being compared against stable forever.

Recording lives under InfluxDb and is documented with its own table in Data recording.

Every entry in Interfaces describes one connection to a controller. These fields apply to all protocols:

FieldDefaultWhat it does
IdYour name for the interface. Bridges and mappings refer to it, so keep it stable.
TypeProtocol, for example OpcUa, S7, MQTT, TwinCat, Modbus.
EnabledtrueSet to false to keep a configured interface without connecting it.
UpdateCycleMs50How often the interface polls. The floor for how fresh values are.
ReconnectDelaySec10Wait between reconnect attempts after a connection drops.
AllowWebToPlcfalseSecurity gate. While off, values written from the browser are accepted and discarded instead of reaching the controller. Turn it on deliberately, per interface, and only where the browser is meant to command the machine.

Connection fields depend on the protocol: Endpoint for OPC UA, IpAddress plus Rack and Slot for S7, BrokerUrl for MQTT. Protocols with more settings carry their own block, listed below.

Set on the interface itself rather than in a nested block:

FieldDefaultWhat it does
SubscriptionPublishingIntervall20Publishing interval in milliseconds — the floor for push latency on subscribed nodes.
MaxNotificationsPerPublish50Cap of notifications per response. 0 uses the server default.
MaxNumberOfNodesPerSubscription0Nodes bundled into one subscription; further subscriptions are created beyond it. 0 means one subscription for everything.

Block TwinCat:

FieldDefaultWhat it does
NetIdAMS Net ID of the target system.
AdsPort851ADS port. 851 is the first PLC runtime.
ModeSumCommandRead strategy. Sum commands batch many symbols into one request.
MaxSubCommands1000Symbols per sum command.
RouteHostIp(empty)IP used for the ADS route when it cannot be derived.
UseEmbeddedRoutertrueUses the built-in router, so no TwinCAT installation is required on the gateway machine.
RouterLocalNetId(empty)Local Net ID of the embedded router.
WriteAllInputsOnStartfalseWrites all inputs once at startup.
ReadAllOutputsOnStartfalseReads all outputs once at startup.
RegExImportSignals(empty)Regular expressions selecting which symbols to import.
RegExSkipSignals(empty)Regular expressions excluding symbols.
RegExSymbolIsInput(empty)Regular expressions marking symbols as inputs when the direction cannot be derived.

Block Modbus:

FieldDefaultWhat it does
HostAddress of the Modbus device.
Port502TCP port.
UnitId1Slave or unit identifier.
IsServerfalseRun as server instead of client, so a PLC can connect to CONNECT.
WordOrderABCDByte order for multi-register values. Wrong order is the usual cause of nonsensical numbers.
TransportTcpTransport variant.

Block EthernetIp:

FieldDefaultWhat it does
GatewayAddress of the PLC.
Path1,0CIP routing path to the CPU.
PlcTypeControlLogixPLC family.
TimeoutMs5000Request timeout.

The native Data Layer connection uses block CtrlXDataLayer:

FieldDefaultWhat it does
AddressAddress of the ctrlX CORE.
Port443HTTPS port.
Username, Password(empty)Credentials for the device.
AllowUntrustedCertificatefalseAccepts a self-signed certificate. Convenient on a test bench, unwise in production.
PublishIntervalMs100Push interval for subscribed nodes.
SamplingIntervalUs0Sampling interval in microseconds. 0 uses the device default.
KeepaliveIntervalMs60000Keepalive interval.
ErrorIntervalMs10000Wait before retrying after an error.
QueueSize100Node queue depth.
QueueBehaviourDiscardOldestWhat happens when the queue is full.
ValueChangeStatusValueWhich changes count as a change worth publishing.
UseStatelessSubscriptionfalseStateless subscription mode.
MaxSubscriptionNodes500Nodes per subscription.
BrowseRootPaths(empty)Restricts browsing to these subtrees, which keeps import manageable on a large device.
StableConnectionSec30How long a connection must hold before it counts as stable.
TokenTtlMinutes10Lifetime of the acquired access token.

The bridge tunnel variant uses block CtrlX with Address, UseSsl (true), Username, Password, BridgePath (/ctrlx-rv-bridge/ws), DirectPort (8080) and TokenTtlMinutes (10).

Block Keba:

FieldDefaultWhat it does
HostAddress of the controller.
HttpPort80HTTP port.
WsPort8080WebSocket port.
Username, Password(empty)Credentials.
ImportRootPathsSYSSubtrees offered for import.
CycleTimeMs100Polling cycle.
UseOnChangetrueTransmits on change instead of every cycle.

Block Festo:

FieldDefaultWhat it does
HostAddress of the controller.
Port41100Port.
UseTlsfalseEncrypts the connection.
Username, Password(empty)Credentials.
UseSubscriptiontrueSubscribes instead of polling.
SubscriptionCycleMs100Subscription cycle.

Two mechanisms move values from one interface to another. Both are configured in the viewer; the fields are listed here for completeness.

Mirrors copies all signals of a source interface into an output sink — MQTT or shared memory. Names stay identical.

FieldDefaultWhat it does
EnabledtrueSwitches the rule off without deleting it.
SourceInterfaceIdInterface whose signals are mirrored.
TargetInterfaceIdSink interface. Must be MQTT or shared memory.
SignalPattern*Glob filter on signal names, so you can mirror a subset.
TopicPrefix(empty)MQTT only: prefix in front of the signal name to form the topic.

Mappings connects one signal to one other signal, across any two interfaces.

FieldDefaultWhat it does
EnabledtrueSwitches the mapping off.
SourceSignalSignal that is read.
DestSignalSignal that is written.
CoercionStrictStrict requires the same value kind. Coerce allows the safe widenings (bool↔int, int→float) and still rejects the ambiguous ones.

Feedback loops are suppressed: a value written by a mapping is tagged, so mapping A→B and B→A does not oscillate. A mapping that targets a real controller still obeys that interface’s AllowWebToPlc.

A profile is a named snapshot of interfaces, mirrors and mappings. Switching profiles writes the current set back into the previously active profile first, so switching never loses configuration.

FieldWhat it does
NameName of the profile.
ModelOptional GLB model name. When a model of that name becomes active, this profile is activated with it — so a model always runs with the configuration it belongs to. The models/ prefix and the .glb ending are ignored when matching.
Interfaces, Mirrors, MappingsThe snapshot itself.

appsettings.json sits next to the executable and controls the process rather than the plant.

FieldDefaultWhat it does
Urlshttp://0.0.0.0:5100Address the gateway binds to. 0.0.0.0 accepts connections from the network; 127.0.0.1 restricts it to the local machine.
ApiKey(empty)Key required by every route except /health. The access rule is loopback client or valid key, so a local viewer keeps working while remote access needs the key.
Dev.ApiKey(empty)Second key, for remote development only. Leave empty unless you develop realvirtual WEB across two machines — it also needs the tray switch Allow remote access (dev), and it grants more than ApiKey does, including running the test command on this PC.
AllowedOrigins["*"]Browser origins allowed to call the API. Narrow this when the gateway is reachable beyond the local machine.
Logging.LogLevel.DefaultInformationRaise to Debug while chasing a problem, lower to Warning for quiet operation.