Replace the NotSupportedException at AdsTwinCATClient.WriteValueAsync for bit-indexed BOOL writes with a read-modify-write path: 1. Strip the trailing .N selector from the symbol path. 2. Read the parent as UDINT. 3. Set or clear bit N via the standard mask. 4. Write the parent back. Concurrent bit writers against the same parent serialise through a per-parent SemaphoreSlim cached in a ConcurrentDictionary (never removed — bounded by writable-bit-tag cardinality). Mirrors the AbCip / Modbus / FOCAS bit-RMW pattern shipped in #181 pass 1. The path-stripping (TryGetParentSymbolPath) and mask helper (ApplyBit) are exposed as internal statics so tests can pin the pure logic without needing a real ADS target. The FakeTwinCATClient mirrors the same RMW semantics so driver-level round-trip tests assert the parent-word state. Closes #307
5.8 KiB
5.8 KiB