25c0c6f68f
The S7 Plc was opened once in InitializeAsync and never re-opened: a transient PLC reboot / network blip permanently killed the driver until redeploy. Introduce an IS7Plc / IS7PlcFactory seam (mirrors TwinCAT's ITwinCATClientFactory) and a lazy EnsureConnectedAsync that disposes a dead handle and re-opens a fresh connection on the next data call. Reads/writes mark the handle dead on a connection-fatal fault (socket drop / ErrorCode.ConnectionError) but NOT on a data-address error; the probe loop routes through EnsureConnectedAsync as a backstop. The seam also closes the S7 TEST-1 gap — the reconnect state machine is now unit- testable without a live PLC (S7.Net.Plc is sealed with no in-process fake). Verification: - 4 deterministic unit guards (fatal→reopen, data-error→no-reopen, raw socket→reopen, reopen-fail→degrade-then-recover); full S7 unit suite 234/234 green. - LIVE end-to-end proof against real python-snap7 (S7_1500ReconnectTests, double-gated on sim reachability + S7_RECONNECT_BOUNCE_CMD): bounced the container, driver observed the outage and resumed Good reads with NO redeploy. Baseline smoke 3/3 still green.