0c08b152c2
Replace the bare-TCP-only AbCipDriverProbe with a two-phase check: Phase 1 keeps the existing TCP preflight; Phase 2 initialises a LibplctagTagRuntime against the first device to open a real EIP session and CIP Forward Open, so a live-but-rejecting CIP endpoint reads red instead of a false-positive green. Status mapping: ErrorNotFound / ErrorNoMatch / ErrorBadDevice → reachable (controller answered CIP, probe tag absent); ErrorTimeout / ErrorBadConnection / ErrorBadGateway / ErrorWinsock / ErrorOpen / ErrorClose / ErrorRead / ErrorWrite / ErrorBadReply / ErrorRemoteErr / ErrorPartial / ErrorAbort → handshake failed. LibPlcTagException message text is used as a secondary signal for the reachable-exception path. All other statuses default to handshake-failed (conservative). Add AbCipDriverProbeTests: invalid JSON, no devices, malformed host address, closed-port TCP rejection, and black-hole timeout — all offline-determinable. Happy path + CIP-error path covered live against the CIP sim.