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