using System; using WIDESEAWCS_S7Simulator.Core.Interfaces; namespace WIDESEAWCS_S7Simulator.Core.Memory { /// /// I区(输入区/Input)实现 /// 用于模拟西门子S7 PLC的输入过程映像区 /// public class IRegion : MemoryRegion, IMemoryRegion { /// /// 区域类型 /// public override string RegionType => "I"; /// /// 构造函数 /// /// 区域大小(字节) public IRegion(int size) : base(size) { } /// /// 读取位 /// /// 字节偏移量 /// 位偏移量(0-7) /// 位状态(true/false) public bool ReadBit(ushort byteOffset, byte bitOffset) { if (bitOffset > 7) throw new ArgumentOutOfRangeException(nameof(bitOffset), "位偏移必须在0-7之间"); _lock.EnterReadLock(); try { if (byteOffset >= Size) throw new ArgumentOutOfRangeException(nameof(byteOffset), "字节偏移超出I区范围"); return (_memory[byteOffset] & (1 << bitOffset)) != 0; } finally { _lock.ExitReadLock(); } } /// /// 写入位 /// /// 字节偏移量 /// 位偏移量(0-7) /// 位值(true/false) public void WriteBit(ushort byteOffset, byte bitOffset, bool value) { if (bitOffset > 7) throw new ArgumentOutOfRangeException(nameof(bitOffset), "位偏移必须在0-7之间"); _lock.EnterWriteLock(); try { if (byteOffset >= Size) throw new ArgumentOutOfRangeException(nameof(byteOffset), "字节偏移超出I区范围"); if (value) _memory[byteOffset] |= (byte)(1 << bitOffset); else _memory[byteOffset] &= (byte)~(1 << bitOffset); } finally { _lock.ExitWriteLock(); } } } }