From eec4c84f34af5b1bf7da4774be13a6d8c27498b6 Mon Sep 17 00:00:00 2001
From: wanshenmean <cathay_xy@163.com>
Date: 星期五, 13 三月 2026 12:31:43 +0800
Subject: [PATCH] feat: add memory region interface and base class

---
 Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Core/Memory/MemoryRegion.cs      |  108 ++++++++++++++++++++++++++++++++++++
 Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Core/Interfaces/IMemoryRegion.cs |   38 ++++++++++++
 2 files changed, 146 insertions(+), 0 deletions(-)

diff --git a/Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Core/Interfaces/IMemoryRegion.cs b/Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Core/Interfaces/IMemoryRegion.cs
new file mode 100644
index 0000000..990ecf5
--- /dev/null
+++ b/Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Core/Interfaces/IMemoryRegion.cs
@@ -0,0 +1,38 @@
+namespace WIDESEAWCS_S7Simulator.Core.Interfaces
+{
+    /// <summary>
+    /// 鍐呭瓨鍖哄煙鎺ュ彛
+    /// </summary>
+    public interface IMemoryRegion
+    {
+        /// <summary>
+        /// 鍖哄煙绫诲瀷锛圡/DB/I/Q/T/C锛�
+        /// </summary>
+        string RegionType { get; }
+
+        /// <summary>
+        /// 鍖哄煙澶у皬锛堝瓧鑺傦級
+        /// </summary>
+        int Size { get; }
+
+        /// <summary>
+        /// 璇诲彇瀛楄妭鏁版嵁
+        /// </summary>
+        /// <param name="offset">鍋忕Щ閲�</param>
+        /// <param name="length">闀垮害</param>
+        /// <returns>瀛楄妭鏁扮粍</returns>
+        byte[] Read(ushort offset, ushort length);
+
+        /// <summary>
+        /// 鍐欏叆瀛楄妭鏁版嵁
+        /// </summary>
+        /// <param name="offset">鍋忕Щ閲�</param>
+        /// <param name="data">鏁版嵁</param>
+        void Write(ushort offset, byte[] data);
+
+        /// <summary>
+        /// 娓呯┖鍖哄煙
+        /// </summary>
+        void Clear();
+    }
+}
diff --git a/Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Core/Memory/MemoryRegion.cs b/Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Core/Memory/MemoryRegion.cs
new file mode 100644
index 0000000..a564cbb
--- /dev/null
+++ b/Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Core/Memory/MemoryRegion.cs
@@ -0,0 +1,108 @@
+using System.Threading;
+using WIDESEAWCS_S7Simulator.Core.Interfaces;
+
+namespace WIDESEAWCS_S7Simulator.Core.Memory
+{
+    /// <summary>
+    /// 鍐呭瓨鍖哄煙鍩虹被
+    /// </summary>
+    public abstract class MemoryRegion : IMemoryRegion
+    {
+        /// <summary>
+        /// 鍐呭瓨鏁版嵁
+        /// </summary>
+        protected readonly byte[] _memory;
+
+        /// <summary>
+        /// 璇诲啓閿侊紙鏀寔骞跺彂璁块棶锛�
+        /// </summary>
+        protected readonly ReaderWriterLockSlim _lock;
+
+        /// <summary>
+        /// 鍖哄煙绫诲瀷
+        /// </summary>
+        public abstract string RegionType { get; }
+
+        /// <summary>
+        /// 鍖哄煙澶у皬锛堝瓧鑺傦級
+        /// </summary>
+        public int Size { get; }
+
+        /// <summary>
+        /// 鏋勯�犲嚱鏁�
+        /// </summary>
+        /// <param name="size">鍖哄煙澶у皬</param>
+        protected MemoryRegion(int size)
+        {
+            Size = size;
+            _memory = new byte[size];
+            _lock = new ReaderWriterLockSlim();
+        }
+
+        /// <summary>
+        /// 璇诲彇瀛楄妭鏁版嵁
+        /// </summary>
+        public virtual byte[] Read(ushort offset, ushort length)
+        {
+            _lock.EnterReadLock();
+            try
+            {
+                if (offset + length > Size)
+                    throw new ArgumentOutOfRangeException(
+                        $"璇诲彇瓒呭嚭{RegionType}鍖鸿寖鍥�: offset={offset}, length={length}, size={Size}");
+
+                byte[] result = new byte[length];
+                Array.Copy(_memory, offset, result, 0, length);
+                return result;
+            }
+            finally
+            {
+                _lock.ExitReadLock();
+            }
+        }
+
+        /// <summary>
+        /// 鍐欏叆瀛楄妭鏁版嵁
+        /// </summary>
+        public virtual void Write(ushort offset, byte[] data)
+        {
+            _lock.EnterWriteLock();
+            try
+            {
+                if (offset + data.Length > Size)
+                    throw new ArgumentOutOfRangeException(
+                        $"鍐欏叆瓒呭嚭{RegionType}鍖鸿寖鍥�: offset={offset}, length={data.Length}, size={Size}");
+
+                Array.Copy(data, 0, _memory, offset, data.Length);
+            }
+            finally
+            {
+                _lock.ExitWriteLock();
+            }
+        }
+
+        /// <summary>
+        /// 娓呯┖鍖哄煙
+        /// </summary>
+        public virtual void Clear()
+        {
+            _lock.EnterWriteLock();
+            try
+            {
+                Array.Clear(_memory, 0, Size);
+            }
+            finally
+            {
+                _lock.ExitWriteLock();
+            }
+        }
+
+        /// <summary>
+        /// 閲婃斁璧勬簮
+        /// </summary>
+        public virtual void Dispose()
+        {
+            _lock?.Dispose();
+        }
+    }
+}

--
Gitblit v1.9.3