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();
}
}
}
}