Files
Marc Schier 87012a147f Machinery: add bounded inspection and result transfers (#4804)
# Description

- Add opt-in bounded browsing and strict reads with original source,
status, timestamp, and structured-value evidence. Preserve the existing
tolerant constructors and convenience projections, and wire options
through session extensions, factories, and hosting registration.
- Add selected-result streaming downloads with byte/request limits and
independent cleanup, using `TemporaryFileTransferClient.CopyToAsync`
from the client/server predecessor. Retain the detailed transfer
regressions in the Machinery test layer.
- Expose genuinely null unpublished result slots, carry the two
Machinery sample updates, and include the complete Machinery guide and
package README changes.

## Related Issues

- Related tracking issue: #4461; this extraction does not close it.
- Frozen source PR: #4462; this extraction does not close or modify it.
- Immediate predecessor: #4803 (`marcschier-extract-amb-changes`). The
earlier dependencies are client/server #4802 and core/types #4801.

## Checklist

_Put an `x` in the boxes that apply. You can complete these step by step
after opening the PR._

- [ ] I have signed the
[CLA](https://opcfoundation.org/license/cla/ContributorLicenseAgreementv1.0.pdf)
and read the
[CONTRIBUTING](https://github.com/OPCFoundation/UA-.NETStandard/blob/master/CONTRIBUTING.md)
doc.
- [ ] I have added tests that prove my fix is effective or that my
feature works and increased code coverage.
- [x] I have added all necessary documentation.
- [x] I have verified that my changes do not introduce (new) build or
analyzer warnings.
- [ ] I ran **all** tests locally using the **UA.slnx** solution against
at least .net **framework** and .net **10**, and all passed.
- [ ] I fixed **all** failing and flaky tests in the CI pipelines and
**all** CodeQL warnings.
- [ ] I have addressed **all** PR feedback received.
2026-10-16 12:24:35 +02:00
..

MachineryServer

A self-contained OPC UA server that publishes one simulated hydraulic press using every part of the OPC 40001 series.

dotnet run --project samples/Machinery/MachineryServer -- --port 62546

What the address space contains

The press is Organizes-referenced from the OPC 40001-1 Machines folder — which hangs off Objects, not off the Device Integration DeviceSet. Below it:

Part What the sample builds
40001-1 Identification, Monitoring (item state, operation mode, health, process, consumption), Components with one component and its lifetime counters, MachineryEquipment with one die, Notifications, OperationCounters
40001-2 HydraulicOilTemperature, a process value over PADIM's analog-signal model, with limits and a setpoint
40001-3 JobManagement, whose eleven job verbs come from the ISA-95 Job Control V2 model and bind to the in-memory provider
40001-4 CompressedAirSupply, tied to the well-known CompressedAir carrier with the Energy model's Contains reference
40001-101 ResultManagement, including the ResultTransfer download path

What the simulation does

PressSimulation runs one stroke every four seconds. Each stroke moves MachineryItemState to Executing and back, sets MachineryOperationMode to Processing, and publishes a result whose CSV payload a client downloads through GenerateFileForRead.

State only ever moves from the server: OPC 40001-1 declares no cause method on either state machine — the whole Machinery NodeSet contains no method at all — so a client observes state and cannot request it.

Where the numbers come from

PressDatasheet holds every published value, so the address space and the simulation cannot disagree.