Commit Graph

662 Commits

Author SHA1 Message Date
e46e4de31f Merge pull request '[abcip] AbCip — Diagnostic / system tags as browseable variables' (#383) from auto/abcip/4.3 into auto/driver-gaps 2026-04-26 02:58:40 -04:00
Joseph Doherty
901a5b9b21 Auto: abcip-4.3 — diagnostic / system tags as browseable variables
Closes #240
2026-04-26 02:55:56 -04:00
9c108cd00a Merge pull request '[abcip] AbCip — Write deadband / write-on-change' (#382) from auto/abcip/4.2 into auto/driver-gaps 2026-04-26 02:34:27 -04:00
Joseph Doherty
da9936f7f0 Auto: abcip-4.2 — write deadband / write-on-change
Closes #239
2026-04-26 02:31:50 -04:00
9202ebe5ef Merge pull request '[abcip] AbCip — Per-tag scan rate / scan group bucketing' (#381) from auto/abcip/4.1 into auto/driver-gaps 2026-04-26 02:18:25 -04:00
Joseph Doherty
b45713622f Auto: abcip-4.1 — per-tag scan rate / scan group bucketing
Closes #238
2026-04-26 02:15:50 -04:00
e5c38a5a0e Merge pull request '[twincat] TwinCAT — Cycle-time / jitter / PLC-state diagnostics' (#380) from auto/twincat/3.2 into auto/driver-gaps 2026-04-26 02:02:36 -04:00
Joseph Doherty
24a3cda56a Auto: twincat-3.2 — cycle-time / jitter / PLC-state diagnostics
Closes #314
2026-04-26 01:59:56 -04:00
30e39a752a Merge pull request '[twincat] TwinCAT — Per-tag MaxDelay tuning' (#379) from auto/twincat/3.1 into auto/driver-gaps 2026-04-26 01:47:44 -04:00
Joseph Doherty
fb57717f6f Auto: twincat-3.1 — per-tag MaxDelay tuning
Closes #313
2026-04-26 01:45:12 -04:00
621de94126 Merge pull request '[s7] S7 — Pre-flight PUT/GET enablement test' (#378) from auto/s7/PR-S7-C5 into auto/driver-gaps 2026-04-26 01:34:27 -04:00
Joseph Doherty
64a11ef285 Auto: s7-c5 — pre-flight PUT/GET enablement test
Closes #298
2026-04-26 01:31:48 -04:00
4bc8aa2478 Merge pull request '[s7] S7 — Deadband / on-change with thresholds' (#377) from auto/s7/PR-S7-C4 into auto/driver-gaps 2026-04-26 01:17:33 -04:00
Joseph Doherty
06b39a28fa Auto: s7-c4 — deadband / on-change with thresholds
Closes #297
2026-04-26 01:14:59 -04:00
8909302929 Merge pull request '[s7] S7 — Per-tag scan group / publish rate' (#376) from auto/s7/PR-S7-C3 into auto/driver-gaps 2026-04-26 01:05:39 -04:00
Joseph Doherty
162c82b8d9 Auto: s7-c3 — per-tag scan group / publish rate
Closes #296
2026-04-26 01:03:00 -04:00
ca3d4bf581 Merge pull request '[s7] S7 — TSAP / Connection Type selector' (#375) from auto/s7/PR-S7-C2 into auto/driver-gaps 2026-04-26 00:51:44 -04:00
Joseph Doherty
3b98e4d366 Auto: s7-c2 — TSAP / Connection Type selector
Closes #295
2026-04-26 00:49:10 -04:00
bcf83bf39b Merge pull request '[s7] S7 — PDU size negotiation surfaced' (#374) from auto/s7/PR-S7-C1 into auto/driver-gaps 2026-04-26 00:38:24 -04:00
Joseph Doherty
6540bbe1ef Auto: s7-c1 — surface negotiated PDU size via DriverHealth.Diagnostics
Closes #294
2026-04-26 00:35:49 -04:00
f469cf7e0d Merge pull request '[opcuaclient] OpcUaClient — Auto re-import on ModelChangeEvent' (#373) from auto/opcuaclient/10 into auto/driver-gaps 2026-04-26 00:27:00 -04:00
Joseph Doherty
ab3ed6b6a3 Auto: opcuaclient-10 — auto re-import on ModelChangeEvent
Closes #282
2026-04-26 00:24:24 -04:00
eed5857aa9 Merge pull request '[focas] FOCAS — cnc_rdalmhistry alarm-history extension' (#372) from auto/focas/F3-a into auto/driver-gaps 2026-04-26 00:10:36 -04:00
Joseph Doherty
7f9d6a778e Auto: focas-f3a — cnc_rdalmhistry alarm-history extension
Adds FocasAlarmProjection with two modes (ActiveOnly default, ActivePlusHistory)
that polls cnc_rdalmhistry on connect + on a configurable cadence (5 min default,
HistoryDepth=100 capped at 250). Emits historic events via IAlarmSource with
SourceTimestampUtc set from the CNC's reported timestamp; dedup keyed on
(OccurrenceTime, AlarmNumber, AlarmType). Ships the ODBALMHIS packed-buffer
decoder + encoder in Wire/FocasAlarmHistoryDecoder.cs and threads
ReadAlarmHistoryAsync through IFocasClient (default no-op so existing transport
variants stay back-compat). FocasDriver now implements IAlarmSource.

13 new unit tests cover: mode switch, dedup, distinct-timestamp emission,
type-as-key behaviour, OccurrenceTime passthrough (not Now), HistoryDepth
clamp/fallback, and decoder round-trip. All 341 FOCAS unit tests still pass.

Docs: docs/drivers/FOCAS.md (new), docs/v2/focas-deployment.md (new),
docs/v2/implementation/focas-wire-protocol.md (new),
docs/v2/implementation/focas-simulator-plan.md (new),
docs/drivers/FOCAS-Test-Fixture.md (alarm-history bullet appended).

Closes #267
2026-04-26 00:07:59 -04:00
1922b93bd5 Merge pull request '[ablegacy] AbLegacy — Per-tag deadband / change filter' (#371) from auto/ablegacy/8 into auto/driver-gaps 2026-04-25 23:52:42 -04:00
Joseph Doherty
eb5286148e Auto: ablegacy-8 — per-tag deadband / change filter
Closes #251
2026-04-25 23:50:07 -04:00
69069aa3be Merge pull request '[ablegacy] AbLegacy — Array contiguous block addressing' (#370) from auto/ablegacy/7 into auto/driver-gaps 2026-04-25 23:38:40 -04:00
Joseph Doherty
c689ac58b1 Auto: ablegacy-7 — array contiguous block addressing
Closes #250
2026-04-25 23:36:01 -04:00
05528bf71c Merge pull request '[abcip] AbCip — Logical-blocking / non-blocking strategy selector' (#369) from auto/abcip/3.3 into auto/driver-gaps 2026-04-25 23:18:47 -04:00
Joseph Doherty
01f4ee6b53 Auto: abcip-3.3 — read-strategy selector (WholeUdt / MultiPacket / Auto)
Closes #237
2026-04-25 23:16:06 -04:00
8a8dc1ee5a Merge pull request '[abcip] AbCip — Symbolic vs logical (instance-ID) addressing toggle' (#368) from auto/abcip/3.2 into auto/driver-gaps 2026-04-25 23:01:13 -04:00
Joseph Doherty
0c6a0d6e50 Auto: abcip-3.2 — symbolic vs logical addressing toggle
Closes #236
2026-04-25 22:58:33 -04:00
73ff10b595 Merge pull request '[abcip] AbCip — Configurable CIP Connection Size per device' (#367) from auto/abcip/3.1 into auto/driver-gaps 2026-04-25 22:41:51 -04:00
Joseph Doherty
f6c26db609 Auto: abcip-3.1 — configurable CIP connection size per device
Closes #235
2026-04-25 22:39:05 -04:00
7cbddd4b4a Merge pull request '[twincat] TwinCAT — Symbol-version invalidation listener' (#366) from auto/twincat/2.3 into auto/driver-gaps 2026-04-25 22:18:47 -04:00
Joseph Doherty
4098d72bbb Auto: twincat-2.3 — symbol-version invalidation listener
Closes #312
2026-04-25 22:16:05 -04:00
569001364f Merge pull request '[twincat] TwinCAT — Handle-based access with caching' (#365) from auto/twincat/2.2 into auto/driver-gaps 2026-04-25 22:06:01 -04:00
Joseph Doherty
b67eb6c8d0 Auto: twincat-2.2 — handle-based access with caching
Closes #311
2026-04-25 22:03:20 -04:00
4a071b6d5a Merge pull request '[twincat] TwinCAT — ADS Sum-read / Sum-write' (#364) from auto/twincat/2.1 into auto/driver-gaps 2026-04-25 21:46:21 -04:00
Joseph Doherty
931049b5a7 Auto: twincat-2.1 — ADS Sum-read / Sum-write
Closes #310
2026-04-25 21:43:32 -04:00
fa2fbb404d Merge pull request '[s7] S7 — Block-read coalescing for contiguous DBs' (#363) from auto/s7/PR-S7-B2 into auto/driver-gaps 2026-04-25 21:25:56 -04:00
Joseph Doherty
17faf76ea7 Auto: s7-b2 — block-read coalescing for contiguous DBs
Closes #293
2026-04-25 21:23:06 -04:00
5432c49364 Merge pull request '[s7] S7 — Multi-variable PDU packing' (#362) from auto/s7/PR-S7-B1 into auto/driver-gaps 2026-04-25 21:06:55 -04:00
Joseph Doherty
d7633fe36f Auto: s7-b1 — multi-variable PDU packing
Replaces the per-tag Plc.ReadAsync loop in S7Driver.ReadAsync with a
batched ReadMultipleVarsAsync path. Scalar fixed-width tags (Bool, Byte,
Int16/UInt16, Int32/UInt32, Float32, Float64) are bin-packed into ≤18-item
batches at the default 240-byte PDU using S7.Net.Types.DataItem; arrays,
strings, dates, 64-bit ints, and UDT-shaped types stay on the legacy
ReadOneAsync path. On batch-level failure each tag in the batch falls
back to ReadOneAsync so good tags still produce values and the offender
gets its per-item StatusCode (BadDeviceFailure / BadCommunicationError).

100 scalar reads now coalesce into ≤6 PDU round-trips instead of 100.

Closes #292
2026-04-25 21:04:32 -04:00
69d9a6fbb5 Merge pull request '[opcuaclient] OpcUaClient — Method node mirroring + Call passthrough' (#361) from auto/opcuaclient/9 into auto/driver-gaps 2026-04-25 20:55:09 -04:00
Joseph Doherty
07abee5f6d Auto: opcuaclient-9 — method node mirroring + Call passthrough
Adds the 9th capability interface (IMethodInvoker) so the OPC UA Client
driver can mirror upstream OPC UA Method nodes into the local address
space and forward Call invocations as Session.CallAsync. Method-bearing
servers (e.g. ProgramStateMachine, Acknowledge / Confirm methods, custom
control surfaces) now show up downstream instead of being silently
filtered out.

- Core.Abstractions: IMethodInvoker + MethodCallResult; default no-op
  IAddressSpaceBuilder.RegisterMethodNode + MirroredMethodNodeInfo +
  MethodArgumentInfo. Default impls keep tag-based drivers and existing
  builders compiling without forced overrides.
- OpcUaClientDriver: BrowseRecursiveAsync now lifts the Method node-class
  filter; for each method it walks HasProperty to pick up InputArguments
  + OutputArguments and decodes the Argument extension objects into
  MethodArgumentInfo. Status-codes pass through verbatim (cascading
  quality), local NodeId-parse + lost-session faults surface as
  BadNodeIdInvalid / BadCommunicationError.
- 7 new unit tests cover the capability surface, the DTO shapes, and the
  back-compat default no-op for RegisterMethodNode. Suite green at
  160/160.

Server-side OnCallMethod dispatch (wiring local MethodNode handlers to
IMethodInvoker.CallMethodAsync inside DriverNodeManager) is deferred to
a follow-up — the driver-side surface + browse mirror ship cleanly here.

Closes #281

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-25 20:52:39 -04:00
0f3abed4c7 Merge pull request '[opcuaclient] OpcUaClient — Type definition mirroring' (#360) from auto/opcuaclient/8 into auto/driver-gaps 2026-04-25 20:40:49 -04:00
Joseph Doherty
cc21281cbb Auto: opcuaclient-8 — type definition mirroring
Adds an opt-in pass-3 walk of the upstream TypesFolder (i=86) so the OPC UA
Client driver can mirror upstream type definitions into the local address
space. Honours the curation rules from PR-7 (#359). Structural mirror only —
binary-encoding priming via LoadDataTypeSystem is tracked as a follow-up
because that helper was removed from the public ISession surface in
OPCFoundation.NetStandard 1.5.378+.

- IAddressSpaceBuilder.RegisterTypeNode (default no-op for back-compat)
- MirroredTypeNodeInfo + MirroredTypeKind in Core.Abstractions
- OpcUaClientDriverOptions.MirrorTypeDefinitions (default false)
- DiscoverAsync pass-3: FetchTypeTreeAsync + recursive HasSubtype walk per
  branch (ObjectTypes/VariableTypes/DataTypes/ReferenceTypes), best-effort
  IsAbstract read, IncludePaths/ExcludePaths still applied
- 6 new unit tests; all 153 OpcUaClient unit tests pass

Closes #280
2026-04-25 20:38:17 -04:00
5e164dc965 Merge pull request '[opcuaclient] OpcUaClient — Selective import + namespace remap' (#359) from auto/opcuaclient/7 into auto/driver-gaps 2026-04-25 20:23:14 -04:00
Joseph Doherty
02d1c85190 Auto: opcuaclient-7 — selective import + namespace remap
Adds OpcUaClientCurationOptions on OpcUaClientDriverOptions.Curation with:
- IncludePaths/ExcludePaths globs (* and ? only) matched against the
  slash-joined BrowsePath segments collected during BrowseRecursiveAsync.
  Empty Include = include all so existing deployments are unaffected;
  Exclude wins over Include. Pruned folders are skipped wholesale, so
  descendants don't reach the wire.
- NamespaceRemap (URI -> URI) applied to DriverAttributeInfo.FullName when
  registering variables. Index-0 / standard nodes round-trip unchanged;
  remapped nodes serialise via ExpandedNodeId so downstream clients see
  the local-side URI.
- RootAlias replaces the hard-coded "Remote" folder name at the top of
  the mirrored tree.

Closes #279
2026-04-25 20:20:47 -04:00