Serdar Gökay created CAMEL-26376:
------------------------------------
Summary: camel-mtconnect - New component to read machine tools
through their MTConnect agent
Key: CAMEL-26376
URL: https://issues.apache.org/jira/browse/CAMEL-26376
Project: Camel
Issue Type: New Feature
Reporter: Serdar Gökay
MTConnect (ANSI/MTC1.4-2018) is the open standard machine tool vendors ship for
reading their machines: a read-only HTTP agent that answers {{probe}} (device
model), {{current}} (latest values), {{sample}} (a range or an open stream of
observations) and {{assets}} (cutting tools, NC programs) with XML documents.
Mazak, Okuma, DMG MORI, Haas, Makino and the Fanuc and Siemens adapters ship or
support such an agent; it is the machine tool counterpart of OPC UA, and the
two are what a CNC speaks to the outside. Camel has {{camel-milo}} for OPC UA
and nothing for MTConnect, and the Kamelet catalog has nothing either.
*Where it sits.* A machine tool integration is: the machine's agent on one
side, and on the other side whatever the plant runs, an MES or ERP (job and
tool status, SAP PM/PP), a broker or unified namespace (MQTT, Kafka), a
historian or database, condition monitoring and OEE. Camel already has every
component for the second side. This component is the missing first side: it
turns the agent's protocol into ordinary Camel messages, one per observation,
with the device, component, data item, units, sequence and quality on the
message, so the rest of the route is plain Camel.
*Why a component and not a route.* We first built it as a route: {{http}} +
{{timer}} + a Groovy script of about 140 lines holding the state machine
(probe, current, {{sample?from=}}, {{OUT_OF_RANGE}} resynchronisation,
{{instanceId}} re-probe, per-item {{Bad}} quality on timeouts). It worked
against the same agents, and showed why it does not belong in a route:
* The agent's streaming {{sample}} answer is a multipart stream that never
ends; {{camel-http}} reads a response as a whole, so a route can only poll.
Polling adds a round trip per interval per machine and the latency of the
interval; streaming delivers each observation as it happens on one open
connection.
* The protocol's correctness is in the details a route hides in a script: the
sequence cursor across outages, the buffer overrun ({{OUT_OF_RANGE}}, HTTP 400
on 2.x agents but 200 on 1.x agents), the agent restart, the probe metadata
that every observation needs, the asset changes a lost event can hide,
{{UNAVAILABLE}} versus unreachable. Each machine, each integration repeats and
re-debugs the same 140 lines; a component carries them once, with 104 tests.
* A script in a route is invisible to Camel's tooling: the catalog cannot
validate the options, the docs cannot describe the headers, Camel JBang and the
MCP tools cannot explain it to a developer or an agent. As a component every
option and header is declared and documented.
This issue proposes a new component {{camel-mtconnect}} (scheme {{mtconnect}}),
consumer and producer:
* Consumer: runs the protocol against one agent (probe, current, then the
streaming sample request, or polling with {{streaming=false}}), one message per
observation with the value as body and the MTConnect metadata (device,
component, data item, category, type, units, sequence, timestamp, quality) as
{{CamelMTConnect*}} headers. It keeps the sequence cursor across outages,
resynchronises from {{current}} on {{OUT_OF_RANGE}}, re-reads the device model
when the agent's {{instanceId}} changes, reports an unreachable agent once per
data item with quality {{Bad}}, and with {{assets=true}} also delivers the
agent's assets and their changes.
* Producer: {{operation=probe|current|sample|assets}} with the request
parameters as options or headers; the device model and asset documents are
returned as the agent's XML, observations as a list of maps with the same
fields as the consumer's headers.
* TLS through {{sslContextParameters}} (and the global SSL context parameters),
gzip for document answers.
* Implementation on the JDK HTTP client, no third-party dependency; documents
parsed with StAX by local name (schemas 1.3 to 2.5 and vendor namespaces), DTDs
and external entities disabled.
The code is complete and tested: 104 unit tests against an in-process stub
agent (two agent dialects, outages, overrun, restart, TLS, compression, assets,
polling), and live runs against a cppagent 2.8 (the reference implementation),
Mazak 1.4 and 1.6 vendor agents and demo.mtconnect.org over https. A pull
request follows this issue. We (Etzel) run the component in production
integrations and will maintain it.
--
This message was sent by Atlassian Jira
(v10.3.26#10030026)