ModelingEvolution.RocketWelder.StationManagement 0.1.0-preview.81feef9
ModelingEvolution.RocketWelder.StationManagement
rw2 as one piece of a station environment (epic-107, docs/epics/epic-107-station-twin/). Built on
ModelingEvolution.StationManagement — the foundation that knows containers, networks and waits, and no domain nouns.
This package is a client of rw2: of its container image and of its published REST language. It references no rw2 application project, and no vendor or simulator package.
await using var host = await StationHost.Start("pamet-01"); // one station = one network, fixed IPs
var store = await host.EventStore("rw2-store", reachableFromHost: true);
var rw = await host.RocketWelder("2.21.34", store, simulatorTrack: true, sinkPorts: [17002]);
// ↑ always a container; add build: "../rocket-welder2/bin/Debug" to mount the branch under test over /app
var fr20 = await rw.Devices.Ensure(real.Robot("FR20").SimulatedBy(Simulator.Robot, sim));
await rw.Devices.Ensure(real.Track("7th Axis").SimulatedBy(Simulator.Track, sim)
.Keeping(x => x.Travel, x => x.Speed, x => x.Tolerance));
await rw.Cameras.Ensure(real.Camera("41943012").SimulatedBy(Mjpeg.Camera, sim.Preview,
pipeline: "pipelines/sim-camera.gpipe", sinkPort: 17002, boundTo: fr20));
var run = await rw.Programs.Run("AxisThenArm");
await run.ShouldFinishWithin(2.Minutes());
Console.WriteLine(host.Differences.Render());
| Rule | Where |
|---|---|
rw2 is ALWAYS a container; a branch under test is a bin/Debug mounted over /app |
RocketWelderHosting |
A mounted build's machine state never leaks in: plugin path, recordings, FsRoot, repositories are always set |
RocketWelderHosting.Spec |
| A sink a human is meant to see is published on the SAME number — rw2 tells the browser to open it directly | RocketWelderHosting.Spec, RocketWelder.Sink |
Commands are not queries: every Ensure posts, then waits for the READ MODEL |
RwDevices, RwPipelines |
The proof of a camera is a JPEG off its tcpserversink, never rw2's own status |
RwPipelines.WaitServing |
| A value rw2 refuses becomes a stated difference, never a silent default | Substitutions.Keeping, RwDevices.Ensure |
A run is asserted on ProgramExecution-<programId> in the station's own store |
RunHandle |
| Anything this package does not wrap is reached through rw2's own typed client | RocketWelder.Api |
How it matches the station
Real() · EmulatedBy(endpoint) · SimulatedBy(deviceType, endpoint) · .Keeping(x => …) produce both the rw2
registration and a Match, so a twin always says how alike it is:
FR20 simulated Simulator not: the Fairino driver
7th Axis simulated SimulatorTrack not: the FairinoTrack driver, travel, speed, tolerance (rw2 refused: 400 …)
Megmeet simulated SimulatorWeldingMachine not: the MegmeetWeldingMachine_ArtsenPlusPro driver
Plasma simulated SimulatorWeldingMachine not: the FairinoDoWeldingMachine driver
41943012 simulated MjpegCamera calibration kept · not: the Camera driver
The travel, speed, tolerance (rw2 refused: …) line is RW-1: POST /api/peripheral-devices validates against the
registered property types rather than the device type's own schema, so SimulatorTrack's declared TravelMinMm,
MaxSpeedMmPerSecond and ToleranceMm are answered with 400. The device is registered without them and the twin
says so. When RW-1 lands, those three move to kept with no change to a station script.
Only rw2's OWN device types live here (Simulator, SimulatorTrack, SimulatorWeldingMachine,
SimulatorDistanceSensor, MjpegCamera). A vendor's device type is a string in the station's description — this
package never references a vendor package.
Test
dotnet test src/ModelingEvolution.RocketWelder.StationManagement.Tests --filter "Category!=Docker" # pure logic
dotnet test src/ModelingEvolution.RocketWelder.StationManagement.Tests --filter "Category=Docker" # a real station
The Docker suite brings a whole twin up on a developer machine — it needs the rw2 image (20 GB) and
modelingevolution/simulator:local, so it never runs in CI.
Published
Internal feed only (nuget.modelingevolution.com) — never nuget.org. A feature branch publishes
X.Y.Z-preview.<sha> from .github/workflows/preview-station-management-nuget.yml.
No packages depend on ModelingEvolution.RocketWelder.StationManagement.
.NET 10.0
- ModelingEvolution.StationManagement (>= 0.1.0)
- ModelingEvolution.StationManagement.KurrentDb (>= 0.1.0)
- RocketWelder.SDK.Http (>= 2.26.1)
| Version | Downloads | Last updated |
|---|---|---|
| 0.3.1-preview.f72598b12 | 4 | 10/11/2026 |
| 0.3.1-preview.becb30244 | 43 | 10/07/2026 |
| 0.3.1-preview.ab52494fc | 0 | 10/07/2026 |
| 0.3.1-preview.aa0b72dc8 | 0 | 10/11/2026 |
| 0.3.1-preview.7933f6e4b | 0 | 10/07/2026 |
| 0.3.1-preview.52c3c4d2a | 22 | 10/07/2026 |
| 0.3.1-preview.388e4a9ab | 46 | 10/11/2026 |
| 0.3.1-preview.332633ffd | 0 | 10/07/2026 |
| 0.3.0 | 6 | 09/28/2026 |
| 0.2.2-preview.f8d5e697f | 0 | 09/28/2026 |
| 0.2.2-preview.f13421609 | 0 | 09/28/2026 |
| 0.2.2-preview.c7d3e39d3 | 0 | 09/28/2026 |
| 0.2.1 | 2 | 09/25/2026 |
| 0.2.1-preview.8952a5eb | 0 | 09/25/2026 |
| 0.2.1-preview.7da5ea94 | 0 | 09/25/2026 |
| 0.2.1-preview.4ada13b8 | 0 | 09/25/2026 |
| 0.2.1-preview.66486488 | 0 | 09/25/2026 |
| 0.2.0 | 1 | 09/25/2026 |
| 0.1.0-preview.e705254e | 0 | 09/25/2026 |
| 0.1.0-preview.e32fdfa2 | 2 | 09/18/2026 |
| 0.1.0-preview.bcbf4393 | 0 | 09/25/2026 |
| 0.1.0-preview.ae609c75 | 1 | 09/18/2026 |
| 0.1.0-preview.887555e | 0 | 09/18/2026 |
| 0.1.0-preview.81feef9 | 0 | 09/18/2026 |
| 0.1.0-preview.7fcc18f4 | 0 | 09/18/2026 |
| 0.1.0-preview.5f287869 | 1 | 09/18/2026 |
| 0.1.0-preview.2c875b27 | 1 | 09/18/2026 |
| 0.1.0-preview.7093278 | 0 | 09/18/2026 |