using System;
|
using WIDESEAWCS_S7Simulator.Core.Interfaces;
|
|
namespace WIDESEAWCS_S7Simulator.Core.Memory
|
{
|
/// <summary>
|
/// I区(输入区/Input)实现
|
/// 用于模拟西门子S7 PLC的输入过程映像区
|
/// </summary>
|
public class IRegion : MemoryRegion, IMemoryRegion
|
{
|
/// <summary>
|
/// 区域类型
|
/// </summary>
|
public override string RegionType => "I";
|
|
/// <summary>
|
/// 构造函数
|
/// </summary>
|
/// <param name="size">区域大小(字节)</param>
|
public IRegion(int size) : base(size)
|
{
|
}
|
|
/// <summary>
|
/// 读取位
|
/// </summary>
|
/// <param name="byteOffset">字节偏移量</param>
|
/// <param name="bitOffset">位偏移量(0-7)</param>
|
/// <returns>位状态(true/false)</returns>
|
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();
|
}
|
}
|
|
/// <summary>
|
/// 写入位
|
/// </summary>
|
/// <param name="byteOffset">字节偏移量</param>
|
/// <param name="bitOffset">位偏移量(0-7)</param>
|
/// <param name="value">位值(true/false)</param>
|
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();
|
}
|
}
|
}
|
}
|