- C# 60.7%
- HTML 21.3%
- CSS 10.2%
- PowerShell 7.8%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
The NGJ MBX autoprober (formerly Autoprober.NewYork) on PhAT and PhAT.Razor: tester protocol, sequences, NGJ16 instance with converted vision jobs, launch calibration training, docs and tools. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> |
||
| Components | ||
| docs | ||
| Galil | ||
| Instances/NGJ16 | ||
| Machine | ||
| Properties | ||
| Sequences | ||
| Tester | ||
| tools | ||
| VisionJobs | ||
| wwwroot | ||
| .editorconfig | ||
| .gitignore | ||
| appsettings.Development.json | ||
| appsettings.json | ||
| Autoprober.Nacogdoches.csproj | ||
| Directory.Build.props | ||
| Directory.Build.targets | ||
| Program.cs | ||
| stage-positions.json | ||
Autoprober.Nacogdoches
The NGJ MBX autoprober on PhAT: a clean reimplementation of NGJ\NGJ16\NGJ.MBX.Autoprober. The
tester connects over TCP and sends LOAD, POCKET, LAUNCH and FLUSH. Each command runs a sequence
(Sequences/*.csx), which drives the Galil stages, the UR carrier handler, the scope's vision and the PNA.
| Doc | |
|---|---|
| tester.md | The tester protocol: commands, replies, errors, stack light |
| sequences.md | Load, Pocket, Launch, Flush: what each does; NgjMachine for scripts |
| setup.md | Settings (Autoprober, Galil, UR, PNA, light), stored positions, vision jobs, before the first run on the machine |
| phat-additions.md | What this app added to PhAT: command server, data listener, network shares, serial, CCS light, UR, Modbus, EtherNet/IP, SCPI, build info |
| plan.md | The survey of the old code and what came over |
Running it
| Profile | Settings | URL |
|---|---|---|
http (desk) |
appsettings.json: everything simulated (stages, handler, PNA, vision, camera, light) |
http://localhost:5197 |
NGJ16 (the machine) |
Instances/NGJ16/appsettings.json replaces appsettings.json |
http://:5197 |
dotnet run --launch-profile http
dotnet run --launch-profile NGJ16
The tester's port is 50000. On the desk it listens on 127.0.0.1 only; on the machine on every interface, which needs a Windows firewall rule for port 50000 (not created by the app).
On this development PC, 50000–50059 is a reserved (administered) port range, and so are several
ranges after it (netsh int ipv4 show excludedportrange protocol=tcp), so the desk setup can't
listen on 50000 there: the log says "Can't listen on 127.0.0.1:50000 ... forbidden by its access
permissions". Pass another port, e.g. --CommandServer:Port 47500.
Standalone or as a Windows service
Like NGJ.MBX.Autoprober, the same build runs standalone or as a service
(PhAT.Hosting.AppHost, see PhAT/build/README-service.md). The web port comes from "Urls" in
the settings file (a service or published exe doesn't read the launch profiles), and each
instance is its own service: Autoprober.Nacogdoches (desk) or Autoprober.Nacogdoches-NGJ16.
PhAT\build\Publish-App.ps1 -Project D:\Workspace\source\Autoprober.Nacogdoches
Autoprober.Nacogdoches.exe --Instance NGJ16
PhAT\build\Install-AppService.ps1 -Name Autoprober.Nacogdoches-NGJ16 -Exe <publish>\Autoprober.Nacogdoches.exe -Arguments '--Instance NGJ16' -Start
The second line runs it standalone; the last one installs it as a service, run as
administrator. Publishing leaves out the files each PC keeps (stage positions, users, page
access, vision jobs, databases, logs), so a new install starts without them: copy
Instances/NGJ16/stage-positions.json and Instances/NGJ16/VisionJobs to the same paths under
the exe's folder (the desk setup's positions are stage-positions.json next to the exe). As a service
the app has no desktop and no mapped drive letters: use UNC paths for network shares, and run it
standalone if a camera SDK needs a logged-in session.
Pages
| Page | Who | |
|---|---|---|
| Autoprober (home) | everyone | Carrier, lid, MSN; where the stages are; tester and handler state; stack light; buttons for Load, Pocket 1–3, Launch Ch1–4, Flush, Home, Maintenance; the connected testers |
| Messages | everyone | Every tester line in and out (the message log) |
| Controller | everyone | Stages, jog, stored positions, actuators, robots, lights |
| Launches | everyone | Every launch with its position, power, MSN and vision image; analysis |
| Engine | engineer | The sequences: run, edit, history and logs (also TrainRatio / TrainOffset, see setup.md) |
| Vision, Vision logs, Templates, Calibration, Camera diagnostics | engineer | PhAT's vision pages |
| Network shares | engineer (passwords: admin) | Connect, disconnect, store passwords |
| Users | admin | Accounts and page access |
The footer shows the motion state, the tester, carrier / lid / MSN, and the version with its build
time (and git commit when built from a repository); GET /buildinfo returns the same as JSON.
Logs
| What | Where |
|---|---|
| Tester lines (SQLite) | MessageLog:DatabasePath (Messages page) |
| Tester lines (text, one file a day) | CommandServer:TextLogFolder |
| Launches | Launches:DatabasePath (Launches page) |
| Positions and plate sensors every 30 s (the old status log) | Autoprober:StatusLogFolder |
| Vision runs (images, results) | the vision log folder (Vision page settings) |
Tested, and not
Tested in desk runs, against simulators in a scratch project (not shipped):
- Galil: two fake DMC-4080s running the NGJ routines (homes, moves, clamp, plates), with active-low sensors.
- UR: a fake controller (Dashboard, RTDE with the command/ack/result handshake, Modbus watchdog).
- PNA: a fake analyser that reports contact.
- Tester: LOAD (with and without a carrier already on the indexer), POCKET, LAUNCH (PNA search on both ports), FLUSH, invalid commands, the busy reply to a second tester, STOP during a launch, and the refusal while STOP is latched.
- Handler errors (the fake UR answering chosen results): no carriers on pick →
DONE; vacuum failed on place →RECOVERABLE,Handler,Failed to secure vacuum on carrier.; output full on FLUSH →RECOVERABLE,Handler,Output stacks are full.; no ack →RECOVERABLE,Handler,Timed out after … waiting for PickInput to finish., with the command cleared so the robot takes the next one. - Vision jobs (converted from the old app), checked against its logged pictures and result
JSONs (
D:\Workspace\data: new_logs Aug–Sep 2026 and old_logs Dec 2025–Aug 2026, up to 300 pictures per old job and outcome, ~10,900 in all):- Reads: every code the old jobs read is read, with the same text (old-set ReadMSN: the old Tesseract reads were often wrong, and the trained OCR's reads checked by eye were right). The combined jobs also read 85–95 % of the old ReadMSNBC/ReadMSN2/3 failures and about half the old ReadLid failures. No read disagrees with another picture of the same sequence.
- Template matches agree within 0.5 px wherever the old run used today's ROI and template; earlier versions of the jobs (other ROIs and templates, Jan–Aug) don't compare.
- LOAD on the fake machine with a logged carrier picture answers the code the old app read.
- Not fixable from the logs: the unread ReadLid pictures are overexposed (bars barely visible), a light or exposure change on the machine.
- Standalone: the published exe, started from another folder, finds its settings and keeps its data in its own folder. Installing it as a service hasn't been tried.
Not tried on the real machine. Check these first:
- the Galil record layout and routines (see MessageLog/docs/galil.md);
- the UR register numbers and stack light outputs;
- the CCS controller's reply format (the parser follows the old code's indices);
- the PNA measurement numbers;
- the sensor polarities (
Autoprober:Inputs); - the vision jobs with live pictures (converted from the old jobs and checked on the old app's logged pictures; see setup.md).