Skip to Content
Getting startedConcepts

Concepts

Almost every CMS setup combines the same few objects. Understanding this chain answers most usage questions.

Application

Represents an integrated system (ERP, MES, WMS, scale, PLC…). It has a short code — used in URLs and reports — and is the grouping unit of the system: interfaces, definitions, tokens, alerts and reports are always organized by Application.

The Application is also the availability monitoring unit: CMS checks its connection in cycles (keep-alive), records online/offline periods and produces the uptime report.

The selector at the top of the screen sets the Application in focus: pick one and the screens show only what belongs to it, and that choice follows you across screens.

Ticket tools (Help Desk) are Applications too, in a category of their own. They show up in Interfaces, Message Definition and the Messages filters, but stay out of the Application in focus selector and out of the shop-floor configuration screens.

Interface

A processing interface. It defines how messages in that flow are consumed:

  • Sequential — one message at a time, preserving arrival order.
  • Parallel — several messages at once, with configurable concurrency.

An Interface can be blocked (manually or automatically by a business error rule). While blocked, messages keep arriving but are not delivered — which avoids firing hundreds of errors at a destination system already known to be down.

Delivery Definition

The delivery contract: where the message goes and how.

Delivery type

Defines the protocol used to deliver the message to the destination:

TypeWhat it does
HTTP_POSTSends the payload by POST to the destination endpoint — the most common case
HTTP_PUTSends by PUT, for REST APIs that expect the resource to be replaced
HTTP_PATCHSends by PATCH, for partial updates of the resource
HTTP_DELETECalls the endpoint by DELETE, to remove the resource
HTTP_SOAPBuilds and sends the SOAP envelope to the destination web service
MQTT_PUBLISHPublishes the payload to an MQTT broker topic
SQL_SERVER_EXECRuns a command or procedure on the destination SQL Server
ORACLE_EXECRuns a command or procedure on the destination Oracle
POSTGRES_EXECRuns a command on the destination PostgreSQL
SQLITE_EXECRuns a command on the destination SQLite database — the connection’s .db file
INFLUXDB_WRITEWrites points into a time series on the target InfluxDB
MONGODB_WRITEWrites the message as a document into a MongoDB collection — inserting, or updating an existing document
SAP_RFC_CALLCalls a function module / BAPI in SAP with the message data
OPC_UA_WRITEWrites values to OPC UA server tags (goes through the write gate)
MODBUS_WRITEWrites values to Modbus TCP registers (goes through the write gate)
PI_WEB_API_WRITEWrites values to PI System tags (AVEVA/OSIsoft)
SPARKPLUG_CMDPublishes a command on the Sparkplug B namespace, over the same MQTT connection
FILE_WRITEWrites the content to a file in the directory configured on the connection

Fields common to every type

FieldWhat it defines
CodeIdentifier of the definition, unique across the whole system — not just within the Interface. It goes into the receiving URL, so changing it later breaks existing integrations
Application and InterfaceWho the definition belongs to and which interface the messages go through
Message typeASSINCRONA — persists, queues and replies immediately; SINCRONA — waits for the destination before replying to the caller
Receiving URLPublic address generated for this definition: POST /api/{interface-code}/{definition-code}
Content-TypeHeader used when sending to the destination (default application/json)
Validate Content-TypeWhen enabled, rejects messages whose content type does not match the expected one
EncodingEncoding of the sent body (default UTF-8)
Maximum payload sizeLimit accepted on reception; above it the message is rejected
Message decodingConverts the body before processing: NENHUM, BASE64, XML_UNESCAPED, URL_ENCODED, HEX, CHARSET_LATIN1, HTML_ENTITIES
TransformerScript applied to the payload before delivery (optional)
Content TemplateText with {{alias}} that replaces the payload as the delivered content (optional). Resolves against the Transformer output
Send timeoutSeconds to wait for the destination response before calling it a failure (default 30)
Maximum retriesHow many times to retry a technical failure (default 3). The system waits 10 seconds between attempts
Destination credentialCredential used to authenticate the outbound call
Forward responseWhen enabled, returns to the caller the response the destination gave
Enable WebService (WSDL)Publishes the SOAP endpoint with a dynamic WSDL for this definition
WS-Security HeaderAccepts UsernameToken authentication inside the SOAP envelope
Expose as MCP toolLets an AI agent call this Delivery, through the MCP integration server
ActiveTurns the definition off without deleting it — it stops receiving messages

Fields by delivery type

TypeType-specific fields
HTTP_POST · HTTP_PUT · HTTP_PATCH · HTTP_DELETEDestination host and URI that make up the address called
HTTP_SOAPDestination host, URI and the web service SOAP Action
MQTT_PUBLISHQoS — 0 (at most once) or 1 (at least once). The broker comes from the destination application’s connection
SQL_SERVER_EXEC · ORACLE_EXEC · POSTGRES_EXEC · SQLITE_EXECSQL command run on the destination database. The :payload, :datetime and :transformer placeholders become bound parameters, never concatenated text
SAP_RFC_CALLFunction/BAPI name, the IMPORT and TABLES parameter mapping, the expected input payload (with required fields) and commit after the call — many write BAPIs require an explicit commit
OPC_UA_WRITEWrite tags (alias → NodeId), plus the optional gate: trigger tag and value that release the write, and the value written afterwards
MODBUS_WRITEWrite tags (alias → table and address), plus the optional gate: trigger table, address and value, and the value written afterwards
PI_WEB_API_WRITEWrite tags (alias → PI path), timestamp source (now or a payload field) and the write mode
INFLUXDB_WRITEMeasurement, column mapping (each alias becomes a tag or a field), precision, timestamp source and the target bucket
MONGODB_WRITETarget collection, write mode (insert one, insert batch, update or create, update only), the key fields in the modes that match an existing document, and the write timestamp field
FILE_WRITEFile path inside the base directory, write mode (create new or append), encoding and atomic write
SPARKPLUG_CMDGroup, Edge Node and Device of the namespace, and the command metrics (alias → metric name and type)

For write tags, the message producer sends a flat object {alias: value} — it does not need to know the PLC’s internal NodeIds or addresses, only the aliases configured here. Each message may carry just a subset of the aliases: whatever arrives is what gets written.

Collector Definition

The mirror image of the Delivery Definition: instead of waiting for someone to send, CMS goes and fetches.

Collector type

Defines where the data comes from and how it is obtained:

TypeWhat it does
HTTP_GET / HTTP_POSTCalls an external endpoint on a schedule
MQTT_TOPIC_SUBSCRIBERSubscribes to an MQTT topic and reacts to each publication
SQL_SERVER / ORACLE / POSTGRES / SQLITERuns a query and turns the result into messages
SAP_RFCCalls a function module / BAPI in SAP
SAP_IDOCReceives IDocs pushed by SAP
OPC_UA_TRIGGERWatches an OPC UA tag and fires when it changes
MODBUS_TRIGGER / MODBUS_POLLWatches a change or polls Modbus TCP registers
INFLUXDBRuns a Flux, InfluxQL or SQL query against a time series
MONGODBReads documents from a collection by filter (find) or pipeline (aggregate)
SPARKPLUG_SUBSCRIBERSubscribes to a Sparkplug B namespace and receives births and metric changes
PI_WEB_APIReads PI System tags: current value, recorded, interpolated or summary
FILE_WATCHWatches a directory and turns each arriving file into a message

Fields common to every type

FieldWhat it defines
CodeIdentifier of the collector, unique across the whole system. It goes into the dynamic collector API URL
Application and InterfaceWho the collector belongs to and which interface the result goes through
ForwardingsThe destination Interfaces/Definitions the collected payload flows to. A single collector can feed several destinations
Input parametersFields an external producer can send to POST /api/collect/{interface}/{collector}, which the collector uses to build the fetch. With them, the collector runs on demand
Enable WebService (WSDL)Publishes the same dynamic API in SOAP as well, through the ExecutarColeta operation. Requires input parameters
Expose as MCP toolLets an AI agent run this collector, through the MCP integration server. Requires input parameters
TransformerScript applied to the collected payload, before forwarding (optional)
Maximum retriesHow many times to retry a failure (default 3), waiting 10 seconds between attempts
ActiveTurns the collector off without deleting it — stops the schedule or the subscription
Last execution resultStatus, timestamp and error message of the last fetch. Applies only to pull types: event-driven types have a real-time connection status instead

The frequency of pull types belongs to the Interface (interval in milliseconds or a cron expression), not to the Collector. Turning it on and off, and running it now, live on the Schedulers screen.

Fields by collector type

TypeType-specific fields
HTTP_GET · HTTP_POSTSource URL, fixed parameters, payload template (for POST), source credential, send content type and collection timeout (default 30 s)
MQTT_TOPIC_SUBSCRIBERBroker external connection, subscribed topic and QoS
SQL_SERVER · ORACLE · POSTGRES · SQLITEExternal connection, SELECT query, result mode, key column and post-collection command — the command that marks as read what was just fetched
SAP_RFCExternal connection, function/BAPI name, the IMPORT and TABLES parameter mapping, and the input variables that come from outside
SAP_IDOCExternal connection (the listener) and the IDoc type, message type and partner filters that decide which IDocs this collector receives
OPC_UA_TRIGGERExternal connection, trigger NodeId and value that fire the collection, read tags (alias → NodeId) and the reset after reading — the value written back to the trigger tag to consume the signal
MODBUS_TRIGGER · MODBUS_POLLExternal connection, trigger table, address and value, read tags (alias → table and address), polling interval, reset after reading and emit only if changed
INFLUXDBExternal connection, query, language (Flux, InfluxQL or SQL) and the bucket/database for this collector
MONGODBExternal connection, operation (find or aggregate), collection, filter or pipeline in JSON, projection, sort, document limit, payload format and the post-collection command that marks the documents read
SPARKPLUG_SUBSCRIBERExternal connection (the broker), group, Edge Node and Device subscribed, and whether it requests a rebirth on connect
PI_WEB_APIExternal connection, tags read, read mode (current value, recorded, interpolated or summary), time window, interval and the emission mode
FILE_WATCHExternal connection (the base directory), subfolder, file mask, encoding, emission mode and the action after reading — move, rename or leave as is

The result mode of SQL queries decides the granularity: LINHA_UNICA_PAYLOAD_UNICO (the whole result becomes one message) or UMA_LINHA_POR_PAYLOAD (each row becomes its own message).

Transformer

Sandboxed JavaScript (node:vm inside worker_threads, in an isolated pool) that takes a payload and returns another: JSON ↔ XML, field remapping, aggregate calculation.

The same Transformer is reusable in Delivery Definitions and Collectors. It can be written by hand in the Monaco editor or generated by AI from an input sample, an output sample and a prompt — with generation history and explicit approval before it goes live.

On a Delivery that receives from several systems in different formats, each producer Application can have a Transformer of its own, which converts that producer’s format into the Delivery’s and runs before the Delivery Transformer — see Transformer by producer Application.

External Connection

Reusable connection settings, with a test connection button. Collectors and Deliveries point at a Connection instead of repeating host/port/user in every configuration.

CategoryAvailable types
DatabasesSQL Server, Oracle, PostgreSQL (includes TimescaleDB), SQLite, InfluxDB, MongoDB (includes Atlas, Azure Cosmos DB and AWS DocumentDB)
Shop floorOPC UA, MQTT (includes Sparkplug B), Modbus TCP, PI Web API
SAPSAP RFC / BAPI, SAP IDoc, SAP Gateway (OData), SAP CPI (Cloud Integration)
FilesWatched and written directory

The connection type linked to the Application decides which Collector and Delivery types are available in it — an Application with a MongoDB connection, for instance, only offers the MONGODB Collector and the MONGODB_WRITE Delivery.

Variables

Reusable values that go into Collector, Delivery and Transformer settings through {{name}} — addresses, plant codes, names that change from one environment to another. They come in two scopes: Global (valid across the CMS) and Per Application (valid only inside it). When the same name exists in both, the Application value wins.

They exist to pull out of each configuration whatever changes between environments: what differs from development to production lives in one place, instead of scattered across dozens of definitions.

Credential

Authentication used on outbound calls (HTTP/SOAP): basic, bearer, header token, WS-Security. Stored encrypted at rest and never returned by the API.

Plain REST integrations do not need a dedicated adapter: use HTTP_GET/HTTP_POST + Credential + Transformer. The native adapters (SAP, OPC UA, Modbus, MongoDB…) exist only because those protocols are not HTTP.

How it all fits together

Application (MES) └── Interface (MES_PALLET) ← ordering, concurrency, blocking ├── Definition (AnyToMES_Pallet) ← destination, timeout, retries, transformer │ ├── Credential ← how to authenticate at the destination │ └── Transformer ← how to convert the payload └── Collector (SAP_ProdOrder) ← external source + forwardings └── External Connection ← host/port/user for SAP, MQTT, OPC UA…