Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Core/Memory/CRegion.cs
@@ -11,11 +11,6 @@ public class CRegion : MemoryRegion, IMemoryRegion { /// <summary> /// 标识对象是否已被释放 /// </summary> private bool _disposed = false; /// <summary> /// 区域类型 /// </summary> public override string RegionType => "C"; @@ -26,11 +21,24 @@ private const int CounterSize = 2; /// <summary> /// 计数器数量 /// </summary> public int CounterCount => Size / CounterSize; /// <summary> /// 构造函数 /// </summary> /// <param name="counterCount">计数器数量</param> /// <exception cref="ArgumentOutOfRangeException">当counterCount小于或等于0时抛出</exception> /// <exception cref="OverflowException">当counterCount * CounterSize超出int范围时抛出</exception> public CRegion(int counterCount) : base(counterCount * CounterSize) { if (counterCount <= 0) throw new ArgumentOutOfRangeException(nameof(counterCount), "计数器数量必须大于0"); // 验证没有溢出 if (counterCount > Size / CounterSize) throw new OverflowException($"计数器数量{counterCount}过大,超出内存限制"); } /// <summary> @@ -38,10 +46,15 @@ /// </summary> /// <param name="counterNumber">计数器号(从1开始)</param> /// <returns>计数器值</returns> /// <exception cref="ArgumentOutOfRangeException">当counterNumber为0或超出计数器数量时抛出</exception> public ushort ReadCounter(ushort counterNumber) { if (_disposed) throw new ObjectDisposedException(nameof(CRegion)); if (counterNumber == 0) throw new ArgumentOutOfRangeException(nameof(counterNumber), "计数器号必须大于0(从1开始)"); if (counterNumber > CounterCount) throw new ArgumentOutOfRangeException(nameof(counterNumber), $"计数器号{counterNumber}超出范围,当前计数器总数为{CounterCount}"); ushort offset = (ushort)((counterNumber - 1) * CounterSize); var data = Read(offset, CounterSize); @@ -53,31 +66,19 @@ /// </summary> /// <param name="counterNumber">计数器号(从1开始)</param> /// <param name="value">计数器值</param> /// <exception cref="ArgumentOutOfRangeException">当counterNumber为0或超出计数器数量时抛出</exception> public void WriteCounter(ushort counterNumber, ushort value) { if (_disposed) throw new ObjectDisposedException(nameof(CRegion)); if (counterNumber == 0) throw new ArgumentOutOfRangeException(nameof(counterNumber), "计数器号必须大于0(从1开始)"); if (counterNumber > CounterCount) throw new ArgumentOutOfRangeException(nameof(counterNumber), $"计数器号{counterNumber}超出范围,当前计数器总数为{CounterCount}"); ushort offset = (ushort)((counterNumber - 1) * CounterSize); var data = new byte[] { (byte)(value >> 8), (byte)(value & 0xFF) }; Write(offset, data); } /// <summary> /// 释放资源 /// </summary> /// <param name="disposing">是否正在释放托管资源</param> protected override void Dispose(bool disposing) { if (!_disposed) { if (disposing) { // 释放托管资源 } _disposed = true; } base.Dispose(disposing); } } } Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Core/Memory/IRegion.cs
@@ -10,11 +10,6 @@ public class IRegion : MemoryRegion, IMemoryRegion { /// <summary> /// 标识对象是否已被释放 /// </summary> private bool _disposed = false; /// <summary> /// 区域类型 /// </summary> public override string RegionType => "I"; @@ -35,9 +30,6 @@ /// <returns>位状态(true/false)</returns> public bool ReadBit(ushort byteOffset, byte bitOffset) { if (_disposed) throw new ObjectDisposedException(nameof(IRegion)); if (bitOffset > 7) throw new ArgumentOutOfRangeException(nameof(bitOffset), "位偏移必须在0-7之间"); @@ -63,9 +55,6 @@ /// <param name="value">位值(true/false)</param> public void WriteBit(ushort byteOffset, byte bitOffset, bool value) { if (_disposed) throw new ObjectDisposedException(nameof(IRegion)); if (bitOffset > 7) throw new ArgumentOutOfRangeException(nameof(bitOffset), "位偏移必须在0-7之间"); @@ -84,23 +73,6 @@ { _lock.ExitWriteLock(); } } /// <summary> /// 释放资源 /// </summary> /// <param name="disposing">是否正在释放托管资源</param> protected override void Dispose(bool disposing) { if (!_disposed) { if (disposing) { // 释放托管资源 } _disposed = true; } base.Dispose(disposing); } } } Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Core/Memory/MemoryRegion.cs
@@ -49,6 +49,9 @@ /// </summary> public virtual byte[] Read(ushort offset, ushort length) { if (_disposed) throw new ObjectDisposedException(nameof(MemoryRegion)); _lock.EnterReadLock(); try { @@ -71,6 +74,9 @@ /// </summary> public virtual void Write(ushort offset, byte[] data) { if (_disposed) throw new ObjectDisposedException(nameof(MemoryRegion)); if (data == null) throw new ArgumentNullException(nameof(data)); @@ -94,6 +100,9 @@ /// </summary> public virtual void Clear() { if (_disposed) throw new ObjectDisposedException(nameof(MemoryRegion)); _lock.EnterWriteLock(); try { Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Core/Memory/QRegion.cs
@@ -10,11 +10,6 @@ public class QRegion : MemoryRegion, IMemoryRegion { /// <summary> /// 标识对象是否已被释放 /// </summary> private bool _disposed = false; /// <summary> /// 区域类型 /// </summary> public override string RegionType => "Q"; @@ -35,9 +30,6 @@ /// <returns>位状态(true/false)</returns> public bool ReadBit(ushort byteOffset, byte bitOffset) { if (_disposed) throw new ObjectDisposedException(nameof(QRegion)); if (bitOffset > 7) throw new ArgumentOutOfRangeException(nameof(bitOffset), "位偏移必须在0-7之间"); @@ -63,9 +55,6 @@ /// <param name="value">位值(true/false)</param> 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之间"); @@ -84,23 +73,6 @@ { _lock.ExitWriteLock(); } } /// <summary> /// 释放资源 /// </summary> /// <param name="disposing">是否正在释放托管资源</param> protected override void Dispose(bool disposing) { if (!_disposed) { if (disposing) { // 释放托管资源 } _disposed = true; } base.Dispose(disposing); } } } Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Core/Memory/TRegion.cs
@@ -11,11 +11,6 @@ public class TRegion : MemoryRegion, IMemoryRegion { /// <summary> /// 标识对象是否已被释放 /// </summary> private bool _disposed = false; /// <summary> /// 区域类型 /// </summary> public override string RegionType => "T"; @@ -26,11 +21,24 @@ private const int TimerSize = 2; /// <summary> /// 定时器数量 /// </summary> public int TimerCount => Size / TimerSize; /// <summary> /// 构造函数 /// </summary> /// <param name="timerCount">定时器数量</param> /// <exception cref="ArgumentOutOfRangeException">当timerCount小于或等于0时抛出</exception> /// <exception cref="OverflowException">当timerCount * TimerSize超出int范围时抛出</exception> public TRegion(int timerCount) : base(timerCount * TimerSize) { if (timerCount <= 0) throw new ArgumentOutOfRangeException(nameof(timerCount), "定时器数量必须大于0"); // 验证没有溢出 if (timerCount > Size / TimerSize) throw new OverflowException($"定时器数量{timerCount}过大,超出内存限制"); } /// <summary> @@ -38,10 +46,15 @@ /// </summary> /// <param name="timerNumber">定时器号(从1开始)</param> /// <returns>定时器值(毫秒)</returns> /// <exception cref="ArgumentOutOfRangeException">当timerNumber为0或超出定时器数量时抛出</exception> public ushort ReadTimer(ushort timerNumber) { if (_disposed) throw new ObjectDisposedException(nameof(TRegion)); if (timerNumber == 0) throw new ArgumentOutOfRangeException(nameof(timerNumber), "定时器号必须大于0(从1开始)"); if (timerNumber > TimerCount) throw new ArgumentOutOfRangeException(nameof(timerNumber), $"定时器号{timerNumber}超出范围,当前定时器总数为{TimerCount}"); ushort offset = (ushort)((timerNumber - 1) * TimerSize); var data = Read(offset, TimerSize); @@ -53,31 +66,19 @@ /// </summary> /// <param name="timerNumber">定时器号(从1开始)</param> /// <param name="value">定时器值(毫秒)</param> /// <exception cref="ArgumentOutOfRangeException">当timerNumber为0或超出定时器数量时抛出</exception> public void WriteTimer(ushort timerNumber, ushort value) { if (_disposed) throw new ObjectDisposedException(nameof(TRegion)); if (timerNumber == 0) throw new ArgumentOutOfRangeException(nameof(timerNumber), "定时器号必须大于0(从1开始)"); if (timerNumber > TimerCount) throw new ArgumentOutOfRangeException(nameof(timerNumber), $"定时器号{timerNumber}超出范围,当前定时器总数为{TimerCount}"); ushort offset = (ushort)((timerNumber - 1) * TimerSize); var data = new byte[] { (byte)(value >> 8), (byte)(value & 0xFF) }; Write(offset, data); } /// <summary> /// 释放资源 /// </summary> /// <param name="disposing">是否正在释放托管资源</param> protected override void Dispose(bool disposing) { if (!_disposed) { if (disposing) { // 释放托管资源 } _disposed = true; } base.Dispose(disposing); } } }